首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么比较varchar/number行得通

为什么比较varchar/number行得通
EN

Stack Overflow用户
提问于 2019-06-19 16:04:30
回答 1查看 59关注 0票数 2

为什么这个代码块在NULL的情况下没有错误。并引发错误(ORA-06502: PL/SQL: numeric或value error)?

代码语言:javascript
运行
复制
BEGIN
  IF 'x' = 1 THEN
    NULL;
  --dbms_output.put_line('test');
  END IF;
END;
EN

回答 1

Stack Overflow用户

发布于 2019-06-19 16:34:22

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

因此,当您在IF语句中包含NULL;时,可以重写该语句,以便在编译时删除该IF语句。

但是,由于IF语句中存在NULL;以外的内容,因此不能再将其删除,因此将生成检查'x' = 1。如果要将字符值与数字进行比较,Oracle会将字符值转换为数字,因此在本例中,这意味着比较失败,因为x不是数字。

例如:

以下是工作原理:

代码语言:javascript
运行
复制
ALTER SESSION SET plsql_optimize_level = 2;

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

但是以下代码失败了:

代码语言:javascript
运行
复制
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或更低,它不会。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56662857

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档