![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Работа с ораклом через 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_ )
?