【发布时间】:2018-06-26 03:20:03
【问题描述】:
我是存储过程开发的新手,我需要将现有的 Oracle 存储过程转换为 DB2 语法。我在异常部分出错,请帮我转换
PS。从异常行开始,我得到了错误
Oracle 过程
:CREATE OR REPLACE PROCEDURE a.pUpsertDivision
( error_code OUT VARCHAR2,
error_msg OUT VARCHAR2,
divId IN INTEGER,
divName IN VARCHAR2,
divDesc IN VARCHAR2,
retiredFlag IN INTEGER
)
AS
BEGIN
MERGE INTO a.DIVISION DIV
USING DUAL
ON
(DIV.DIVISION_ID = divId)
WHEN MATCHED THEN UPDATE
SET DIV.DIV_NAME = divName,
DIV.DIV_DESCRIPTION = divDesc,
DIV.RETIRED_FLAG = retiredFlag
WHEN NOT MATCHED THEN
INSERT (DIVISION_ID,DIV_NAME,DIV_DESCRIPTION,RETIRED_FLAG)
VALUES ((SELECT MAX(DIVISION_ID)+1 FROM a.DIVISION),divName,divDesc,retiredFlag);
Commit;
error_code := '1';
EXCEPTION WHEN DUP_VAL_ON_INDEX THEN
error_code := 'ERROR_CHUPSERT';
WHEN OTHERS THEN
error_code := SQLCODE;
error_msg := SUBSTR(SQLERRM,1,1000);
RAISE_APPLICATION_ERROR(-20001, error_msg || ' Found error at pUpsertDivision');
END pUpsertDivision;
/
我尝试转换为 db2,但在异常部分遇到问题
CREATE OR REPLACE PROCEDURE a.pUpsertDivision
(
OUT error_code VARCHAR(4000),
OUT error_msg VARCHAR(4000),
IN divId INTEGER,
IN divName VARCHAR(4000),
IN divDesc VARCHAR(4000),
IN retiredFlag INTEGER)
)
IS
BEGIN
MERGE INTO a.DIVISION DIV
USING DUAL
ON
(DIV.DIVISION_ID = divId)
WHEN MATCHED THEN UPDATE
SET DIV.DIV_NAME = divName,
DIV.DIV_DESCRIPTION = divDesc,
DIV.RETIRED_FLAG = retiredFlag
WHEN NOT MATCHED THEN
INSERT (DIVISION_ID,DIV_NAME,DIV_DESCRIPTION,RETIRED_FLAG)
VALUES ((SELECT MAX(DIVISION_ID)+1 FROM a.DIVISION),divName,divDesc,retiredFlag);--
Commit;--
**EXCEPTION WHEN DUP_VAL_ON_INDEX THEN
set error_code ='ERROR_CHUPSERT';--
WHEN OTHERS THEN
set error_code= SQLCODE;--
set error_msg = SUBSTR(SYSPROC.SQLERRM,1,1000);--
RAISE_APPLICATION_ERROR(-20001, error_msg || ' Found error at pUpsertDivision');--**
END;
/
【问题讨论】:
-
您在过程中混合了 PL/SQL (Oracle) 和 SQL PL (Db2) 语法。选择一个并坚持下去(注意,如果你想使用 PL/SQL,你需要启用 Oracle 兼容性)。
标签: oracle stored-procedures db2