插入触发器后sintax错误-ORA-00922



当我的schedule表的user_type是一个";超级用户";。我试图将表/列名转换为";"简化";,所以有些名字可能没有意义,没关系。触发代码:

CREATE OR REPLACE TRIGGER "TR_UPT_SCHEDULE"
AFTER INSERT
ON SCHEDULE
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
DECLARE V_UserCode VARCHAR2(20);
BEGIN
--Find "super user" code.
SELECT UserTypeCode INTO V_UserCode FROM
(SELECT UL.User_Code,
UFT.UserTypeCode,
ROW_NUMBER() OVER (PARTITION BY UL.User_Code ORDER BY UF.UserTypeCode DESC) RN
FROM UserLogin UL
JOIN UserFunction UF
ON UL.User_Code = UF.User_Code
JOIN UserFuncType UFT
ON UFT.UserTypeCode = UF.UserTypeCode
WHERE UFT.FuncType = 'S'
) WHERE RN = 1;
EXCEPTION
WHEN NO_DATA_FOUND THEN
V_UserCode := NULL;
IF V_UserCode IS NOT NULL
THEN UPDATE SCHEDULE
SET :NEW.UserTypeCode = V_UserCode,
OrigScheType = :NEW.UserTypeCode
WHERE CompCode = :NEW.CompCode
AND UserTypeCode = :NEW.UserTypeCode
AND ScheOrigin = :NEW.ScheOrigin
AND ScheCode = :NEW.ScheCode;
END IF;
END;

当我尝试创建触发器时,返回休耕错误:ORA-00922我很确定问题出在UPDATE部分,尝试在WHERE子句中比较Schedule表键,以确定我正在更新(插入(哪一行,但我没有意识到问题。

在触发器中,您不使用update tablename set :new.columnname = some value,而是使用PL/SQL赋值或select into直接将值分配给:new.columnname。因此,从语法的角度来看,最终的更新应该替换为以下内容:

:new.usertypecode := v_usercode;
:new.origschetype := v_usercode;

(我假设更新仅适用于当前行。如果想法是更新触发表中的多行,则不能在行级触发器中执行此操作。(

然而,这种逻辑看起来不起作用:

exception
when no_data_found then
v_usercode := null;

if v_usercode is not null then

此时v_usercode必须为null,因此您没有可以将:new.usertypecode设置为的值,并且我不确定您希望触发器执行什么操作。

最新更新