Использование Курсора Ref в Oracle SQL Developer
Я использую 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. Спасибо.
ВАД
вот код, который я использовал для вызова моего пакета (сгенерированного 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 ответов
вы можете легко распечатать выходные результаты 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
Если у вас есть процедура, которая требует типа refcursor в подписи прок, можно сделать так:
var rc refcursor;
execute <package>.my_proc(:rc);
print rc;
Выделите и нажмите F5.
в вашем комментарии вы sayHere ошибка:
ORA-06502: PL / SQL: числовое или значение ошибка ORA-06512: в строке 16
Как бы это ни выглядело иногда, ошибки PL/SQL не генерируются случайным образом. Эта ошибка указывает на неправильное преобразование типа данных, которое происходит в строке 16 вашей процедуры. Не видя всей вашей процедуры, мы не можем точно определить линию 16. К счастью, редактор кода в SQL Developer поставит строку номера в канаве; если вы не видите номера строк, вам нужно будет переключить предпочтение.
Что нужно искать строки в число или переменную даты, или количество быть брошенным в поле даты. Это может быть сигнализировано явным TO_NUMBER () или TO_DATE, в этом случае вам нужно проверить маску формата и/или содержимое данных. В качестве альтернативы у вас может быть неявный бросок. В этом случае вам может потребоваться сделать его явным, с соответствующей маской формата. Из конечно, это может быть случайное и нежелательное преобразование, потому что проекция инструкции SELECT не соответствует подписи записи курсора REF. Это легко исправить.
просто сделайте цикл, который повторяется через возвращаемый курсор ref. Вы можете выводить на консоль с помощью DBMS_OUTPUT.PUT_LINE()
и выбор конкретных полей для отображения.
единственное явное значение, которое я вижу в сгенерированной программе, -
P_AS_OF_DT := '31-AUG-2009';
попробуйте явное преобразование (to_date ('31-AUG-2009', 'DD-MON-YYYY')
вместо этого, возможно, это избавляет от проблемы.
Если это не помогает, можете ли вы увидеть, генерируется ли ваша ошибка в sp или в коде yor? Если вы не можете понять это напрямую, определите sp из кода, который у вас есть, установите точку останова и выполните шаг через код, чтобы увидеть, откуда происходит ошибка.
невозможно сказать, не видя, что такое запрос курсора. Взгляните на инструкцию SELECT, выполняемую в процедуре SP. Один из столбцов, который вы выбираете в числовое поле в rec_type, возвращает символьные данные, которые нельзя преобразовать в число.
вместо того, чтобы пытаться выяснить, как вывести курсор, возьмите инструкцию SELECT из sp и запустите ее автономно. Посмотрите на результаты, которые вы получаете. Вы будете искать какую-то не-цифру значения возвращаются в одно из полей, где ожидается число.