首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle pro*c指示符变量与查询执行中的NVL

Oracle pro*c指示符变量与查询执行中的NVL
EN

Stack Overflow用户
提问于 2016-08-12 11:13:13
回答 2查看 1.6K关注 0票数 1

oracle-pro-c建议将指示符变量用作附加到主机变量的"NULL flags"。根据文档,我们可以将每个主机变量与一个可选的指示符变量(short类型)相关联。例如:

代码语言:javascript
复制
short indicator_var;
EXEC SQL SELECT xyz INTO :host_var:indicator_var
    FROM ...;

我们也可以选择使用https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions105.htm中记录的NVL,例如:

代码语言:javascript
复制
EXEC SQL SELECT NVL(TO_CHAR(xyz), '') INTO :host_var
        FROM ...;

就性能而言,哪一个更好?

EN

回答 2

Stack Overflow用户

发布于 2016-08-12 20:39:10

哦,Pro*C。那是一段时间了,超过20年了,但我想我的记忆力在这里很好。

使用指示符变量在性能方面会更好,原因有两个:

  • SQL更简单,因此解析更少,通过网络传输到数据库服务器的字节也更少。
  • 在Oracle中,"Null“值通常编码为0字节。空字符串包含长度(N字节)和存储(0字节)。因此,空值在返回结果集中的编码效率更高。

现在,在实践中,您不会注意到太多差异。但您问:-)

票数 2
EN

Stack Overflow用户

发布于 2020-02-06 19:23:22

根据我的经验,NVL比指示符变量慢得多,特别是在嵌套(是的,您可以嵌套它们)以插入或更新字段的情况下。那是很久以前的事了,我记不清具体的情况了,但我记得性能的提升是真实的。在select上,这不是很明显,但使用指示符变量还允许检测发生截断的情况。

如果使用VARCHARUVARCHAR列,还可以使用第三种方法检测NULL中的/Empty字符串。len字段将被设置为0,这意味着该值为空。由于Oracle不区分NULL和长度为0的字符串,因此它们大致相同。

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

https://stackoverflow.com/questions/38909277

复制
相关文章

相似问题

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