我正在使用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。感谢。
瓦德
以下是我用来调用我的包(由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:数字或值错误
希望这会让它更加清晰。
答案 0 :(得分:12)
您可以在SQL Developer中轻松打印ref_cursor的输出结果,以查看返回值..
这是一个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
答案 1 :(得分:8)
如果你有一个程序需要在proc的签名中使用refcursor,你可以这样做:
var rc refcursor;
execute <package>.my_proc(:rc);
print rc;
突出显示并点击F5。
答案 2 :(得分:1)
在你的评论中,你说这是错误:
ORA-06502:PL / SQL:数字或值 错误ORA-06512:第16行
无论有时出现什么样的情况,PL / SQL错误都不是随机生成的。此错误指向在您的过程的第16行发生的有缺陷的数据类型转换。在没有看到整个过程的情况下,我们无法确定第16行。幸运的是,SQL Developer中的代码编辑器会将行号放在阴沟中;如果您没有看到行号,则需要切换首选项。
您需要查找的是将字符串强制转换为数字或日期变量,或者将数字强制转换为日期字段。这可以通过显式TO_NUMBER()或TO_DATE来发出信号,在这种情况下,您需要检查格式掩码和/或数据内容。或者,您可能有隐式演员表。在这种情况下,您可能需要使用适当的格式掩码使其显式化。当然,这可能是意外和不需要的转换,因为SELECT语句的投影与REF CURSOR记录的签名不匹配。这很容易解决。
答案 3 :(得分:0)
只需循环遍历返回的引用游标。您可以使用DBMS_OUTPUT.PUT_LINE()
输出到控制台并选择要显示的特定字段。
答案 4 :(得分:0)
我在生成的程序中看到的唯一显式值是
P_AS_OF_DT := '31-AUG-2009';
尝试进行显式转换(to_date ('31-AUG-2009', 'DD-MON-YYYY')
,或许可以解决问题。
如果这没有帮助,你能看到你的错误是在sp或yor代码中生成的吗?如果您无法直接解决这个问题,请从您拥有的代码中定义一个sp,设置一个断点并逐步执行代码以查看错误的来源。
答案 5 :(得分:0)
没有看到光标的查询是什么,没有办法告诉。看一下您在SP过程中运行的SELECT语句。您在rec_type中选择数字字段的其中一列是返回字符数据,无法将其转换为数字。
不要试图弄清楚如何输出游标,而是从sp获取SELECT语句并单独运行它。向下看你得到的结果。您将在一个预期数字的字段中查找一些非数字值。