2015-01-24 3 views
-1

У меня есть вопрос относительно того, если иначе ветвление в процедуре оракула. поэтому у меня есть этот запрос,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» никогда не получите выполнения). Пожалуйста, помогите мне с этой разветвлений проблемы ... спасибо

+0

Использование отладки, чтобы увидеть, что происходит с SQL% что-то вроде 'DBMS_OUTPUT. PUT_LINE (SQL% ROWCOUNT); 'перед этим if. Do'nt забудьте включить вывод –

+0

Так что я уже отлаживаю каждое поведение, единственная проблема - вставка после обновления (2-й блок) –

ответ

1

Ваша проблема заключается в том, что вы проверяете, если нет строки, в которых затронуты после команды LAST SQL

--UPDATE 
--INSERT 
IF SQL%ROWCOUNT = 0 THEN 

Который никогда не будет верно, так как ваша последняя команда не является INSERT команда. Для того, чтобы проверить, если ваша команда Update изменилось то, что вам нужно создать переменную для хранения измененных строк с помощью команды обновления что-то вроде этого:

... 
AS 
numChangedRows NUMBER; 
BEGIN 
    numChangedRows:=0; 
    --Your Update command 
    numChangedRows:=SQL%ROWCOUNT; 
    --Your insert command 
    IF numChangedRows = 0 THEN 
... 
+2

Спасибо campos .. Я понял, что использование триггера после обновления более применимо при использовании этого. –

+0

@ KonzMama - вы также можете посмотреть на выражение 'merge'; вам может не понадобиться PL/SQL вообще. –

Смежные вопросы