PL/SQL更新触发更新所有行
新与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;
/
update命令:
UPDATE product SET p_reorder = 'Yes';
更新所有的行,因为你没有指定一个WHERE
条款。 你可以做的是检索该产品的ID使用光标,并保存它,这样你会使用这种方式(PRODUCT_ID):
UPDATE product SET p_reorder = 'Yes' WHERE id = product_id;
啊,谢谢! – StevieP
不客气。 –
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;
实现的承诺是没有必要的,我知道一个行级触发器会更容易和更短的,但是,我执行语句级触发器 – StevieP
@StevieP,如果你需要一个触发内提交,你可能要考虑这样做的Autonomous Transaction。
另外,抱歉,如果我对你的问题陈述的理解是错误的,但你的听起来像是一个行级触发器 - 你只更新当前行还是正在扫描整个表以改变几行的状态?如果它在当前行,@ OldProgrammer的解决方案似乎是正确的。
,我只是好奇,如果你在同一个表执行触发器中的UPDATE语句,是不是产生(递归)触发(S)?我还没有完成这样的语句触发器,所以很抱歉,如果这不是预期的触发器行为。
对于我来说,一个语句触发器会更有意义,如果触发器是销售表,当产品销售时(插入销售表),它会触发相应的产品ID记录被更新(到REORDER )在产品表中。这也可以防止递归危险。
您更新不包括其中 – kevinsky