【问题标题】:Get SQLCODE and SQLSTATE from stored procedure with executing a statement from variable通过从变量执行语句从存储过程中获取 SQLCODE 和 SQLSTATE
【发布时间】:2019-04-18 13:09:51
【问题描述】:

我有这个:

CREATE OR replace PROCEDURE log_test
                                 ( IN QUERY VARCHAR(24576),
                                   IN LOGTBL varchar(20) ) LANGUAGE SQL
BEGIN
DECLARE v_select_query VARCHAR(24576);
DECLARE v_query VARCHAR(24576);
DECLARE v_logtbl varchar(20);
DECLARE v_errormsg varchar(2048);
DECLARE v_time TIMESTAMP;
DECLARE v_temp_select varchar(1024);
DECLARE stmt STATEMENT;
DECLARE SQLCODE INTEGER DEFAULT 0;
DECLARE SQLSTATE CHAR(5) DEFAULT '00000';
DECLARE CONTINUE HANDLER 
FOR SQLEXCEPTION,SQLWARNING,NOT FOUND
    SET v_sqlcode = SQLCODE;




set v_select_query  = 'Set (?) = ('||QUERY||')';
set v_query  = 'Set (?) = ('||QUERY||')';
set v_bezug  = bezug;
set v_logtbl = logtbl;
set v_time   = CURRENT TIMESTAMP;



PREPARE stmt from v_select_query;

EXECUTE stmt into v_temp_select;

END @

语句查询是

 select count(*) from testtbl;

并且没有 sqlstate 捕获它可以工作。

结果是我希望语句成功或失败时保存在变量中的sqlcode。但是现在我只收到“意外令牌”之后的错误消息。

关于如何解决这个问题的任何想法?稍后我想通过插入到另一个表中来记录 sqlcode。

DB2 Windows v10.5

感谢您的帮助

【问题讨论】:

  • 如果 SQL 语句成功,则 SQLCODE 始终为零。如果 SQL 语句失败,则 SQLCODE 不为零,并且 SQLSTATE 设置为不同于“00000”的值。由于您已经声明了一个简单地设置局部变量的 EXIT HANDLER,然后在 SQL 语句失败时,您的 sproc 将立即退出,这意味着您当前编码的退出处理程序是无用的,尽管您可以扩展它以将 sqlcode/sqlstate 插入另一个表(更好为此目的调用一个自治存储过程以确保一个单独的 UOW)。
  • 此外,您不能同时拥有 both SQLEXCEPTION 的继续和退出处理程序。您可以拥有其中的一个
  • 我删除了退出处理程序。我怎样才能使程序起作用?它不编译
  • 修复语法错误,有几个比较明显的。将 SQLCODE 和 SQLSTATE 声明放在首位(在语句声明之前)。定义未定义的变量(v_sqlcode、v_bezug 等)。

标签: sql stored-procedures error-handling db2 execute


【解决方案1】:

根据 cmets,修复代码中的语法错误。下面的示例将针对 Db2-LUW 进行编译,但您的代码中还有其他错误和问题,稍后您会在测试中发现这些错误和问题。

CREATE OR replace PROCEDURE log_test
( IN QUERY VARCHAR(24576),
  IN LOGTBL varchar(20) ) 
LANGUAGE SQL
specific log_test
BEGIN
    DECLARE SQLCODE INTEGER DEFAULT 0;
    DECLARE SQLSTATE CHAR(5) DEFAULT '00000';
    DECLARE v_select_query VARCHAR(24576);
    DECLARE v_query VARCHAR(24576);
    DECLARE v_logtbl varchar(20);
    DECLARE v_errormsg varchar(2048);
    DECLARE v_time TIMESTAMP;
    DECLARE v_temp_select varchar(1024);
    DECLARE v_sqlcode INTEGER;
    DECLARE v_sqlstate CHAR(5);
    DECLARE v_bezug varchar(1024);

    DECLARE stmt STATEMENT;
    DECLARE CONTINUE HANDLER FOR SQLWARNING,NOT FOUND
        SET v_sqlcode = SQLCODE;
    DECLARE EXIT HANDLER FOR SQLEXCEPTION 
        SET v_sqlstate = SQLSTATE;


    set v_select_query  = 'Set (?) = ('||QUERY||')';
    set v_query  = 'Set (?) = ('||QUERY||')';
    set v_bezug  = 'bezug';
    set v_logtbl = logtbl;
    set v_time   = CURRENT TIMESTAMP;



    PREPARE stmt from v_select_query;

    EXECUTE stmt into v_temp_select;

END@

【讨论】:

    猜你喜欢
    • 2019-04-19
    • 2023-04-06
    • 2017-04-02
    • 1970-01-01
    • 1970-01-01
    • 2020-02-28
    • 2015-08-20
    • 1970-01-01
    • 2011-09-18
    相关资源
    最近更新 更多