【问题标题】:DB2 IMPORT from Stored Procedure从存储过程导入 DB2
【发布时间】:2020-10-30 12:43:04
【问题描述】:

我正在尝试编写一个程序来验证导入期间是否存在任何问题,以便我可以提出错误。因此,我在存储过程中编写了以下 SQL 块。但是我总是为所有获取的值(actualRowCountskippedRowCountimportedRowCountupdatedRowsrejectedRowscommittedRows)得到一个空值,msgs 除外。

我无法找到为什么我只能获得 msgs 的值而不是其他人的值。它们都应该至少具有0 作为值。请假设已经在程序中声明了所有必要的变量。

当我在 If 块之外执行 RAISE_APPLICATION_ERROR 以进行测试时,我得到一个 DB2 SQL-Error: -438,当我尝试使用 Put_LINE 打印时得到一个空错误

Begin Atomic
CALL SYSPROC.ADMIN_CMD( 'IMPORT FROM /tmp/city.ixf  OF ixf MESSAGES ON SERVER INSERT INTO city');
ASSOCIATE RESULT SET LOCATORS(resultSet) WITH PROCEDURE SYSPROC.ADMIN_CMD;
ALLOCATE C1 CURSOR FOR RESULT SET resultSet;
FETCH  C1 INTO actualRowCount, skippedRowCount , importedRowCount, updatedRows, rejectedRows, committedRows, msgs;
IF actualRowCount <> importedRowCount THEN
 CALL RAISE_APPLICATION_ERROR(-20040, 'import fail:' || msgs);
END IF;
Close C1;
End;

【问题讨论】:

  • 结果集包含 8 列,而不是 7 列。您应该运行在第 7 个参数中返回的动态选择语句并处理其结果集以了解导入发生了什么。最后,您应该动态运行第 8 个参数中返回的 call 语句,以从服务器的文件系统中清除相应的消息。见IMPORT using ADMIN_CMD

标签: stored-procedures db2 resultset db2-luw


【解决方案1】:

使用 ADMIN_CMD 进行 IMPORT 的示例消息处理程序:

--#SET TERMINATOR @

SET SERVEROUTPUT ON@

BEGIN
  DECLARE actualRowCount, skippedRowCount, importedRowCount, updatedRows, rejectedRows, committedRows BIGINT;
  DECLARE msg_sel, msg_del VARCHAR(128);
  DECLARE SQLSTATE CHAR(5);
  DECLARE V_SQLCODE VARCHAR(10);
  DECLARE V_MSG VARCHAR(1024);
  DECLARE resultSet RESULT_SET_LOCATOR VARYING;
  DECLARE C2 CURSOR FOR S2;

  CALL SYSPROC.ADMIN_CMD('IMPORT FROM /tmp/city.ixf  OF ixf MESSAGES ON SERVER INSERT INTO city');
  ASSOCIATE RESULT SET LOCATORS (resultSet) WITH PROCEDURE SYSPROC.ADMIN_CMD;
  ALLOCATE C1 CURSOR FOR RESULT SET resultSet;
  FETCH  C1 INTO actualRowCount, skippedRowCount , importedRowCount, updatedRows, rejectedRows, committedRows, msg_sel, msg_del;
  CLOSE C1;
  IF COALESCE(msg_sel, '') <> '' THEN
    CALL DBMS_OUTPUT.PUT_LINE('msg_sel: ' || msg_sel);
    PREPARE S2 FROM msg_sel;
    OPEN C2;
    L2: LOOP
      FETCH C2 INTO V_SQLCODE, V_MSG; 
      IF SQLSTATE = '02000' THEN LEAVE L2; END IF;
      CALL DBMS_OUTPUT.PUT_LINE(V_SQLCODE || ': ' || V_MSG);
    END LOOP L2;
    CLOSE C2;
  END IF;
  CALL DBMS_OUTPUT.PUT_LINE('msg_del: ' || msg_del);
  EXECUTE IMMEDIATE msg_del;
END@

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-25
    • 2014-10-26
    • 2019-11-10
    • 2015-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多