我具有以下功能:
CREATE OR REPLACE FUNCTION BANINST1."F_COC_AUTO_AWARD_FILTER" (pidm number) return number
as
return_field number;
cursor get_pidm is
select distinct SHRDGMR.SHRDGMR_PIDM
from SATURN.SHRDGMR SHRDGMR,
SATURN.SORLCUR SORLCUR,
SATURN.SORLFOS SORLFOS,
DWSCHEMA.DAP_AUDIT_DTL@LINKDWTEST
where SORLCUR.SORLCUR_PIDM = SHRDGMR.SHRDGMR_PIDM
and SORLFOS.SORLFOS_PIDM = SORLCUR.SORLCUR_PIDM
and SORLCUR.SORLCUR_LEVL_CODE = SHRDGMR.SHRDGMR_LEVL_CODE
and SORLCUR.SORLCUR_DEGC_CODE = SHRDGMR.SHRDGMR_DEGC_CODE
and SORLFOS.SORLFOS_TERM_CODE = SORLCUR.SORLCUR_TERM_CODE
and SHRDGMR.SHRDGMR_PIDM = pidm
and SHRDGMR.SHRDGMR_DEGS_CODE = 'AW'
and SORLCUR.SORLCUR_PROGRAM in ('STCC', 'CC')
and DWSCHEMA.DAP_AUDIT_DTL.DAP_DEGREE in ('CPCC-CDS', 'CC1-CDS', 'CC2-CDS')
and SORLFOS.SORLFOS_MAJR_CODE <> DWSCHEMA.DAP_AUDIT_DTL.DAP_AUD_VALUE2
and trim(DWSCHEMA.DAP_AUDIT_DTL.DAP_STU_ID) = (select spriden_id from spriden where spriden_pidm = pidm and spriden_change_ind is null);
begin
open get_pidm;
fetch get_pidm into return_field;
close get_pidm;
return return_field;
end;
/
这是where子句对函数的调用:
baninst1.f_coc_auto_award_filter@test(RAD_PRIMARY_MST.RAD_USER_DEF1) is not null
该函数接受数字数据类型参数。
传递的列RAD_PRIMARY_MST.RAD_USER_DEF1是char(12)数据类型,其值如293858。
调用该函数时,将返回以下错误:ORA-01722:无效的数字
我试图通过几种不同的方式将数字值传递给函数:
baninst1.f_coc_auto_award_filter@test(to_number(trim(RAD_PRIMARY_MST.RAD_USER_DEF1))) is not null
baninst1.f_coc_auto_award_filter@test(cast(RAD_PRIMARY_MST.RAD_USER_DEF1 as number(8))) is not null
所有尝试均返回相同的错误ORA-01722:无效数字
如果我将D_PRIMARY_MST.RAD_USER_DEF1值硬编码为一个数字,则该函数调用有效。
baninst1.f_coc_auto_award_filter@test(293858) is not null
如何将RAD_PRIMARY_MST.RAD_USER_DEF1中的char值传递给函数?
答案 0 :(得分:0)
这可能是关键字:
例如 293858
您确定该列中没有任何非数字值吗?对于该数据类型(char
),始终存在疑问。如果您要在其中存储数字,为什么不number
?
此查询应返回导致代码中断的无效值。
select * from d_primary_mst where not regexp_like(rad_user_def1, '^\d+$')
此外,如果要传递字符串,为什么要强制该函数接受数字?你为什么不
CREATE OR REPLACE FUNCTION BANINST1.F_COC_AUTO_AWARD_FILTER
(pidm RAD_PRIMARY_MST.RAD_USER_DEF1%type)
return SHRDGMR.SHRDGMR_PIDM%type
as
return_field SHRDGMR.SHRDGMR_PIDM%type;
cursor get_pidm is
select distinct SHRDGMR.SHRDGMR_PIDM ...
顺便说一句,在创建Oracle对象时,请不要使用双引号。它们只会引起问题。