从 DB2 过程在控制台中打印错误消息

Print error message in console from DB2 procedure

是否有任何其他简单的方法可以在不在注册表中设置 DB2_COMPATIBILITY_VECTOR=ORA 的情况下从 DB2 过程在控制台中打印消息?

因为内置模块 dbms_output 允许打印到控制台并且无需设置兼容性矢量就可以使用它,您应该能够打印消息。我刚刚在 V10.5 数据库上测试了这个,没有过程:

[hloeser@mymachine]$ db2 "set serveroutput on"
DB20000I  The SET SERVEROUTPUT command completed successfully.
[hloeser@mymachine]$ db2 "call dbms_output.put('Hello')"

  Return Status = 0
[hloeser@mymachine]$ db2 "call dbms_output.new_line"

  Return Status = 0

Hello

启用serveroutput很重要。

当您使用控制台发送消息时,您必须等待执行结束。如果您在批处理过程中生成一条消息,则可能需要一段时间才能显示该消息。

如果你的执行只是一条指令和一个错误,你可以'raise a signal'。这样,就可以从任何访问 DB2 的应用程序中检索错误消息。

您可以在日志中写一条消息,而不是在控制台中打印输出,这在我看来不是一个很好的做法(只有控制台能够显示服务器输出)。您可以将输出写在另一个 table 中,或者使用像 log4db2 这样的框架。

通过使用log4db2这样的日志机制,如果你把这条语句作为批处理的一部分执行,你随时可以通过查询日志table得到消息,而不必等待执行结束。

我可以通过以下步骤实现我的预期目标:

[user@boxname]/home/user>db2 "set serveroutput on"
DB20000I  The SET SERVEROUTPUT command completed successfully.
[user@boxname]/home/user>cat > copy_table
CREATE OR REPLACE PROCEDURE COPY_TABLE(
  IN SRC_SCMA VARCHAR(30),
  IN TGT_SCMA VARCHAR(30),
  IN SRC_TBL VARCHAR(50),
  IN TGT_TBL VARCHAR(50)
)
LANGUAGE SQL
CALLED ON NULL INPUT

BEGIN

DECLARE a INT;
DECLARE b INT;
DECLARE c INT;
DECLARE d INT;

SELECT COUNT(1) INTO a FROM SYSCAT.SCHEMATA WHERE SCHEMANAME = UCASE(''||SRC_SCMA||'');

IF a <= 0 THEN
    CALL DBMS_OUTPUT.PUT_LINE('Invalid Source Schema Specified');
        GOTO LAST_BLOCK;
END IF;

SELECT COUNT(1) INTO b FROM SYSCAT.SCHEMATA WHERE SCHEMANAME = UCASE(''||TGT_SCMA||'');

IF b <= 0 THEN
    CALL DBMS_OUTPUT.PUT_LINE('Invalid Target Schema Specified');
        GOTO LAST_BLOCK;
END IF;

SELECT COUNT(1) INTO c FROM SYSCAT.TABLES WHERE TABSCHEMA = UCASE(''||SRC_SCMA||'') AND TABNAME=UCASE(''||SRC_TBL||'');

IF c <= 0 THEN
    CALL DBMS_OUTPUT.PUT_LINE('Invalid Target Schema Specified');
        GOTO LAST_BLOCK;
END IF;

SELECT COUNT(1) INTO d FROM SYSCAT.TABLES WHERE TABSCHEMA = UCASE(''||TGT_SCMA||'') AND TABNAME=UCASE(''||TGT_TBL||'');

IF d > 0
THEN
        EXECUTE IMMEDIATE 'DROP TABLE '||TGT_SCMA||'.'||TGT_TBL;
        EXECUTE IMMEDIATE 'CREATE HADOOP TABLE '||TGT_SCMA||'.'||TGT_TBL||' AS SELECT * FROM '||SRC_SCMA||'.'||SRC_TBL;
        CALL DBMS_OUTPUT.PUT_LINE('Invalid Source Table OR Source Schema & Table Combition Is Wrong');
ELSE
        EXECUTE IMMEDIATE 'CREATE HADOOP TABLE '||TGT_SCMA||'.'||TGT_TBL||' AS SELECT * FROM '||SRC_SCMA||'.'||SRC_TBL;
        CALL DBMS_OUTPUT.PUT_LINE('Target Table Created & Loaded');
END IF;

 LAST_BLOCK:
        RETURN;

END@
[user@boxname]/home/user>db2 -td@ -f copy_table
DB20000I  The SQL command completed successfully.

[user@boxname]/home/user>db2 "CALL COPY_TABLE('invalid_user','valid_user','TEST_TABLE','TEST_TABLE')"

  Return Status = 0

Invalid Source Schema Specified