Форум: "Базы";
Текущий архив: 2009.04.26;
Скачать: [xml.tar.bz2];
ВнизРабота с ораклом через ADOStoredProc Найти похожие ветки
← →
keymaster © (2008-09-01 11:28) [0]Есть хранимка, которая первым параметром возвращает курсор.
AdoStoredProc при попытке сделать Active := True; страшно выдаёт оракловую ошибку invalid number or types of arguments[...]
AdoDataSet - аналогично.
Параметр заводил, тип ftVariant, не помогает.
Если в рантайме сказать parameters.refresh, то получаю сообщение "вызов SetParameterInfo" не выполнен.
Задача - получить этот курсор через ADO, не используя сторонние компоненты.
D2006, Oracle 10g
← →
Правильный$Вася (2008-09-01 11:30) [1]select * from table( pr_ )
?
← →
keymaster © (2008-09-01 11:43) [2]Не...
PACKAGE_NAME.FUNCTIONNAME(P_ITEMS REF_CUR) RETURN NVARCHAR2;
Надо этот P_ITEMS получить.
← →
Игорь Шевченко © (2008-09-01 12:57) [3]А ADO умеет REFCURSOR ?
← →
keymaster © (2008-09-01 13:23) [4]Очевидно, что нет.
Придётся всё на запросах делать.
← →
Игорь Шевченко © (2008-09-01 14:05) [5]
> PACKAGE_NAME.FUNCTIONNAME(P_ITEMS REF_CUR) RETURN NVARCHAR2;
Э...а где написано, что она возвращает курсор ?
Читай http://support.microsoft.com/kb/255043
← →
keymaster © (2008-09-01 14:16) [6]
> Игорь Шевченко © (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;
← →
evvcom © (2008-09-01 15:10) [7]Очень похоже на оракла. Не знаю, что такое REF_CUR, стандартный тип в нем есть SYS_REFCURSOR. Это и есть курсор. Думаю, ADO должен с ним справиться :)
Ну а вызов как делаешь?
← →
evvcom © (2008-09-01 15:11) [8]да, есть инфа, что это оракл :)
← →
keymaster © (2008-09-01 15:14) [9]
> Не знаю, что такое REF_CURtype 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:32) [10]
>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) [11]> и получаю "identifier P_ITEMS must be declared"
логично черт побери... в дельфи небось тоже var переменную нужно объявлять до вызова функции... раз уж это не результат функции, а именно переменная передаваемая в нее и в которой возвращается значение.
← →
Игорь Шевченко © (2008-09-01 15:48) [12]А как рекомендовано по ссылке в [5]
ADOCommand.CommandText := "{call PACKAGE_NAME.FUNCTIONNAME(?)}"
?
← →
keymaster © (2008-09-01 17:16) [13]
> ADOCommand.CommandText := "{call PACKAGE_NAME.FUNCTIONNAME(?
> )}"
При попытке прочитать что-то из rs (resultset) вываливается сообщение: операция не допускается, если объект закрыт.
← →
sniknik © (2008-09-01 17:38) [14]> операция не допускается, если объект закрыт.
ну так оно пытается обрабатывать возвращаемое функцией значение... т.е. над NVARCHAR2 которое явно не рекордсет.
имхо, должно быть так (со ссылкой на безграмотность в оракле)
ADOCommand.CommandText :=
"DECLARE @rs REF_CUR " +
"{call PACKAGE_NAME.FUNCTIONNAME(@rs)} "+
"SELECT @rs";
вот тогда, если поправить синтаксис под оракл конечно, можно будет читать чтото из возвращаемого reсordset-а (опять таки если REF_CUR по сути не чтото другое...)
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2009.04.26;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.005 c