• nnnicky (16.12.08 12:19) [0]
    Добрый день!
    Есть некая функция, которая вызывается через экшен.
    Делаю так: в компонент OraQuery пишу запрос:

    SELECT *
    FROM TABLE (SVB_NETTING.build_netting_list  
    (
     iNETTINGNUMBER IN NUMBER,
     dDATENETTING IN DATE,
     sUSERCREATE IN VARCHAR2

    ))RETURN RESULT_ERROR_NT

    Соответственно вызываю:
    procedure TfmHBBankNetting.act_BuildListExecute(Sender: TObject);
    begin
     inherited;
    OraQuery.Execute;
    end;

    Нужно сделать: в случае если RESULT_ERROR_NT содержит записи показать в отдельном окне пользователю.
    Вопрос простенький наверно, но что-то пока не пойму как сделать.


  • Кщд (16.12.08 12:44) [1]

    SELECT *
    FROM TABLE (SVB_NETTING.build_netting_list  
    (
    iNETTINGNUMBER IN NUMBER,
    dDATENETTING IN DATE,
    sUSERCREATE IN VARCHAR2

    ))RETURN RESULT_ERROR_NT


    это, простите, чушь
    учите синтаксис
  • Медвежонок Пятачок © (16.12.08 12:48) [2]
    отчего же сразу чушь. эта оракул
  • Кщд (16.12.08 12:52) [3]
    >Медвежонок Пятачок ©   (16.12.08 12:48) [2]
    >отчего же сразу чушь. эта оракул
    настаиваете?)
  • ANB (16.12.08 12:52) [4]

    > отчего же сразу чушь. эта оракул

    Потому и чушь, что оракл.

    Автор :
    1. У тебя в девелопере этот запрос выполняется ?
    2. Если уж хочешь вернуть набор данных, то надо делать Open.
  • Медвежонок Пятачок © (16.12.08 13:05) [5]
    я не пробовал, только визуально разбирал.
    автор просто применяет псевдофункцию тэйбл к коллекции.
  • nnnicky (16.12.08 13:09) [6]
    Это функция из пакета Oracle и она прекрасно работает.
  • Кщд (16.12.08 13:17) [7]
    >nnnicky   (16.12.08 13:09) [6]
    1. не указана версия oracle
    2. не указан тип значения, возвращаемого ф-цией
    3. приведенный Вами синтаксис sql-запроса не существует в природе

    >Медвежонок Пятачок ©   (16.12.08 13:05) [5]
    >автор просто применяет псевдофункцию тэйбл к коллекции.
    sql-level type, pipelined function?
    и это только если поверить в Ваше допущение, что эта ф-ция(если это, действительно, ф-ция:)) возвращает не, например, xmltype)
  • nnnicky (16.12.08 13:17) [8]
    так как же мне выцепить RETURN RESULT_ERROR_NT?
  • nnnicky (16.12.08 13:20) [9]

    > 3. приведенный Вами синтаксис sql-запроса не существует
    > в природе


    Но как-то странным образом прекрасно работает
  • Кщд (16.12.08 13:20) [10]
    >nnnicky   (16.12.08 13:17) [8]
    озвучьте, пожалуйста:
    Кщд   (16.12.08 13:17) [7]
    + тип RETURN RESULT_ERROR_NT
    + компоненты доступа
  • Кщд (16.12.08 13:21) [11]
    >nnnicky   (16.12.08 13:20) [9]
    >Но как-то странным образом прекрасно работает
    в sqlplus работает?)
  • nnnicky (16.12.08 13:24) [12]

    > (если это, действительно, ф-ция:))


    FUNCTION build_banknetting_list  
    (
     iNETTINGNUMBER IN NUMBER,
     dDATENETTING IN DATE,
     sUSERCREATE IN VARCHAR2
     
    ) RETURN RESULT_ERROR_NT
    Нет. вот функция.))  А выше всего лишь способ ее  вызова
  • Кщд (16.12.08 13:28) [13]
    >nnnicky   (16.12.08 13:24) [12]
    >Нет. вот функция.))  А выше всего лишь способ ее  вызова
    ну, дело Ваше)
    успехов
  • nnnicky (16.12.08 13:44) [14]
    1. Oracle 9i
    2. возвращает таблицу (RETURN RESULT_ERROR_NT -  тип)
    3. компоненты OraQuery oraDataSource
  • Кщд (16.12.08 13:54) [15]
    >nnnicky   (16.12.08 13:44) [14]
    >1. Oracle 9i
    уже легче

    >2. возвращает таблицу (RETURN RESULT_ERROR_NT -  тип)
    дефиницию типа привести не в состоянии?

    >3. компоненты OraQuery oraDataSource
    вероятно, это ODAC?
  • nnnicky (16.12.08 14:54) [16]
    2. TYPE  RESULT_ERROR_T AS OBJECT(
     CODE         NUMBER(5,0),
     DESCRIPTOIN  VARCHAR2(255),
     PARAM1       VARCHAR2(255),  
     PARAM2       VARCHAR2(255),  
     PARAM3       VARCHAR2(255),  
     CONSTRUCTOR FUNCTION RESULT_ERROR_T RETURN SELF AS RESULT
    );

    3. ODAC
  • Медвежонок Пятачок © (16.12.08 15:27) [17]
    опять по памяти нет под рукой сервера.

    нужно тритить объект к типу и затем уже обращаться к атрибутам
  • ANB (16.12.08 17:17) [18]

    > Нет. вот функция.))  А выше всего лишь способ ее  вызова

    Смущает меня такой способ вызова. И вряд ли он и из пакета работать будет.
    Функция даже не пипелайновая, т.е. вертает просто рекорд.
    Из клиента такую вызвать весьма непросто.
    По любому как минимум безымянный блок нужен.
  • Petr V. Abramov © (16.12.08 19:50) [19]
    SELECT *
    FROM TABLE (SVB_NETTING.build_netting_list  
    (
    :i ,
    :d ,
    :s
    ))

    должно на ура сработать
  • Кщд (17.12.08 11:37) [20]
    >Petr V. Abramov ©   (16.12.08 19:50) [19]
    в 9i точно не нужно явно приводить к типу результата?
  • ANB (17.12.08 12:16) [21]
    create or replace type HCF_RESULT_ERROR_T as object
    (
    CODE         number(5,0),
    DESCRIPTOIN  varchar2(255),
    PARAM1       varchar2(255),  
    PARAM2       varchar2(255),  
    PARAM3       varchar2(255),  
    CONSTRUCTOR function HCF_RESULT_ERROR_T return SELF as RESULT
    )

    create or replace function build_banknetting_list  
    return HCF_RESULT_ERROR_T
    is
     v_HCF_RESULT_ERROR_T HCF_RESULT_ERROR_T;
    begin
     v_HCF_RESULT_ERROR_T := HCF_RESULT_ERROR_T;
     v_HCF_RESULT_ERROR_T.CODE := 1;
     v_HCF_RESULT_ERROR_T.DESCRIPTOIN := 'F1';
     v_HCF_RESULT_ERROR_T.PARAM1 := 'F2';
     v_HCF_RESULT_ERROR_T.PARAM2 := 'F3';
     v_HCF_RESULT_ERROR_T.PARAM3 := 'F4';
     return v_HCF_RESULT_ERROR_T;
    end;

    select * from table(build_banknetting_list()) - не ботает.
  • Кщд (17.12.08 14:08) [22]
    >select * from table(build_banknetting_list()) - не ботает.

    create type HCF_RESULT_ERROR_NT as table of HCF_RESULT_ERROR_T;




    create or replace function build_banknetting_list  
    return HCF_RESULT_ERROR_NT
    is
    ...




    select * from table(build_banknetting_list());

  • nnnicky (17.12.08 15:10) [23]
    SELECT *
    FROM TABLE (SVB_NETTING.build_banknetting_list  
    (
     10,
     '08.12.2008',
     'KEP'
    ))   RETURN RESULT_ERROR_NT
  • ANB (17.12.08 15:37) [24]

    > SELECT *
    > FROM TABLE (SVB_NETTING.build_banknetting_list  
    > (
    >  10,
    >  '08.12.2008',
    >  'KEP'
    > ))   RETURN RESULT_ERROR_NT

     RETURN RESULT_ERROR_NT - зачем это ?
  • ANB (17.12.08 15:39) [25]

    > nnnicky   (17.12.08 15:10) [23]

    Прежде, чем пихать запрос в клиента - сначала добейся, чтобы он работал из девелопера.
  • ANB (17.12.08 15:42) [26]

    > Кщд   (17.12.08 14:08) [22]

    А середку функции ?
  • nnnicky (17.12.08 16:02) [27]
    товарищи, в девелопере он работает и возвращает данные. Мне нужно функцию из Delphi вызывать.

    FUNCTION build_banknetting_list  
    (
     iNETTINGNUMBER IN NUMBER,
     dDATENETTING IN DATE,
     sUSERCREATE IN VARCHAR2
     
    ) RETURN RESULT_ERROR_NT
    IS
    retval RESULT_ERROR_NT := RESULT_ERROR_NT();
    ErrorRec RESULT_ERROR_T := NEW RESULT_ERROR_T;
    BEGIN

    FOR nrec IN (
                    SELECT BL.ID,
                           BL.CUSTID,
                           BL.BANKNAME,
                           BL.ID_SVB_GROUPTYPELIST,
                           GTLD.DAYSTART,
                           GTLD.DAYEND                  
                      FROM SVB_BANKLIST BL
                      INNER JOIN SVB_GROUPTYPELIST GTL
                         ON BL.ID_SVB_GROUPTYPELIST = GTL.ID
                      INNER JOIN SVB_GROUPTYPELISTDAYS GTLD
                         ON GTL.ID = GTLD.ID_SVB_GROUPTYPELIST
                     WHERE GTLD.DAYNUMBER = to_char(dDATENETTING,'D')  
                )
     LOOP  
       ErrorRec := SVB_BLIZKO_NETTING_LIB.ADD_BANK_TO_BANKNETTING (
                                       iNETTINGNUMBER ,
                                       nrec.ID ,
                                       dDATENETTING ,
                                       nrec.DAYSTART,
                                       nrec.DAYEND,  
                                       sUSERCREATE ,
                                       nrec.CUSTID,
                                       nrec.BANKNAME
                                                                   );
       IF ErrorRec.CODE IS NOT NULL
       THEN BEGIN                              
              retval.extend;
              retval(retval.last) := ErrorRec;
            END;
       END IF;                                      
                                   

     END LOOP;
     RETURN retval;
    END build_banknetting_list;

  • ANB (17.12.08 17:53) [28]

    > товарищи, в девелопере он работает и возвращает данные.

    С ретурном работает ? И вертает набор данных ?
  • Petr V. Abramov © (17.12.08 23:26) [29]

    > nnnicky   (17.12.08 16:02) [27]

    поубивал би

    > ANB   (17.12.08 17:53) [28]

    а че в девелопере не работать, test на ф-ции, девелопер и сгенерит скрипт.
  • Кщд (18.12.08 07:46) [30]
    >nnnicky   (17.12.08 15:10) [23]
    Вам ещё в Petr V. Abramov ©   (16.12.08 19:50) [19] всё сказали
  • Кщд (18.12.08 08:05) [31]
    >Petr V. Abramov ©   (17.12.08 23:26) [29]
    >поубивал би
    вполне нормальная ситуация для специализированного фреймворка
    работает не самым быстрым образом - зато надежно
  • Petr V. Abramov © (18.12.08 13:45) [32]

    > Кщд   (18.12.08 08:05) [31]

    вполне нормальная ситуация для незнания синтаксиса, это все одним селектом делается
  • Petr V. Abramov © (18.12.08 16:55) [33]
    а может, я и погорячился, переключений контекста меньше.
    но
    > IF ErrorRec.CODE IS NOT NULL
    >    THEN BEGIN                            
    >           retval.extend;
    >           retval(retval.last) := ErrorRec;
    >         END;
    >    END IF;

    улыбает :)
  • nnnicky (18.12.08 17:29) [34]

    > улыбает :)


    чем же вас так улыбнуло?
  • Petr V. Abramov © (18.12.08 17:51) [35]

    > nnnicky   (18.12.08 17:29) [34]

    не нужен там begin ... end, чай не паскаль.
    и for nrec ... loop крутить ни к чему, select ... bulk collect into быстрее, если записей немного, если много, то fetch ... bulk collect into limit N
  • Кщд (19.12.08 10:50) [36]
    >Petr V. Abramov ©   (18.12.08 17:51) [35]
    >не нужен там begin ... end, чай не паскаль.
    но на производительность-таки этот анонимный блок не влияет)

    >select ... bulk collect into быстрее
    мне совсем не верится, что автор привел реальный код ф-ции и в цикле нет exit when.
    иначе, не совсем понятно, а зачем, собственно, нужна такая ф-ция?

    если придираться по-серьезному, то больше улыбает оптимизм решений на create type, поддержку которого oracle задекларировал, видимо, в чисто маркетинговых целях, т.к. до сих пор нет корректной поддержки работы с ним
    и отдельный большой привет тем системам, что начали использовать наследование таких объектов в oracle
  • Petr V. Abramov © (19.12.08 11:19) [37]

    > Кщд   (19.12.08 10:50) [36]


    > если придираться по-серьезному, то больше улыбает оптимизм
    > решений на create type,

    в 10-ке все очень культурно-мультурно работает, фактическ ине реализованы только foreign ключи на поля подтипов. В 8-ке, да, была жесть с объектными типами, 9-ку я пропустил.
  • Кщд (19.12.08 14:10) [38]
    >в 10-ке все очень культурно-мультурно работает
    даже в 10-ке при изменении базового типа необходимо дропать ВСЁ дерево наследований и прокатывать заново
    не дай боже поставить final-тип в качестве поля таблицы...
    а без этого сам смысл использования теряется - проще пользоваться pipelined + pl/sql collections
    т.е. как не было вменяемой поддержки типов, так и нет
    и, судя по metalink, и не предвидится
  • Petr V. Abramov © (19.12.08 14:45) [39]

    > Кщд   (19.12.08 14:10) [38]

    >при изменении базового типа необходимо дропать ВСЁ дерево наследований > и прокатывать заново
    не надо, alter type нормально работает, по крайней мере, на добавление атрибутов

    > не дай боже поставить final-тип в качестве поля таблицы...
    а что будет?
  • Кщд (22.12.08 10:08) [40]
    >Petr V. Abramov ©   (19.12.08 14:45) [39]
    >не надо, alter type нормально работает, по крайней мере, на добавление атрибутов
    с добавлением всё в порядке - cascade или invalidate - и вперед
    проблемы начинаются с drop attribute и целой череды ограничений, связанных с ним

    плюс к этому до сих нерешенная проблема с одноименными типами в разных схемах одного инстанса
    всё это, конечно, обходится, но желание задействовать ООП механизм Oracle в продуктиве уменьшает до нуля
  • Petr V. Abramov © (22.12.08 16:45) [41]

    > Кщд   (22.12.08 10:08) [40]

    так и drop column только аж в 8-й версии появилось.
    я использую, от кучи другого гимра избавляет
  • nnnicky (24.12.08 12:11) [42]
    SELECT *
    FROM TABLE (SVB_BLIZKO_NETTING.build_banknetting_list  
    ( :NETTINGNUMBER,
     :DATENETTING,
      user
    ))




    dsHB.Params[0].AsNumber := 10;
    dsHB.Params[1].AsDate := 08-12-2008;



    Не работают параметры... Тип Number и Date. Когда явно указываю значения - все ок. А так говорит нет таких данных
  • Кщд (24.12.08 12:35) [43]
    >nnnicky   (24.12.08 12:11) [42]
    приводите оригинальный текст ошибки

    >dsHB.Params[1].AsDate := '08-12-2008';
    передавайте дату, а не строку
  • sniknik © (24.12.08 12:47) [44]
    > передавайте дату, а не строку
    у него не строка вообще то, насколько вижу, а число, результат странных вычислений...
  • nnnicky (24.12.08 15:13) [45]
    ORA - 22905: Cannot access rows from a non-nested table item
  • nnnicky (24.12.08 15:18) [46]
    ORA-22905 cannot access rows from a non-nested table item

    Cause: An attempt was made to access rows of an item whose type is not known at parse time or that is not of a nested table type.

    Action: Use CAST to cast the item to a nested table type.



    Так и в таблице такой тип....
  • Petr V. Abramov © (24.12.08 16:11) [47]
    это связано с параметрами или нет???
  • nnnicky (24.12.08 16:19) [48]
    ошибка возникает при использовании параметров... Ну по всякому уже и всеравно никак :(
  • Кщд (25.12.08 08:03) [49]
    >nnnicky   (24.12.08 12:11) [42]


    SELECT *
    FROM TABLE (cast(SVB_BLIZKO_NETTING.build_banknetting_list  
    ( :NETTINGNUMBER,
    :DATENETTING,
     user
    ) as YourFunctionsType))

  • nnnicky (25.12.08 16:16) [50]
    procedure  TfmHBListBank.Set_DataSet(bActive : Boolean);
    var  iID : integer;
    iData : STRING;
    i   : integer;
    iSelectedCount : integer;
    begin
    iSelectedCount := fmHBBankNetting.gBaseDBtv.Controller.SelectedRecordCount;
    if iSelectedCount < 1 then exit;
     if iSelectedCount > 0 then
     begin
    for i := 0 to iSelectedCount -1 do
    iID := fmHBBankNetting.gBaseDBtv.Controller.SelectedRecords[i].Values[fmHBBankNetting.g BaseDBtv.GetColumnByFieldName('ID').Index];
    DSHB.ParamByName('NETTINGNUMBER').AsInteger := iID ;
    end;



    Параметры из другой таблицы... Нужно выбором строки из Grida их читать. Т.е. выбираем строку с параметрами, жмем кнопку и вызываем процедуру.  Параметры не видит...
  • Petr V. Abramov © (25.12.08 17:35) [51]

    > nnnicky   (25.12.08 16:16) [50]

    оттестируй запрос с параметрами в pl/sql developer, потм будем с "выбором строки из Grida их читать" разбираться
  • nnnicky (26.12.08 11:01) [52]

    > оттестируй запрос с параметрами в pl/sql developer, потм
    > будем с "выбором строки из Grida их читать" разбираться


    работает
  • nnnicky (30.12.08 09:02) [53]
    тема открыта... работает в developer всего лишь... )
Есть новые Нет новых   [134477   +39][b:0][p:0.004]