暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

GBase 8s 禁止重新定义 NULL

郑小雯 2023-11-14
109

GBase 8s 禁止重新定义 NULL,因为允许这样定义会限制 NULL 关键字的全局作用域。为此,任 何限制全局作用域或重新定义关键字 NULL 的作用域的机制都会在语法上禁用涉及 NULL 值的任 何强制转型表达式。您必须确保关键字 NULL 的发生在所有表达式上下文中收到它的全局作用 域。

例如,请考虑下列 SQL 代码:

CREATE TABLE newtable ( null int ); SELECT null, null::int FROM newtable;

CREATE TABLE 语句是有效的,因为列标识符具有限定到表定义的引用的作用域;仅可在表的作 用域内访问它们。

然而,在该示例中的 SELECT 语句引起一些语法的多义性。出现在 projection 列表中的标识符

null 引用全局的关键字 NULL 吗?它引用在 CREATE TABLE 语句中声明了的列标识符 null 吗?

⚫ 如果将标识符 null 解释作为列名称,则带有 NULL 关键字的强制转型表达式的全局作用 域将会受限。

⚫ 如果将标识符 null 解释作为 NULL 关键字,则 SELECT 语句必须为 null 的发生生成 语法错误,因为 NULL 关键字仅可作为强制转型表达式出现在 projection 列表中。

下列形式的 SELECT 语句是有效的,因为以表名称限定 newtable 的 NULL 列: SELECT newtable.null, null::int FROM newtable;

在有名为 null 的变量的 SPL 例程的上下文中,会出现更多语法的多义性。示例如下:

CREATE FUNCTION nulltest() RETURNING INT; DEFINE a INT; DEFINE null INT; DEFINE b INT; LET a = 5; LET null = 7; LET b = null; RETURN b; END FUNCTION; EXECUTE FUNCTION nulltest();

当在 DB-Access 中执行前面的函数时,在 LET 语句的表达式中,创建标识符 null 作为关键字 NULL。该函数返回 NULL 值,而不是 7。

使用 null 作为 SPL 例程的变量会限制在 SPL 例程体中对 NULL 值的使用。因此,前面的 SPL 代码是无效的,并导致 GBase 8s 返回下列错误:

-947 Declaration of an SPL variable named 'null' conflicts with SQL NULL value.

在 ESQL/C 中,如果有 SELECT 语句会返回 NULL 值的可能性,则您应使用指示符变量。 

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论