这是在Oracle 11上完成的,我正在尝试创建一个触发器,如果传入符合某些值,则更新另一个表。
--CREATE TRIGGER ON ITX
CREATE OR REPLACE TRIGGER TRG_I_LAST_RECEIVED
AFTER INSERT ON ITEM_TRANSACTION_LOG
FOR EACH ROW
WHEN (
NEW.ITEM_CONDITION_ID = 5005 -- REPAIRED
AND NEW.WORKCENTER_ID IN (5001,5006,5063,5000,5022,5062) -- EWRC
AND NEW.ORDER_ITEM_OPER_ID = 5009 -- Perform Exit Routing
)
BEGIN
UPDATE PART
SET LAST_REPAIRED = SYSDATE
WHERE PART_NO = :NEW.ITEM_PART_NO; --add that semicolon!
END;
当我这样做时,它会添加它,但我得到了这个(ORA-24344):
现在,我对SQL的理解相当不错(T-SQL),也许我错过了一些东西 - 有人可以注意这一点并告诉我为什么它无效吗?
修改: 更新声明结束时,问题是缺少分号。甲骨文的分号差异有时会让我感到疯狂。
这是正确的陈述,感谢Justin Cave找到它:
...
var t = 0;
function next() {
if (t) return;
imgCount++;
if (imgCount > totalImgs) imgCount = 0
document.getElementById("slideshow").src = imageGallery[imgCount];
}
function previous() {
if (t) return;
imgCount--;
if (imgCount < 0) imgCount = totalImgs;
document.getElementById("slideshow").src = imageGallery[imgCount];
}
...
document.getElementById("slideshow").onload = function(){
var obj = this;
var nextSibling = obj.nextSibling;
while(nextSibling && nextSibling.nodeType != 1) {
nextSibling = nextSibling.nextSibling
}
nextSibling.className = 'fade';
t = setTimeout(function(){
nextSibling.className = '';
nextSibling.src = obj.src;
t = 0;
}, 1000);
}
答案 0 :(得分:1)
您的update
语句最后缺少分号。由于听起来你来自T-SQL背景,在SQL Server中,分号通常是可选的。他们总是在Oracle中需要它们
BEGIN
UPDATE PART
SET LAST_REPAIRED = SYSDATE
WHERE PART_NO = :NEW.ITEM_PART_NO;
END;
答案 1 :(得分:0)
我不确定,但似乎你必须指定重新加入:NEW
它应该看起来像:
CREATE OR REPLACE TRIGGER TRG_I_LAST_RECEIVED
AFTER INSERT ON ITEM_TRANSACTION_LOG
REFERENCING OLD AS OLD NEW AS NEW
FOR EACH ROW...
在当前情况下,由于当前触发类型,对OLD
的引用将为空记录。如果它是AFTER UPDATE
触发器,那么对OLD
的引用将是更新操作之前的表记录的值。
答案 2 :(得分:0)
很可能你错过了&#34;:&#34;之前&#34; NEW.ITEM_CONDITION_ID&#34;和其他人一样,当然还有#34; Justin Cave&#34;提到你需要&#34;;&#34;在更新声明之后。