指定 SPL 函数是否为变体
当您创建 SPL 时,在缺省情况下,该函数为变体。当使用相同的参数调用函数时,如果它
返回不同的结果,或如果它修改数据库或变量状态,则该函数为变体。例如,返回当前的
日期或时间的函数是变体函数。
虽然在缺省情况下,SPL 函数为变体,但如果当您创建函数时指定 WITH NOT VARIANT,
则该函数不可包含任何 SQL 语句。您仅可在非变体函数上定义函数索引。
添加修饰符
当您编写 SPL 函数时,您可使用 WITH 子句来将修饰符添加到 CREATE FUNCTION 语
句。在 WITH 子句中,您可指定 COMMUTATOR 或 NEGATOR 函数。其他修饰符是用
于外部例程的。
限制: 您仅可以 SPL 函数使用 COMMUTATOR 或 NEGATOR 修饰符。您不可以 SPL 过
程使用任何修饰符。
COMMUTATOR 修饰符
COMMUTATOR 修饰符允许您指定 SPL 函数为您正在创建的 SPL 函数的转换函数。转
换函数接受相同的参数作为您正在创建的 SPL 函数,但以相反的顺序,并返回相同值。对
于 SQL 优化器的执行,转换函数的成本效益比更高。
例如,如果 a 小于 b,则函数 lessthan(a,b) 返回 TRUE, 而如果 b 大于或等于 a,
则 greaterthan(b,a) 返回 TRUE,二者是转换函数。下图使用 WITH 子句来定义转换函数。
图: 定义转换函数

如果 greaterthan(b,a) 的执行成本低于 lessthan(a,b),则优化器可能使用 greaterthan(b,a)。要
指定转换函数,您必须同时拥有该转换函数和您正在编写的 SPL 函数。您还必须将两个函
数的 Execute 权限授予您的 SPL 函数的用户。
要了解授予权限的详细描述,请参阅《GBase 8s SQL 指南:语法》 中的 GRANT 语句的
描述。




