为什么比较varchar / number有效

时间:2019-06-19 08:04:30

标签: sql oracle plsql

为什么该块没有错误,所以为NULL;内。并在其中包含任何其他指令的情况下引发错误(ORA-06502:PL / SQL:数字或值错误)?

BEGIN
  IF 'x' = 1 THEN
    NULL;
  --dbms_output.put_line('test');
  END IF;
END;

1 个答案:

答案 0 :(得分: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;
/

但是以下操作失败:

ALTER SESSION SET plsql_optimize_level = 1;

BEGIN
  IF 'x' = 1 THEN
    NULL;
    --dbms_output.put_line('test');
  END IF;
END;
/

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