元素 | 描述 | 限制 | 语法 |
---|---|---|---|
SLV_variable | 在同一查询中的用户定义的函数的调用中指定的语句本地的变量(SLV) | SLV_variable 仅在查询执行期间存在。在该查询中它的名称必须是唯一的 | 标识符 |
请您在 SELECT 语句的 WHERE 子句中对用户定义的函数的调用中定义 SLV。必须以一个或多个 OUT 或 INOUT 参数来定义用户定义的函数。对用户定义的函数的调用将 OUT 或 INOUT 参数的值指定到 SLV。要获取更多信息,请参阅 语句本地的变量声明。
换句话说,如果查询包含一个或多个子查询,则在该查询中定义的 SLV 对于那个查询的所有子查询也是可见的。 但如果在子查询中定义 SLV,则它对于父查询是不可见的。
该 SLV 对于在 UNION 中指定的任何其他查询都不是可见的。
在 DML 语句的此 SELECT 部分中,上述作用域规则都适用。
SELECT zip_code_t FROM address WHERE address.city = find_location(32.1, 35.7, rank # INT) AND rank < 101;
rank < 101
一个 UDF 可有的 OUT 和 INOUT 城市以及 SLV 的数目不受限制。(早于 Version 9.4 的 GBase 8s 产品将用户定义的函数限制为单个 OUT 参数且没有 INOUT 参数,因此限定 SLV 的数目不超过一个。)
如果在一个语句的迭代中未执行初始化该 SLV 的用户定义的函数,则每一 SLV 有一 NULL 值。跨语句的迭代中,不保持 SLV 的值。在每一迭代的开始时刻,数据库服务器将该 SLV 值设置为 NULL。
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 用户定义的例程和数据类型开发者指南 。