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 值的可能性,则您应使用指示符变量。




