Использование Ref Cursor в Oracle SQL Developer - PullRequest
7 голосов
/ 29 октября 2009

Я использую Oracle SQL Developer, но у меня проблема с отображением результатов из пакета, который возвращает курсор ref. Ниже приведено определение пакета:

CREATE OR REPLACE package instance.lswkt_chgoff_recov
as
      type rec_type is record
            (
            source_cd                       lswk_tpr.gltrans.tpr_source_cd%TYPE,
            as_of_dt                        lswk_tpr.gltrans.tpr_as_of_dt%TYPE,
            chrg_off_recov                  varchar2(5),
            process_dt                      lswk_tpr.gltrans.dtgltran%TYPE,
            effect_dt                       lswk_tpr.gltrans.dtgltran%TYPE,
            account_nbr                     lswk_tpr.contract.lcontid%TYPE,
            naics_cd                        lswk_tpr.udfdata.sdata%TYPE,
            prod_type                       varchar2(20),
            off_nbr                         lswk_tpr.schedule.sctrcdty%TYPE,
            borrower_nm                     lswk_tpr.customer.scustnm%TYPE,
            tran_type_cd                    lswk_tpr.gltrans.sglcd%TYPE,
            tran_type_desc                  lswk_tpr.gltrans.sglcd%TYPE,
            tran_amt                        lswk_tpr.gltrans.ctranamt%TYPE,
            note_dt                         lswk_tpr.schedule.dtbk%TYPE,
            accru_cd                        number,
            non_accr_cd                     lswk_tpr.schedule.dtlstincsus%TYPE,
            comm_sb_ind                     varchar2(4)
            );

      type cur_type is ref cursor return rec_type;

      procedure sp
            (
            p_as_of_dt              in      date,
            ref_cur                 in out  cur_type
            );
end;
/

Полагаю, вопрос в том, возможно ли это, и если да, то что мне нужно делать. Я использую Oracle SQL Developer 1.5.5. Спасибо.

Wade

Вот код, который я использовал для вызова своего пакета (сгенерированный TOAD):

DECLARE 
  P_AS_OF_DT DATE;
  REF_CUR instance.LSWKT_CHGOFF_RECOV.CUR_TYPE;
  REF_CUR_row REF_CUR%ROWTYPE;

