为什么比较varchar / number有效

Kon*_*ski 2 sql oracle plsql

为什么此块不给出NULL错误?内。并使用其他任何指令引发错误(ORA-06502:PL / SQL:数字或值错误)?

BEGIN
  IF 'x' = 1 THEN
    NULL;
  --dbms_output.put_line('test');
  END IF;
END;
Run Code Online (Sandbox Code Playgroud)

Bon*_*ist 6

我认为您遇到的情况是,已将编译参数PLSQL_OPTIMIZE_LEVEL设置为一个足够高的值,以允许编译器优化您的代码。

因此,当您拥有NULL;自己的IF语句时,可以对其进行重写以IF在编译时删除该语句。

但是,NULL;由于IF语句中不存在其他内容,因此无法再将其删除,因此将进行检查'x' = 1。如果将字符值与数字进行比较,Oracle会将字符值转换为数字,因此在您的情况下,这意味着比较失败,因为x不是数字。

例如:

以下作品:

ALTER SESSION SET plsql_optimize_level = 2;

BEGIN
  IF 'x' = 1 THEN
    NULL;
    --dbms_output.put_line('test');
  END IF;
END;
/
Run Code Online (Sandbox Code Playgroud)

但是以下失败:

ALTER SESSION SET plsql_optimize_level = 1;

BEGIN
  IF 'x' = 1 THEN
    NULL;
    --dbms_output.put_line('test');
  END IF;
END;
/
Run Code Online (Sandbox Code Playgroud)

唯一的区别是该PLSQL_OPTIMIZE_LEVEL值-2或更高,编译器将优化不相关的IF语句(1或更低),但不会。