ИМПОРТ DB2 из хранимой процедуры - PullRequest
0 голосов
/ 09 июля 2020

Я пытаюсь написать процедуру, чтобы проверить, возникли ли какие-либо проблемы во время импорта, чтобы я мог вызвать ошибку. Итак, я написал следующий блок SQL внутри своей хранимой процедуры. Но я всегда получаю нулевое значение для всех выбранных значений (actualRowCount, skippedRowCount, importedRowCount, updatedRows, rejectedRows, committedRows), кроме msgs.

Я не могу понять, почему я должен получать значения только для msgs, но не для других. Все они должны иметь значение не менее 0. Предположим, что все необходимые переменные уже объявлены в процедуре.

Я получаю DB2 SQL-Error: -438, когда делаю RAISE_APPLICATION_ERROR за пределами блока If в целях тестирования, и получаю нулевую ошибку при попытке печати с использованием 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;

1 Ответ

2 голосов
/ 10 июля 2020

Пример обработчика сообщений для IMPORT с ADMIN_CMD:

--#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@
...