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

时间:2015-08-04 03:58:17

标签: console db2

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

3 个答案:

答案 0 :(得分:1)

我能够通过以下步骤实现我的目标:



[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
&#13;
&#13;
&#13;

答案 1 :(得分:0)

因为内置模块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非常重要。

答案 2 :(得分:0)

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

如果您的执行只是一条指令而且只有一条错误,那么您可以提出一个信号&#39;。通过这种方式,可以从访问DB2的任何应用程序中检索错误消息。

您可以在日志中编写消息,而不是在控制台中打印输出,而IMO不是一个很好的做法(只有控制台能够显示服务器输出)。您可以在另一个表中编写输出,或使用log4db2之类的框架。

通过使用log4db2之类的日志机制,如果您在批处理过程中执行此语句,您可以随时通过查询日志表来获取消息,而不必等到结束时执行。