【问题标题】:PL SQL Function throws errorPL SQL 函数抛出错误
【发布时间】:2018-02-06 04:05:25
【问题描述】:

这是我的功能

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 上无效。谁能帮我调试一下?

【问题讨论】:

  • 那是列b_date的数据类型?
  • 不是一个变量,它将存储值 lst_reset_dt_tm,稍后将用于比较
  • 该块不称为函数,它是一个匿名块。
  • 您将变量b_date 声明为date 数据类型。那么,这在您的代码中做了什么? ... to_date(b_date, 'mm/dd/yyyy') 如果您想将日期截断到一天的开始,请使用trunc(b_date),而不是某种形式的to_date()
  • 代码中的“第 16 行”到底是哪一行?根据您发布的内容(格式化,包括空白行),它将是where program like '%(PMON)%');,但我怀疑这一行会引发您报告的错误。 to_date() 更有可能应用于日期;该错误可能是由您的nls_date_format 设置引起的,这可能因会话而异(解释为什么这不会在另一台机器上失败;如果 Oracle 不是试图修复我们的错误的老大哥,那应该每次都失败机器)。

标签: sql oracle oracle12c


【解决方案1】:

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

或者问题是您的第二个 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;
/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-04
    • 2021-08-01
    相关资源
    最近更新 更多