BEGIN 
  P_AS_OF_DT := '31-AUG-2009';

  instance.LSWKT_CHGOFF_RECOV.SP ( P_AS_OF_DT, REF_CUR );

  DBMS_OUTPUT.Put_Line('REF_CUR =');
  IF REF_CUR%ISOPEN THEN
  DBMS_OUTPUT.Put_Line('  SOURCE_CD  AS_OF_DT  CHRG_OFF_RECOV  PROCESS_DT  EFFECT_DT  ACCOUNT_NBR  NAICS_CD  PROD_TYPE  OFF_NBR  BORROWER_NM  TRAN_TYPE_CD  TRAN_TYPE_DESC  TRAN_AMT  NOTE_DT  ACCRU_CD  NON_ACCR_CD  COMM_SB_IND');
    LOOP
      FETCH REF_CUR INTO REF_CUR_row;
      EXIT WHEN REF_CUR%NOTFOUND;
      DBMS_OUTPUT.Put_Line(
           '  ' || '[TPR_SOURCE_CD%type]'
        || '  ' || '[TPR_AS_OF_DT%type]'
        || '  ' || '''' || REF_CUR_row.CHRG_OFF_RECOV || ''''
        || '  ' || '[DTGLTRAN%type]'
        || '  ' || '[DTGLTRAN%type]'
        || '  ' || '[LCONTID%type]'
        || '  ' || '[SDATA%type]'
        || '  ' || '''' || REF_CUR_row.PROD_TYPE || ''''
        || '  ' || '[SCTRCDTY%type]'
        || '  ' || '[SCUSTNM%type]'
        || '  ' || '[SGLCD%type]'
        || '  ' || '[SGLCD%type]'
        || '  ' || '[CTRANAMT%type]'
        || '  ' || '[DTBK%type]'
        || '  ' || NVL(TO_CHAR(REF_CUR_row.ACCRU_CD), 'NULL')
        || '  ' || '[DTLSTINCSUS%type]'
        || '  ' || '''' || REF_CUR_row.COMM_SB_IND || '''');
    END LOOP;
  ELSE
    DBMS_OUTPUT.Put_line('  (Ref Cursor is closed)');
  END IF;


  COMMIT; 
END;

Я получаю ошибку:

ORA-06502: PL / SQL: ошибка с числовым значением или значением

Надеюсь, это прояснит это немного больше.

Ответы [ 6 ]

13 голосов
/ 03 марта 2010

Вы можете легко распечатать выходные результаты ref_cursor в SQL Developer, чтобы увидеть возвращаемое значение ..

Вот пример функции Refcursor:

create or replace function get_employees() return sys_refcursor as
  ret_cursor sys_refcursor;
begin
  open ret_cursor for
    select * from employees;
  return ret_cursor; 
end get_employees;

Быстрый и грязный метод:

select get_employees() from dual; 

аккуратный метод:

variable v_ref_cursor refcursor;
exec :v_ref_cursor := get_employees(); 
print :v_ref_cursor
8 голосов
/ 01 июня 2011

Если у вас есть процедура, для которой требуется подпись в подписи процедуры, вы можете сделать это:

var rc refcursor;
execute <package>.my_proc(:rc);
print rc;

Выделите и нажмите F5.

1 голос
/ 03 марта 2010

В своем комментарии вы говорите, вот ошибка:

ORA-06502: PL / SQL: числовое или значение ошибка ORA-06512: в строке 16

Как бы то ни было, ошибки PL / SQL не генерируются случайным образом. Эта ошибка указывает на некорректное преобразование типов данных, которое происходит в строке 16 вашей процедуры. Не видя всей вашей процедуры, мы не можем точно определить строку 16. К счастью, редактор кода в SQL Developer поместит номера строк в водосточную трубу; если вы не видите номеров строк, вам нужно переключить предпочтение.

Вам нужно найти строку, приводимую к переменной числа или даты, или число, приводимое к полю даты. Это может быть сигнализировано явным TO_NUMBER () или TO_DATE, и в этом случае вам необходимо проверить маску формата и / или содержимое данных. В качестве альтернативы вы можете иметь неявное приведение. В этом случае вам может потребоваться сделать это явным с соответствующей маской формата. Конечно, это может быть случайное и нежелательное преобразование, потому что проекция инструкции SELECT не совпадает с подписью записи REF CURSOR. Это легко исправить.

1 голос
/ 30 октября 2009

Единственное явное значение, которое я вижу в сгенерированной программе, это

 P_AS_OF_DT := '31-AUG-2009';

Попробуйте явное преобразование (to_date ('31-AUG-2009', 'DD-MON-YYYY') вместо этого, возможно, это избавит от проблемы.

Если это не поможет, вы можете увидеть, сгенерирована ли ваша ошибка в коде sp или in yor? Если вы не можете понять это напрямую, определите sp из кода, который вы имеете, установите точку останова и пошагово пройдитесь по коду, чтобы увидеть, откуда возникла ошибка.

0 голосов
/ 05 ноября 2009

Невозможно определить, не увидев запрос курсора. Посмотрите на оператор SELECT, который вы выполняете в процедуре SP. Один из столбцов, который вы выбираете в числовом поле в rec_type, возвращает символьные данные, которые нельзя преобразовать в число.

Вместо того, чтобы пытаться выяснить, как выводить курсор, возьмите оператор SELECT из sp и запустите его автономно. Посмотрите на результаты, которые вы получите. Вы будете искать некоторые нецифровые значения, возвращающиеся в одно из полей, где вы ожидаете число.

0 голосов
/ 29 октября 2009

Просто создайте цикл, который повторяет возвращаемый курсор ref. Вы можете вывести на консоль, используя DBMS_OUTPUT.PUT_LINE() и выбрав конкретные поля для отображения.

...