语句本地的变量表达式

“语句本地的变量表达式”指定您可在同一 SELECT 语句中的其他地方使用的语句本地的变量(SLV)。
语句本地的变量表达式
元素 描述 限制 语法
SLV_variable 在同一查询中的用户定义的函数的调用中指定的语句本地的变量(SLV) SLV_variable 仅在查询执行期间存在。在该查询中它的名称必须是唯一的 标识符

请您在 SELECT 语句的 WHERE 子句中对用户定义的函数的调用中定义 SLV。必须以一个或多个 OUT 或 INOUT 参数来定义用户定义的函数。对用户定义的函数的调用将 OUT 或 INOUT 参数的值指定到 SLV。要获取更多信息,请参阅 语句本地的变量声明

一旦用户定义的函数将它的 OUT 或 INOUT 参数指定到 SLV,您可在同一 SELECT 语句的其他部分中使用这些值,服从下列引用的作用域规则:
  • 在定义 SLV 的查询(或子查询)中该 SLV 是只读的
  • SLV 的作用域从定义该 SLV 的查询向下扩展至所有嵌套的子查询内。
  • 在嵌套的查询中,SLV 的作用域不向上扩展。

    换句话说,如果查询包含一个或多个子查询,则在该查询中定义的 SLV 对于那个查询的所有子查询也是可见的。 但如果在子查询中定义 SLV,则它对于父查询是不可见的。

  • 在包括 UNION 运算符的查询中,该 SLV 仅在定义它的查询中是可见的。

    该 SLV 对于在 UNION 中指定的任何其他查询都不是可见的。

  • 对于 INSERT、DELETE 和 UPDATE 语句,在该语句的 SELECT 部分之外,SLV 不是可见的。

    在 DML 语句的此 SELECT 部分中,上述作用域规则都适用。

Important: 仅对于在单个 SQL 语句期间,语句本地的变量在作用域中。
下列 SELECT 语句调用 WHERE 子句中的 find_location( ) 函数,并定义 rank SLV。在此,find_location( ) 接受表示纬度和经度的两个值,并返回最近的城市的名称,带有表示该城市人口等级的 INTEGER 类型的额外的值。
SELECT zip_code_t FROM address
          WHERE address.city = find_location(32.1, 35.7, rank # INT)
          AND rank < 101;
当成功地完成 find_location() 函数的执行时,该函数已初始化了 rank SLV。然后,SELECT 在第二个 WHERE 子句条件中使用此 rank 值。在此示例中,“语句本地的变量表达式”是第二个 WHERE 子句条件中的变量 rank
rank < 101

一个 UDF 可有的 OUT 和 INOUT 城市以及 SLV 的数目不受限制。(早于 Version 9.4 的 GBase 8s 产品将用户定义的函数限制为单个 OUT 参数且没有 INOUT 参数,因此限定 SLV 的数目不超过一个。)

如果在一个语句的迭代中执行初始化该 SLV 的用户定义的函数,则每一 SLV 有一 NULL 值。跨语句的迭代中,不保持 SLV 的值。在每一迭代的开始时刻,数据库服务器将该 SLV 值设置为 NULL。

下列部分语句调用两个带有 OUT 参数的用户定义的函数,以 SLV 名称 out1out2 引用其值:
SELECT... 
          WHERE func_2(x, out1 # INTEGER) < 100 
          AND (out1 = 12 OR out1 = 13) 
          AND func_3(a, out2 # FLOAT) = "SAN FRANCISCO" 
          AND out2 = 3.1416;

如果函数将来自本地数据库服务器的另一数据库的一个或多个 OUT 或 INOUT 参数值指定到 SLV,则这些值必须为内建的数据类型,或其基础类型为内建的数据类型(以及您显式地强制转型为内建的数据类型)的 DISTINCT 数据类型,或必须为您显式地强制转型为内建的数据类型的的 opaque UDT。在所有的参与数据库中,所有 opaque UDT、DISTINCT 类型、类型层级和强制转型的定义都必须完全相同。

要获取关于如何编写带有 OUT 或 INOUT 参数的用户定义的函数的信息,请参阅 GBase 8s 用户定义的例程和数据类型开发者指南