-
Есть хранимка, которая первым параметром возвращает курсор. AdoStoredProc при попытке сделать Active := True; страшно выдаёт оракловую ошибку invalid number or types of arguments[...] AdoDataSet - аналогично. Параметр заводил, тип ftVariant, не помогает. Если в рантайме сказать parameters.refresh, то получаю сообщение "вызов SetParameterInfo" не выполнен.
Задача - получить этот курсор через ADO, не используя сторонние компоненты.
D2006, Oracle 10g
-
select * from table( pr_ ) ?
-
Не... PACKAGE_NAME.FUNCTIONNAME(P_ITEMS REF_CUR) RETURN NVARCHAR2;
Надо этот P_ITEMS получить.
-
А ADO умеет REFCURSOR ?
-
Очевидно, что нет. Придётся всё на запросах делать.
-
-
> Игорь Шевченко © (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;
-
Очень похоже на оракла. Не знаю, что такое REF_CUR, стандартный тип в нем есть SYS_REFCURSOR. Это и есть курсор. Думаю, ADO должен с ним справиться :) Ну а вызов как делаешь?
-
да, есть инфа, что это оракл :)
-
> Не знаю, что такое 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'
-
> 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;" Обрати внимание на параметры с двоеточием!
-
> и получаю 'identifier P_ITEMS must be declared' логично черт побери... в дельфи небось тоже var переменную нужно объявлять до вызова функции... раз уж это не результат функции, а именно переменная передаваемая в нее и в которой возвращается значение.
-
А как рекомендовано по ссылке в [5]
ADOCommand.CommandText := '{call PACKAGE_NAME.FUNCTIONNAME(?)}'
?
-
> ADOCommand.CommandText := '{call PACKAGE_NAME.FUNCTIONNAME(? > )}'
При попытке прочитать что-то из rs (resultset) вываливается сообщение: операция не допускается, если объект закрыт.
-
> операция не допускается, если объект закрыт. ну так оно пытается обрабатывать возвращаемое функцией значение... т.е. над NVARCHAR2 которое явно не рекордсет. имхо, должно быть так (со ссылкой на безграмотность в оракле)
ADOCommand.CommandText := 'DECLARE @rs REF_CUR ' + '{call PACKAGE_NAME.FUNCTIONNAME(@rs)} '+ 'SELECT @rs';
вот тогда, если поправить синтаксис под оракл конечно, можно будет читать чтото из возвращаемого reсordset-а (опять таки если REF_CUR по сути не чтото другое...)
|