Конференция "Базы" » Работа с ораклом через ADOStoredProc
 
  • keymaster © (01.09.08 11:28) [0]
    Есть хранимка, которая первым параметром возвращает курсор.
    AdoStoredProc при попытке сделать Active := True; страшно выдаёт оракловую ошибку invalid number or types of arguments[...]
    AdoDataSet - аналогично.
    Параметр заводил, тип ftVariant, не помогает.
    Если в рантайме сказать parameters.refresh, то получаю сообщение "вызов SetParameterInfo" не выполнен.

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

    D2006, Oracle 10g
  • Правильный$Вася (01.09.08 11:30) [1]
    select * from table( pr_ )
    ?
  • keymaster © (01.09.08 11:43) [2]
    Не...
    PACKAGE_NAME.FUNCTIONNAME(P_ITEMS REF_CUR) RETURN NVARCHAR2;

    Надо этот P_ITEMS получить.
  • Игорь Шевченко © (01.09.08 12:57) [3]
    А ADO умеет REFCURSOR ?
  • keymaster © (01.09.08 13:23) [4]
    Очевидно, что нет.
    Придётся всё на запросах делать.
  • Игорь Шевченко © (01.09.08 14:05) [5]

    > PACKAGE_NAME.FUNCTIONNAME(P_ITEMS REF_CUR) RETURN NVARCHAR2;


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

    Читай http://support.microsoft.com/kb/255043
  • keymaster © (01.09.08 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 © (01.09.08 15:10) [7]
    Очень похоже на оракла. Не знаю, что такое REF_CUR, стандартный тип в нем есть SYS_REFCURSOR. Это и есть курсор. Думаю, ADO должен с ним справиться :)
    Ну а вызов как делаешь?
  • evvcom © (01.09.08 15:11) [8]
    да, есть инфа, что это оракл :)
  • keymaster © (01.09.08 15:14) [9]

    > Не знаю, что такое 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 © (01.09.08 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 © (01.09.08 15:32) [11]
    > и получаю 'identifier P_ITEMS must be declared'
    логично черт побери... в дельфи небось тоже var переменную нужно объявлять до вызова функции... раз уж это не результат функции, а именно переменная передаваемая в нее и в которой возвращается значение.
  • Игорь Шевченко © (01.09.08 15:48) [12]
    А как рекомендовано по ссылке в [5]

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

    ?
  • keymaster © (01.09.08 17:16) [13]

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

    При попытке прочитать что-то из rs (resultset) вываливается сообщение: операция не допускается, если объект закрыт.
  • sniknik © (01.09.08 17:38) [14]
    > операция не допускается, если объект закрыт.
    ну так оно пытается обрабатывать возвращаемое функцией значение... т.е. над NVARCHAR2 которое явно не рекордсет.
    имхо, должно быть так (со ссылкой на безграмотность в оракле)

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

    вот тогда, если поправить синтаксис под оракл конечно, можно будет читать чтото из возвращаемого reсordset-а (опять таки если REF_CUR по сути не чтото другое...)
 
Конференция "Базы" » Работа с ораклом через ADOStoredProc
Есть новые Нет новых   [134473   +28][b:0][p:0.001]