Oracle SQL Developer中使用参考游标
-
10-07-2019 - |
题
我使用Oracle SQL开发,但我有看到从一个返回引用游标的软件包结果的问题。下面是包定义:
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:数字或值误差
希望这清除它多一点。
解决方案
可以很容易地打印ref_cursor的输出结果在SQL开发者看到的返回值..
下面是一个指针函数的示例:
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
其他提示
如果你有其需要在proc的签名一个指针的过程,则可以做到这一点:
var rc refcursor;
execute <package>.my_proc(:rc);
print rc;
突出显示并击中F5。
这在我所生成的程序看到的唯一显式值是
P_AS_OF_DT := '31-AUG-2009';
尝试一个显式转换(to_date ('31-AUG-2009', 'DD-MON-YYYY')
代替,也许这摆脱了这个问题。
如果没有帮助,你能看到,如果在SP或侑代码生成您的错误?如果你不能直接算出这个,限定从你的代码的SP,设置断点和单步执行代码上看到错误的来源。
在你的评论sayHere是错误:
ORA-06502:PL / SQL:数字或值 错误ORA-06512:在第16行
不管它可能出现像有时,并不随机产生的PL / SQL错误。此错误指向发生在你的程序的第16行一个有缺陷的数据类型转换。没有看到你的整个过程,这是不可能的,我们可以发现线16幸运的代码编辑器在SQL Developer将放在行号在阴沟里;如果您没有看到行号,你将需要切换的偏好。
您需要的是寻找一个字符串被转换为数字或日期变量,或者一些被强制转换为日期字段。这可以通过明TO_NUMBER()或TO_DATE,在这种情况下,你需要检查格式的掩蔽和/或数据内容进行通知。或者你可能有一个隐式转换。在这种情况下,你可能需要使它明确的,用适当的格式掩码。当然,这可能是一个偶然的和不想要的转换,因为SELECT语句的投影不会在REF光标记录的签名相匹配。也就是说容易修复。
只是做一个回路,该回路通过引用游标迭代返回。可以输出到控制台使用DBMS_OUTPUT.PUT_LINE()
并选择特定字段来显示。
有没有办法告诉没有看到游标的查询是什么。看看你的程序SP上运行的SELECT语句。一列的您选择成在rec_type数字字段被返回的字符数据,它不能被转换为数字的。
而不是试图找出光标如何输出,采取从SP SELECT语句并运行它独立。往下看,你得到的结果。你要寻找一些非数字值回来在你期望数量的领域之一。