在没有在注册表中设置DB2_COMPATIBILITY_VECTOR = ORA的情况下,是否还有其他简单的方法可以在DB2过程中在控制台中打印消息?
答案 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;
答案 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之类的日志机制,如果您在批处理过程中执行此语句,您可以随时通过查询日志表来获取消息,而不必等到结束时执行。