语句本地的变量声明

“语句本地的变量声明”在对定义一个或多个 OUT 或 INOUT 参数的用户定义的函数的调用中声明语句本地的变量(SLV)。

“语句本地的变量声明”有此语法:
语句本地的变量声明
元素 描述 限制 语法
distinct_data_type distinct 数据类型的名称 distinct 数据类型必须在数据库中已经存在 标识符
opaque_data_type opaque 数据类型的名称 opaque 数据类型必须在数据库中已经存在 标识符
slv_name 您正在定义的语句本地的变量的名称 slv_name 仅在该语句的生命期内有效,且 在该语句内必须是唯一的 标识符
如果下列两个条件都为真,则您可在一个用户定义的函数的调用中声明 SLV:
  • UDF 有一个或多个 OUT 或 INOUT 参数
  • 当在查询的 WHERE 子句中调用 UDF 时,声明 SLV。
WHERE 子句中的 SLV 声明将 OUT 或 INOUT 参数的值指定到 SLV,使用 SLV 的标识符与它的声明的数据类型之间的井号(#)。可以 SPL、C 或 Java™ 语言编写 UDF。例如,如果您以下列 CREATE FUNCTION 语句注册函数,则可将它的 y 参数(其为 OUT 参数)的值指定到 WHERE 子句中的 SLV:
CREATE FUNCTION find_location(a FLOAT, b FLOAT, OUT y INTEGER)
          RETURNING VARCHAR(20)
          EXTERNAL NAME "/usr/lib/local/find.so"
          LANGUAGE C;

在此示例中,find_location( ) 接受两个表示纬度和经度的 FLOAT 值,并返回带有额外的表示最近城市的人口等级的 INTEGER 类型的值的城市名称。

现在,您可在 WHERE 子句中调用 find_location( )
SELECT zip_code_t FROM address
          WHERE address.city = find_location(32.1, 35.7, rank # INT)
          AND rank < 101;

该函数表达式将两个 FLOAT 值传递到 find_location( ) 并声明名为 rank 的 INT 类型的 SLV。在此情况下,find_location( ) 将返回距离纬度 32.1 和经度 35.7 最近的城市(可能是人口稠密的地区)的名称,其人口等级在 1 与 100 之间。然后,该语句返回对应于那个城市的邮政编码。

仅在 SELECT 语句的 WHERE 子句中的 UDR 的调用中可声明 SLV。对该 SLV 的引用的作用域包括同一 SELECT 语句的其他部分。然而,下列 SELECT 语句是无效的,因为 SLV 声明是在 Projection 子句的 projection 列表之中,而不是在 WHERE 子句中:
-- invalid SELECT statement
          SELECT title, contains(body, 'dog and cat', rank # INT), rank
          FROM documents;

当您声明 SLV 时,您指定的数据类型必须与 CREATE FUNCTION 语句中对应的 OUT 或 INOUT 参数的数据类型相同。如果您使用不同的但相兼容的数据类型,比如 INTEGER 和 FLOAT,则数据库服务器自动地在数据类型之间执行强制转型。

SLV 与 UDR 变量以及涉及 SQL 语句的表的列名称共享该命名空间。 因此,数据库使用下列优先顺序的降序来解决下列对象之间的名称冲突:
  • UDR变量
  • 列名称
  • SLV

在 UDF 的调用将 OUT 或 INOUT 参数的值指定到 SLV 之后,您可在同一查询的其他部分引用该 SLV。要获取更多信息,请参阅 语句本地的变量表达式

1 请参阅 内建的数据类型
2 请参阅 复合的数据类型