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,

关于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,
    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。