【问题标题】:abort execution of a stored proc中止存储过程的执行
【发布时间】:2015-07-07 06:23:10
【问题描述】:

我有一个包含选择查询的 db2 存储过程。如果选择查询返回任何值,我想中止或失败此存储过程。请帮忙。

SET CURRENT SCHEMA = abc;
SET CURRENT PATH = abc,pqr;
CREATE OR REPLACE PROCEDURE abc.VALID_xyz ( )
  SPECIFIC SQL150421070712734
  LANGUAGE SQL
  NOT DETERMINISTIC
  EXTERNAL ACTION
  MODIFIES SQL DATA
  CALLED ON NULL INPUT
  INHERIT SPECIAL REGISTERS
  OLD SAVEPOINT LEVEL
begin
DECLARE C1 CURSOR WITH RETURN
            FOR select * from xy_table;           
open C1;    
RETURN;
END;
SET CURRENT SCHEMA = abc;

如果 xy_table 有任何行,我需要使这个存储过程失败。

【问题讨论】:

  • 如果您的过程实际上并未操作 DB2 之外的东西(例如 JVM 中的 Java 对象),如果您通过指定 NO EXTERNAL ACTION 而不是更谨慎的默认值EXTERNAL ACTION

标签: stored-procedures db2


【解决方案1】:

SIGNALcommand 可以触发预定义的或自定义的 SQLSTATE,它将中止当前的 SQL 过程(或 SQL 语句的原子块),就好像发生了实际错误一样。

SET CURRENT SCHEMA = abc;
SET CURRENT PATH = abc,pqr;

--#SET TERMINATOR @
CREATE OR REPLACE PROCEDURE abc.valid_xyz()
SPECIFIC valid_xyz
NO EXTERNAL ACTION
LANGUAGE SQL
BEGIN
    IF EXISTS ( SELECT 1 FROM xy_table FETCH FIRST ROW ONLY )
    THEN
        SIGNAL SQLSTATE '75002' 
           SET MESSAGE_TEXT = 
           'Table XY_TABLE contained data when it was expected to be empty.';
     END IF;
END@
--#SET TERMINATOR ;

CALL valid_xyz();

SQL0438N  Application raised error or warning with diagnostic text: 
"Table XY_TABLE contained data when it was expected to be empty.".  SQLSTATE=75002

【讨论】:

    猜你喜欢
    • 2010-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多