2009-10-29 9 views
7

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

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

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

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: числовые или значение погрешности

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

+0

Все, что я вижу, это spc - где bdy? –

+0

Какой у вас вопрос? – kurosch

+0

Проблема, с которой я сталкиваюсь, заключается в том, что когда я пытаюсь прочитать курсор ref, я получаю ошибки. Я поместил spc только для того, чтобы показать, как выглядит мой реф, и, надеюсь, кто-то может показать мне код PL/SQL для запуска в SQL Developer для его вывода. – Wade73

ответ

12

Вы можете легко распечатать результаты, полученные с 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 
0

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

+0

Я сделал модификацию выше, так как это, похоже, не работает. – Wade73

0

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

P_AS_OF_DT := '31-AUG-2009'; 

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

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

0

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

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

1

В вашем комментарии вы sayHere это ошибка:

ORA-06502: PL/SQL: numeric or value error ORA-06512: at line 16

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

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

8

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

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

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

Смежные вопросы