这是我的功能
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。任何人都可以帮我调试吗?
答案 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;
/