ORACLE IF-ELSE分支复杂性
关于oracle过程中的if-else分支,我有一个问题。所以我有一个疑问ORACLE IF-ELSE分支复杂性,oracle,plsql,Oracle,Plsql,关于oracle过程中的if-else分支,我有一个问题。所以我有一个疑问 CREATE OR REPLACE PROCEDURE WELTESADMIN.SP_MST_ERC_UPD ( p_HEAD_MARK IN VARCHAR2, p_PROJECT_NAME IN VARCHAR2, p_COMP_TYPE IN VARCHAR2, p_ONSITE_UPD_QTY IN INTEGER, p_PREP_UPD_QTY IN INTEGER,
CREATE OR REPLACE PROCEDURE WELTESADMIN.SP_MST_ERC_UPD
(
p_HEAD_MARK IN VARCHAR2,
p_PROJECT_NAME IN VARCHAR2,
p_COMP_TYPE IN VARCHAR2,
p_ONSITE_UPD_QTY IN INTEGER,
p_PREP_UPD_QTY IN INTEGER,
p_ERECT_UPD_QTY IN INTEGER,
p_QC_UPD_QTY IN INTEGER,
p_UPD_SIGN IN VARCHAR
)
AS
/* IF NOT THEN.. ; WHEN THE RECORD EXISTS DO THIS... */
BEGIN
UPDATE MST_ERC_UPD
SET
ONSITE_UPD_QTY = p_ONSITE_UPD_QTY,
PREP_UPD_QTY = p_PREP_UPD_QTY,
ERECT_UPD_QTY = p_ERECT_UPD_QTY,
QC_UPD_QTY = p_QC_UPD_QTY
WHERE
HEAD_MARK = p_HEAD_MARK AND
PROJECT_NAME = p_PROJECT_NAME AND
COMP_TYPE = p_COMP_TYPE;
INSERT INTO DTL_ERC_UPD ( /* THIS ACTS AS A HISTORY TABLE THAT RECORDS EVERY OCCURENCE */
HEAD_MARK, PROJECT_NAME, COMP_TYPE,
ONSITE_UPD_QTY, PREP_UPD_QTY, ERECT_UPD_QTY, QC_UPD_QTY,
UPD_DATE, UPD_SIGN, UPD_INFO
) VALUES (
p_HEAD_MARK, p_PROJECT_NAME, p_COMP_TYPE,
p_ONSITE_UPD_QTY, p_PREP_UPD_QTY, p_ERECT_UPD_QTY, p_QC_UPD_QTY,
SYSDATE, p_UPD_SIGN, 'UPDATE'
);
/* WHEN THE RECORD IS NOT EXISTS DO THIS */
IF SQL%ROWCOUNT = 0 THEN
INSERT INTO MST_ERC_UPD
(
HEAD_MARK, PROJECT_NAME, COMP_TYPE,
ONSITE_UPD_QTY, PREP_UPD_QTY, ERECT_UPD_QTY, QC_UPD_QTY
)
VALUES
(
p_HEAD_MARK, p_PROJECT_NAME, p_COMP_TYPE,
p_ONSITE_UPD_QTY, p_PREP_UPD_QTY, p_ERECT_UPD_QTY, p_QC_UPD_QTY
);
/* THIS ACTS AS A HISTORY TABLE THAT RECORDS EVERY OCCURENCE */
INSERT INTO DTL_ERC_UPD
(
HEAD_MARK, PROJECT_NAME, COMP_TYPE,
ONSITE_UPD_QTY, PREP_UPD_QTY, ERECT_UPD_QTY, QC_UPD_QTY,
UPD_DATE, UPD_SIGN, UPD_INFO
)
VALUES
(
p_HEAD_MARK, p_PROJECT_NAME, p_COMP_TYPE,
p_ONSITE_UPD_QTY, p_PREP_UPD_QTY, p_ERECT_UPD_QTY, p_QC_UPD_QTY,
SYSDATE, p_UPD_SIGN, 'NEWENTRY'
);
END IF;
COMMIT;
END SP_MST_ERC_UPD;
因此,我在这里分支的问题是,当记录不存在时,不会执行查询(状态为“NEWENTRY”的新插入永远不会执行)。请帮我解决这个分支问题。。。谢谢您的问题是,您正在测试在
最后一个
sql命令之后是否没有受影响的行
--UPDATE
--INSERT
IF SQL%ROWCOUNT = 0 THEN
这永远不会是真的,因为您的上一个命令是INSERT
命令。要测试Update命令是否更改了某些内容,必须通过Update命令创建一个变量来存储修改后的行,如下所示:
...
AS
numChangedRows NUMBER;
BEGIN
numChangedRows:=0;
--Your Update command
numChangedRows:=SQL%ROWCOUNT;
--Your insert command
IF numChangedRows = 0 THEN
...
使用调试来查看SQL%发生了什么,比如
DBMS\u输出.PUT\u行(SQL%ROWCOUNT)代码>在此之前,如果。别忘了打开输出,所以我已经调试了每个行为唯一的问题是更新后插入(第二块)谢谢campos。。我发现更新后使用触发器更适用于此。@KonzMama-您可能还想看看merge
语句;您可能根本不需要使用PL/SQL。