2015-05-27 70 views
0

我有以下Oracle存儲過程。無論是子代碼還是stylecode都會被傳入。目前,如果值不爲空,它將更新行。我想添加邏輯,以便僅在表格中存在行時進行更新,如果不存在,我喜歡打印「子代碼xxxx不存在」或「stylecode xxxx不存在」之類的消息。我不認爲這裏融入作品。如果存在記錄,Oracle存儲過程更新行

create or replace PROCEDURE "REMOVE_PRICES" 
(
    RESULT OUT VARCHAR2 
    , STYLECODE_ IN NUMBER 
    , SUBCODE_ IN NUMBER 
) AS 
BEGIN 
IF (SUBCODE_ is null AND STYLECODE_ is null) 
THEN 
    raise_application_error(-20005, 'ERROR: Please provide either SUBCODE or STYLECODE!'); 
END IF; 
IF SUBCODE_ IS NOT NULL THEN 
    UPDATE prices 
    SET type = null 
    WHERE subcode=SUBCODE_; 
    RESULT := SQL%ROWCOUNT || ' price for subcode ' || SUBCODE_ || ' is removed'; 

ELSIF STYLECODE_ IS NOT NULL THEN 
    UPDATE prices 
    SET type = null 
    WHERE stylecode=STYLECODE_; 
    RESULT := SQL%ROWCOUNT || ' price for stylecode ' || STYLECODE_ || ' is removed'; 
END IF; 
END REMOVE_PRICES; 
+1

你就不能決定顯示基於SQL%ROWCOUNT是否是消息零還是非零? –

+0

謝謝亞歷克斯。我被矇蔽了。:) – user2482822

回答

1

您不僅可以選擇做更新,如果除非你在相同的條件查詢第一,做一個計數會影響行;並且您仍然可能與其他會話存在爭用條件,這意味着數據可能會在selectupdate之間更改,除非您鎖定了行。這似乎有點過分和昂貴。

你可以只檢查SQL%ROWCOUNT值並顯示該消息,如果它是零,或者你目前的消息,否則:

IF SUBCODE_ IS NOT NULL THEN 
    UPDATE prices 
    SET type = null 
    WHERE subcode=SUBCODE_; 
    IF SQL%ROWCOUNT = 0 then 
    RESULT := 'The subcode ' || SUBCODE || ' does not exist'; 
    ELSE 
    RESULT := SQL%ROWCOUNT || ' price for subcode ' || SUBCODE_ || ' is removed'; 
    END IF; 
ELSIF STYLECODE_ IS NOT NULL THEN 
    UPDATE prices 
    SET type = null 
    WHERE stylecode=STYLECODE_; 
    IF SQL%ROWCOUNT = 0 then 
    RESULT := 'The stylecode ' || STYLECODE || ' does not exist'; 
    ELSE 
    RESULT := SQL%ROWCOUNT || ' price for stylecode ' || STYLECODE_ || ' is removed'; 
    END IF; 
END IF;