2015-11-06 77 views
1

新與PL/SQL工作,並試圖創建一個語句級觸發器,它們將在「重排」的值更改爲「是」,當產品數量(p_qoh)或者是小於10或小於產品最小值(p_min)的兩倍。如果情況並非如此,那麼將「重新排序」值更改爲「否」。我的問題是,當我對特定產品進行更新時,它改變了這一切,而不是行的一個我指定的重排序值。似乎無法弄清楚我出錯的地方,認爲我一直盯着它太久,任何幫助都不勝感激。PL/SQL更新觸發更新所有行

CREATE OR REPLACE TRIGGER TRG_AlterProd 
AFTER INSERT OR UPDATE OF p_qoh, p_min ON product 
DECLARE 
    v_p_min product.p_min%type; 
    v_p_qoh product.p_qoh%type; 
CURSOR v_cursor IS SELECT p_min, p_qoh FROM product; 
BEGIN 
    OPEN v_cursor; 
LOOP 
    FETCH v_cursor INTO v_p_min, v_p_qoh; 
    EXIT WHEN v_cursor%NOTFOUND; 
IF v_p_qoh < (v_p_min * 2) OR v_p_qoh < 10 THEN 
UPDATE product SET p_reorder = 'Yes'; 
ELSE 
    UPDATE product SET p_reorder = 'No'; 
END IF; 
END LOOP; 
END; 
/
+1

您更新不包括其中 – kevinsky

回答

2

update命令:

UPDATE product SET p_reorder = 'Yes'; 

更新所有的行,因爲你沒有指定一個WHERE條款。 你可以做的是檢索該產品的ID使用光標,並保存它,這樣你會使用這種方式(PRODUCT_ID):

UPDATE product SET p_reorder = 'Yes' WHERE id = product_id; 
+0

啊,謝謝! – StevieP

+0

不客氣。 –

0

Whoaa,這是不是你做的觸發器。

1 - 閱讀Oracle Trigger Documentation

2 - (幾乎)永遠不會做一個在觸發提交。這是調用應用程序的領域。

3 - 沒有必要選擇相關產品的任何東西。您已經擁有了新的和舊的僞記錄的產品記錄。只需根據需要更新:新的列值。下面的示例(未檢查語法錯誤等);

CREATE OR REPLACE TRIGGER TRG_AlterProd 
BEFORE INSERT OR UPDATE OF p_qoh, p_min ON product 
FOR EACH ROW 
BEGIN 

IF :new.p_qoh < (:new.p_min * 2) OR :new.p_qoh < 10 THEN 
    :new.p_reorder = 'Yes'; 
ELSE 
    :new p_reorder = 'No'; 
END IF; 
END; 
+1

實現的承諾是沒有必要的,我知道一個行級觸發器會更容易和更短的,但是,我執行語句級觸發器 – StevieP

0

@StevieP,如果你需要一個觸發內提交,你可能要考慮這樣做的Autonomous Transaction

另外,抱歉,如果我對你的問題陳述的理解是錯誤的,但你的聽起來像是一個行級觸發器 - 你只更新當前行還是正在掃描整個表以改變幾行的狀態?如果它在當前行,@ OldProgrammer的解決方案似乎是正確的。

,我只是好奇,如果你在同一個表執行觸發器中的UPDATE語句,是不是產生(遞歸)觸發(S)?我還沒有完成這樣的語句觸發器,所以很抱歉,如果這不是預期的觸發器行爲。

對於我來說,一個語句觸發器會更有意義,如果觸發器是銷售表,當產品銷售時(插入銷售表),它會觸發相應的產品ID記錄被更新(到REORDER )在產品表中。這也可以防止遞歸危險。