oracle-pro-c
建议使用指示器变量作为"NULL flags"
附加在主机变量上。根据文档,我们可以将每个主机变量与一个可选的指示变量(short type)关联。例如:
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,例如:
EXEC SQL SELECT NVL(TO_CHAR(xyz), '') INTO :host_var
FROM ...;
哪一个在性能方面更好?
啊,Pro*C。这是过去的一段时间,20多年了,但我想我的记性对我来说很好。
使用指标变量在性能方面会更好,原因有二:
- SQL更简单,因此解析更少,通过网络传输到数据库服务器的字节更少。
- 在Oracle中,"Null"值通常是用0字节编码的。空字符串包含长度(N字节)和存储空间(0字节)。因此,NULL值在返回的结果集中被更有效地编码。
在实践中,您不会注意到太多的区别。但是你问了:-)
根据我的经验,NVL
比指示器变量慢得多,特别是如果嵌套(是的,您可以嵌套它们)用于INSERT或UPDATE字段。那是很久以前的事了,我不记得具体的情况了,但我记得成绩的提高是真实的。在select上,它不是那么明显,但是使用指示符变量也允许检测截断发生的情况。
如果您使用VARCHAR
或UVARCHAR
列,则有第三个选项来检测Oracle中的NULL
/空字符串。len字段将被设置为0,这意味着该值为空。由于Oracle不区分NULL
和长度为0的字符串,它们或多或少是相同的。