stored-procedures - 从存储过程导入 DB2
问题描述
我正在尝试编写一个程序来验证导入过程中是否有任何问题,以便我可以提出错误。因此,我在存储过程中编写了以下 SQL 块。但是我总是为所有获取的值(actualRowCount
, skippedRowCount
, importedRowCount
, updatedRows
, rejectedRows
, committedRows
)得到一个空值,除了msgs
.
我无法找到为什么我只能为 themsgs
而不是为其他人获得价值。它们都应该至少0
具有价值。请假设已经在程序中声明了所有必要的变量。
DB2 SQL-Error: -438
当我出于测试目的在 If 块之外执行操作时,我得到一个RAISE_APPLICATION_ERROR
,当我尝试使用打印时得到一个空错误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;
解决方案
带有 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@
推荐阅读
- android - 我在删除图像按钮背景时遇到错误
- c# - 调整图片框宽度并保持纵横比
- python - Python SQLAlchemy:psycopg2.ProgrammingError 关系已经存在?
- java - 在 Windows 10 上使用 Maven 构建 BioJava 5.0
- c# - C#跨依赖接口问题
- amazon-web-services - 使用 CloudFormation 创建 Amazon RDS 快照
- ruby-on-rails - 如果唯一性验证失败,如何销毁数据库记录?
- variables - 将多个 netcdf 文件合并为一个 netcdf 文件
- mongodb - Laravel Mongodb 错误
- docker - 你应该在哪里存储你的 docker 配置文件?