南大通用GBase8s 常用SQL语句(四十七)

REFERENCING 和 FOR 子句
REFERENCING 子句可以声明原始值的相关名称和 FOR 子句指定的 table_object 列中的已更改的值相关名称。
REFERENCING 和 FOR 子句

元素 描述 限制 语法
correlation 在此定义的触发器例程中限定旧的或新的列值( correlation.column) 不能是 table_object 标识符
owner table_object 的所有者 必须拥有 table_object 所有者名称
table_object 具有可以调用 function 的触发器的表或视图的名称或同义词 必须存在于本地数据库中 标识符
如果您在 CREATE FUNCTION 语句列表之后立即包含 REFERENCING 和 FOR table_object 子句,则您创建的函数被称为触发器函数(或 触发器 UDR 或 触发器例程)。 FOR 子句指定触发器可以从它们的 Triggered Action 列表的 FOR EACH ROW 部分调用函数的表或视图。
在 REFERENCING 子句中,OLD correlation指定一个前缀,通过该前缀触发器例程可以引用 table_object 列在触发器例程修改列值之前所具有的值。 NEW correlation 指定用于引用触发器例程分配给该列的新值的前缀。无论该触发器例程是否能使用 correlation 名引用 OLD 列值,NEW 列值或者这两种类型的值都取决于正在触发事件的类型:
由 Insert 触发器调用的触发器例程仅能引用 NEW correlation 名称。
由 Delete 触发器或 Select 触发器调用的触发器例程仅能引用 OLD correlation 名称。
由 Update 触发器调用的触发器例程能引用 OLD 和 NEW correlation 名称。
有关如何在触发动作中使用 correlation.column 符号的信息,请参阅 REFERENCING 子句 。
除了任何以 SPL 语言编写 GBase 8s UDR 的一般需求,触发器例程支持某些附加语法特性,并且受到一定的限制,对于不是触发器例程的一般 UDR ,它们不支持此功能(或者不受此限制):
触发器必须包含 FOR table_object 子句已指定本地数据库中表或视图的名称,该触发器可调用此例程。
触发器例程还可以包含 REFERENCING 子句以声明该相关名称为 OLD 和 NEW 值,它们可被 UDR 中的 SPL 语句引用。
触发器例程只能在触发器定义中的 Triggered Action 列表的 FOR EACH ROW 节被调用。
OLD 或 NEW 值的相关变量可以出现在 SPL 的 IF 语句 和 CASE 表达式中。
OLD 值的相关变量不能在一个 LET 表达式的左边。
如果 FOR 子句指定一个视图,它的 INSTEAD OF 触发动作列表调用该触发器例程,则 NEW 值的相关变量不能在一个 LET 表达式的左边。
只有 NEW 值的相关变量可以在引用相关变量的 LET 表达式的左边从而。然而,在这种情况下,FOR 子句必须指定表而非视图。
OLD 和 NEW 值都可以在一个 LET 表达式的右边。
Boolean 运算符 SELECTING 、INSERTING 、DELETING 和 UPDATING 在具有有效 Boolean 表达式的上下文内的触发器例程中(和只在触发动作语句中调用的触发例程和其它 UDR中)是可用的。如果正在触发的事件符合由此运算符名称引用的 DML 操作,则这些运算符返回 TRUE (‘t’),否则返回 FALSE(‘f’)。
如果一个正在触发的事件激活了同一表或视图上的多个触发器,则所有的 BEFORE 动作在任何 FOR EACH ROW 动作之前发生,并且所有的 AFTER 操作在 FOR EACH ROW 动作之后发生。同一事件上不同触发器的执行顺序不被保证。
触发器例程必须用 SPL 语言编写。它们不能用外部语言编写,如 C 或 Java™ 语言,但是它们可以包含到外部语言例程的调用,如:应用程序编程编程接口 mi_trigger ,用于触发器内省。
触发器函数不能引用保存点。由触发动作引起的数据值或数据库结构变更必须被全部提交或全部回滚。 GBase 8s 不支持触发动作的部分回滚。
有关 mi_trigger API 的更多信息,请参阅 GBase 8s DataBlade API 程序员指南 和 GBase 8s DataBlade API 函数参考 。
如果您包含 REFERENCING 子句但省略了 FOR 子句,或者您包含 FOR 子句但省略了 REFERENCING 子句,则 CREATE FUNCTION 语句发生错误而失败。
如果您都省略了 REFERENCING 和 FOR 子句,则 UDR 不能使用 SELECTING 、INSERTING 、DELETING 和 UPDATING 运算符,并且不能声明可以表示和操纵触发器定义指定的表或视图上触发动作的列值。
有关 Delete 、Insert 、Select 和 Update 触发器的 REFERENCING 子句的语法的描述,请参阅 CREATE TRIGGER 语句中有关 REFERENCING 子句部分。
重载函数名
因为 GBase 8s 支持例程重载,所有您可以用同一名称定义多个函数,但有不同的参数列表。您可能希望在以下情况中重载函数:
您使用与内置函数相同的名称创建用户定义函数(如 equal( )),以处理新拥有定义的数据类型。
您创建类型层次结构,其中子类型从超类型继承数据表示法和函数。
您创建 distinct 类型,它是用于与现有数据类型具有相同的内部存储表示的数据类型,但是名称不同。并且在没有强制转型的情况下无法与源类型相比较。Distinct 类型从其源类型继承支持函数。
有关唯一标识每个用户定义函数的例程特征符的简短描述,请参阅例程重载以及例程签名 。
示例
重载函数通过名称和输入参数列表来唯一标识。除了提供一个长的唯一标识符,还可以通过特定名称从而在之后使用它。以下示例显示了一个重载函数,它的标识符是 getArea,具有特定名称 getSquareArea 和 getRectangleArea :
CREATE FUNCTION getArea
(i INT DEFAULT 0)
RETURNING INT SPECIFIC getSquareArea;
DEFINE j INT;
LET j = i * i;
RETURN j;
END FUNCTION;

      CREATE FUNCTION getArea 
      (i INT DEFAULT 0, j INT DEFAULT 0) 
      RETURNING INT SPECIFIC getRectangleArea; 
      DEFINE k INT; 
      LET k = i * j; 
      RETURN k; 
      END FUNCTION;

现在您可以使用特定名称,如下所示:
GRANT EXECUTE ON SPECIFIC FUNCTION getSquareArea TO gbasedbt;
GRANT EXECUTE ON SPECIFIC FUNCTION getRectangleArea TO gbasedbt;
若没有特定名称,则您可能需要发出下列语句:
GRANT EXECUTE ON FUNCTION getArea (INTEGER) TO gbasedbt;
GRANT EXECUTE ON FUNCTION getArea (INTEGER,INTEGER) TO gbasedbt;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值