南大通用GBase8s 常用SQL语句(135)

    1. EXECUTE PROCEDURE 语句

使用 EXECUTE PROCEDURE 语句来调用用户定义的过程或内建例程。该语句是对 SQL 的 ANSI/ISO 标准的扩展。

语法

 

元素

描述

限制

语法

function 

要执行的 SPL 例程

必须存在

数据库对象名 

output_var 

从 UDR 接收返回值的主变量或程序变量

在 CREATE TRIGGER 语句的上下文中,必须包含触发器表中或另一表中的列名称

特定于语言

procedure 

要执行的用户定义过程

必须存在

数据库对象名 

SPL_var 

包含要执行的 SPL 例程名称的变量

必须是字符数据类型,包含 SPL 例程的非 NULL 名称。

标识符 

用法

EXECUTE PROCEDURE 语句调用用户定义过程并指定其参数。

为了与早期的 GBase 8s 版本相兼容,您可使用 EXECUTE PROCEDURE 语句来执行 CREATE PROCEDURE 语句定义的 SPL 函数。

如果 EXECUTE PROCEDURE 语句返回多行,则必须在 SPL 例程的 FOREACH 循环内处理该结果集,或者通过 ESQL/C 例程的游标另行访问。

在支持隐式事务的符合 ANSI/ISO 数据库中,在缺省情况下,EXECUTE PROCEDURE 不开启新的事务。然而,在被调用过程内的 SQL 语句可开启新的事务。

错误的原因

EXECUTE PROCEDURE 在下列条件下返回错误。

  1. 它的参数比被调用过程预期的多。
  2. 丢失一个或多个参数,且没有缺省值。
  3. 完全限定过程名称或例程特征符不唯一。
  4. 找不到指定名称或特征符的过程。

如果在数据库内 procedure 名称不唯一,则必须指定足够的 parameter_type 信息来明确该名称。请参阅 参数 获取在调用过程时如何指定参数的附加信息。(在 GBase 8s 中,外部 UDR 的 specific name 在 DDL 语句中有效,但在调用该过程的上下文中无效。)

使用 INTO 子句

使用 INTO 子句来指定存储 SPL 函数返回值的存储位置。

如果 SPL 函数返回多个值,则这些值以您指定的顺序返回到变量列表内。如果 SPL 函数返回多行或集合数据类型,则必须以游标访问这些行或集合元素。

您不可准备有 INTO 子句的 EXECUTE PROCEDURE 语句。要获取更多信息,请参阅 PREPARE ... EXECUTE FUNCTION ... INTO 的备用选择。

WITH TRIGGER REFERENCES 关键字

在您使用 EXECUTE PROCEDURE 语句来调用触发器过程时,必须包括 WITH TRIGGER REFERENCES 关键字。

触发器过程是一个 SPL 例程,EXECUTE PROCEDURE 仅可从触发器定义的 Action 子句的 FOR EACH ROW 部分来调用该例程。该 REFERENCING 子句声明关联变量的名称,该过程可使用这些变量来在触发器事件发生时引用行中的 old 列,或在触发器修改了行之后引用列的 new 值。FOR 子句指定在其上定义触发器的表或视图。

调用触发器过程的示例

CREATE TABLE tab1 (col1 INT,col2 INT);

CREATE TABLE tab2 (col1 INT);

CREATE TABLE temptab1

   (old_col1 INTt, new_col1 INT, old_col2 INT, new_col2 INT);

        /* 在本示例中,从 INSERT 触发器调用下列过程。 

        */

CREATE PROCEDURE proc1()

REFERENCING OLD AS o NEW AS n FOR tab1;

IF (INSERTING) THEN  -- INSERTING Boolean operator

        LET n.col1 = n.col1 + 1;   -- You can modify new values.

        INSERT INTO temptab1 VALUES(0,n.col1,1,n.col2);

END IF

IF (UPDATING) THEN  -- UPDATING Boolean operator

       -- you can access relevant old and new values.

       INSERT INTO temptab1 values(o.col1,n.col1,o.col2,n.col2);

END IF

if (SELECTING) THEN  -- SELECTING Boolean operator

        -- you can access relevant old values.

        INSERT INTO temptab1 VALUES(o.col1,0,o.col2,0);

END IF

if (DELETING) THEN   -- DELETING Boolean operator

        DELETE FROM temptab1 WHERE temptab1.col1 = o.col1;

END IF

END PROCEDURE;

该示例说明触发操作可不同于触发事件的 DML 操作。虽然该过程在 Insert 触发器调用它时插入一行,并在 Delete 触发器调用它时删除一行,但如果由 Select 触发器或由 Update 触发器调用它,则还执行 INSERT 操作。

本示例中的 proc1( ) 触发器过程使用仅在触发器例程中才有效的 Boolean 条件运算符。仅当从 INSERT 触发器的 FOR EACH ROW 操作调用该过程时,INSERTING 运算符才返回真值。该过程还可从其触发器事件为 UPDATE、SELECT 或 DELETE 的其他触发器调用,因为如果在相应的触发事件类型触发的操作中调用该过程,则 UPDATING、SELECTING 和 DELETING 操作符返回真值(t)。

下列语句在 tab1 上定义 Insert 触发器,从 FOR EACH ROW 部分调用 proc1( ) 作为其触发的操作,并执行激活该触发器的 INSERT 操作:

CREATE TRIGGER ins_trig_tab1 INSERT ON tab1 REFERENCING NEW AS post

        FOR EACH ROW(EXECUTE PROCEDURE proc1() WITH TRIGGER REFERENCES);

请注意该触发器的 REFERENCING 子句为 NEW 子句声明一相关名称,不同于触发器过程声明的相关名称。这些名称无需匹配,因为在触发器过程中声明的相关名称是以那个过程作为其引用的作用域。下列语句激活 ins_trig_tab1 触发器,执行 proc1( ) 过程。

INSERT INTO tab1 VALUES (111,222);

由于触发器过程将 col1 的新值加 1,因此插入的值为 (112, 222),而不是触发事件指定的值。

SPL 过程的动态例程名称规范

动态例程名称规范简化 SPL 例程的编写,该例程调用另一个直到运行时才能知道其名称的 SPL 例程。

要指定 EXECUTE PROCEDURE 语句中的 SPL 例程的名称,而不是罗列 SPL 例程的显式名称,您可使用 SPL 变量来保留例程名称。

如果 SPL 变量命名返回值的 SPL 例程,则包括 EXECUTE PROCEDURE 的 INTO 子句来指定 receiving variable(或多个变量)以保留 SPL 函数返回的一个值(或多个值)。要获取更过关于如何动态地执行 SPL 过程的信息,请参阅《GBase 8s SQL 指南:教程》

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值