将char值传递给函数

时间:2019-08-02 21:42:59

标签: sql oracle

我具有以下功能:

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值传递给函数?

1 个答案:

答案 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对象时,请不要使用双引号。它们只会引起问题。