Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Работа с ораклом через ADOStoredProc


keymaster ©   (2008-09-01 11:28:00) 

Есть хранимка, которая первым параметром возвращает курсор.
AdoStoredProc при попытке сделать Active := True; страшно выдаёт оракловую ошибку invalid number or types of arguments[...]
AdoDataSet - аналогично.
Параметр заводил, тип ftVariant, не помогает.
Если в рантайме сказать parameters.refresh, то получаю сообщение "вызов SetParameterInfo" не выполнен.

Задача - получить этот курсор через ADO, не используя сторонние компоненты.

D2006, Oracle 10g


sniknik   (2008-09-01 17:38:00) [1]

> операция не допускается, если объект закрыт.
ну так оно пытается обрабатывать возвращаемое функцией значение... т.е. над NVARCHAR2 которое явно не рекордсет.
имхо, должно быть так (со ссылкой на безграмотность в оракле)

ADOCommand.CommandText :=
 'DECLARE @rs REF_CUR ' +
 '{call PACKAGE_NAME.FUNCTIONNAME(@rs)} '+
 'SELECT @rs';

вот тогда, если поправить синтаксис под оракл конечно, можно будет читать чтото из возвращаемого reсordset-а (опять таки если REF_CUR по сути не чтото другое...)


keymaster   (2008-09-01 17:16:00) [2]


> ADOCommand.CommandText := '{call PACKAGE_NAME.FUNCTIONNAME(?
> )}'

При попытке прочитать что-то из rs (resultset) вываливается сообщение: операция не допускается, если объект закрыт.


Игорь Шевченко   (2008-09-01 15:48:00) [3]

А как рекомендовано по ссылке в [5]

ADOCommand.CommandText := '{call PACKAGE_NAME.FUNCTIONNAME(?)}'

?


evvcom   (2008-09-01 15:32:00) [4]


> type ref_cur is ref cursor;

я уже писал, есть SYS_REFCURSOR. Убирай свою декларацию и соответственно лишнюю зависимость остальной части кода (хранимок, наверное) от своего пакета.

> AdoStoredProc

Какая StoredProc? У тебя же функция! Или меняй декларацию на create or replace procedure или вызывай как функцию.

> {call PACKAGE_NAME.FUNCTIONNAME(P_ITEMS)}

что такое {}? Я функции вызываю так "begin :Result := PACKAGE_NAME.FUNCTIONNAME(:P_ITEMS); end;" Обрати внимание на параметры с двоеточием!


sniknik   (2008-09-01 15:32:00) [5]

> и получаю 'identifier P_ITEMS must be declared'
логично черт побери... в дельфи небось тоже var переменную нужно объявлять до вызова функции... раз уж это не результат функции, а именно переменная передаваемая в нее и в которой возвращается значение.


keymaster   (2008-09-01 15:14:00) [6]


> Не знаю, что такое REF_CUR

type ref_cur is ref cursor;

> Ну а вызов как делаешь?

По разному.
В начале было просто AdoStoredProc.Active := True;

Сейчас  -
ADOCommand.CommandText := '{call PACKAGE_NAME.FUNCTIONNAME(P_ITEMS)}'
и получаю 'identifier P_ITEMS must be declared'


evvcom   (2008-09-01 15:11:00) [7]

да, есть инфа, что это оракл :)


evvcom   (2008-09-01 15:10:00) [8]

Очень похоже на оракла. Не знаю, что такое REF_CUR, стандартный тип в нем есть SYS_REFCURSOR. Это и есть курсор. Думаю, ADO должен с ним справиться :)
Ну а вызов как делаешь?


keymaster   (2008-09-01 14:16:00) [9]


> Игорь Шевченко ©   (01.09.08 14:05) [5]
> > PACKAGE_NAME.FUNCTIONNAME(P_ITEMS REF_CUR) RETURN NVARCHAR2;
>

Неточно переписал...
Правильно так:
PACKAGE_NAME.FUNCTIONNAME(P_ITEMS  OUT REF_CUR) RETURN NVARCHAR2;


Игорь Шевченко   (2008-09-01 14:05:00) [10]


> PACKAGE_NAME.FUNCTIONNAME(P_ITEMS REF_CUR) RETURN NVARCHAR2;


Э...а где написано, что она возвращает курсор ?

Читай http://support.microsoft.com/kb/255043


keymaster   (2008-09-01 13:23:00) [11]

Очевидно, что нет.
Придётся всё на запросах делать.


Игорь Шевченко   (2008-09-01 12:57:00) [12]

А ADO умеет REFCURSOR ?


keymaster   (2008-09-01 11:43:00) [13]

Не...
PACKAGE_NAME.FUNCTIONNAME(P_ITEMS REF_CUR) RETURN NVARCHAR2;

Надо этот P_ITEMS получить.


Правильный$Вася   (2008-09-01 11:30:00) [14]

select * from table( pr_ )
?


Наверх

Титульная страница Поиск, карта сайта Написать письмо