PL SQL函数抛出错误

时间:2018-02-05 14:55:19

标签: sql oracle oracle12c

这是我的功能

declare

b_date date;
reset_status integer:=0  ;

begin

select lst_reset_dt_tm
into b_date

from TABLE1
where schm_sts in ('READY','NOT READY')
and schm_nm like 'SC%'
  and upper(srvr_nm) = ( select upper(machine)
                  from v$session
                  where program like '%(PMON)%');
select 1
into reset_status
from TABLE1
        where schm_nm = upper('OC1')
        and lst_reset_dt_tm > to_date(b_date, 'mm/dd/yyyy')
  and upper(srvr_nm) = ( select upper(machine)
                  from v$session
                  where program like '%(PMON)%');

 dbms_output.put_line(reset_status);
exception
when no_data_found then
 dbms_output.put_line(reset_status);
end;
/
spool off

当我编译我得到错误 宣布 * 第1行的错误: ORA-01858:找到了一个非数字字符,其中包含数字 ORA-06512:第16行

基本上查询的下半部分是失败的,但这适用于oracle 11g机器但不适用于oracle 12c。任何人都可以帮我调试吗?

1 个答案:

答案 0 :(得分:0)

Kaushik是绝对正确的,这是一个匿名的块,而不是一个函数。也就是说,将数字字段与字符字段进行比较时会发生此错误。我怀疑svr_nm或机器是一个数字字段,我不知道哪个。制作这两个角色将解决您的问题。

或者问题是你的第二个SQL语句,我使用to_char转换所有内容,你只需要做数字字段。尝试运行此SQL并查看它是否有效,如果有效,请删除所有字符字段的TO_CHAR。

DECLARE
    b_date         DATE;
    reset_status   INTEGER := 0;
BEGIN
    SELECT lst_reset_dt_tm
      INTO b_date
      FROM table1
     WHERE schm_sts IN ('READY', 'NOT READY')
       AND schm_nm LIKE 'SC%'
       AND UPPER (TO_CHAR (srvr_nm)) = TO_CHAR (
                                           (SELECT UPPER (machine)
                                              FROM v$session
                                             WHERE program LIKE '%(PMON)%')
                                       );

    SELECT 1
      INTO reset_status
      FROM table1
     WHERE TO_CHAR (schm_nm) = UPPER ('OC1')
       AND lst_reset_dt_tm > TO_DATE (b_date, 'mm/dd/yyyy')
       AND TO_CHAR (UPPER (srvr_nm)) = TO_CHAR (
                                           (SELECT UPPER (machine)
                                              FROM v$session
                                             WHERE program LIKE '%(PMON)%')
                                       );

    DBMS_OUTPUT.put_line (reset_status);
EXCEPTION
    WHEN NO_DATA_FOUND
    THEN
        DBMS_OUTPUT.put_line (reset_status);
END;
/