Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有if语句的PLSQL触发器_Sql_Plsql_Triggers_Sql Update - Fatal编程技术网

带有if语句的PLSQL触发器

带有if语句的PLSQL触发器,sql,plsql,triggers,sql-update,Sql,Plsql,Triggers,Sql Update,我对PL SQL非常陌生,我正在尝试编写一个触发器,当表a中的一个字段被更新时触发,然后去更新表B中的一个字段 第二个表可能没有任何相关记录,或者可能有许多行(在这种情况下,我需要更新所有行) 根据表A中更新的值(称为HNCMA.AGREEMENT\u EOI.STATUS),我希望影响表B中更新的值(称为LMD.LM\u ACTIVITY\u.ACTIVITY\u STATUS\u CODE) 这是我目前得到的,但我得到了一个错误: PLS-00103:在预期以下情况时遇到符号“=”:=。(@

我对PL SQL非常陌生,我正在尝试编写一个触发器,当表a中的一个字段被更新时触发,然后去更新表B中的一个字段

第二个表可能没有任何相关记录,或者可能有许多行(在这种情况下,我需要更新所有行)

根据表A中更新的值(称为HNCMA.AGREEMENT\u EOI.STATUS),我希望影响表B中更新的值(称为LMD.LM\u ACTIVITY\u.ACTIVITY\u STATUS\u CODE)

这是我目前得到的,但我得到了一个错误:

PLS-00103:在预期以下情况时遇到符号“=”:=。(@%

任何帮助都将不胜感激

谢谢


更新*

感谢@heaps的帮助。我已经修改了代码,加入了CASE函数,并修复了格式错误。这是我到目前为止得到的结果(当我取出update语句时,它就起作用了),但我现在收到了一个“SQL命令未正确结束”错误

救命

创建或替换触发器TR_更新_LMDB_状态1

AFTER UPDATE OF STATUS ON HNCMA.AGREEMENTS_EOI
FOR EACH ROW 

DECLARE

VarStatus Varchar(50);
VarStatusCode Int;

BEGIN

VarStatus := :new.status;

CASE varstatus

WHEN 'Proposed' THEN VarstatusCode := 2;
WHEN 'Recommended' THEN VarStatusCode := 5;
WHEN 'Funded' THEN VarStatusCode := 5;
WHEN 'Completed' THEN VarStatusCode := 6;
WHEN 'Withdrawn' THEN VarStatusCode := 34;

END CASE;

UPDATE LMD.LM_ACTIVITY
SET ACTIVITY_STATUS_CODE = VarStatusCode
FROM (HNCMA.AGREEMENTS_EOI INNER JOIN HNCMA.PROJECT ON HNCMA.AGREEMENTS_EOI.PROJECTID = HNCMA.PROJECT.PROJECTID) INNER JOIN (LMD.LM_POLYGON_PROJECT_REL INNER JOIN LMD.LM_ACTIVITY ON LMD.LM_POLYGON_PROJECT_REL.LMID = LMD.LM_ACTIVITY.LMID) ON HNCMA.AGREEMENTS_EOI.CASENO = LMD.LM_POLYGON_PROJECT_REL.LOCAL_PROJECT_NAME
WHERE (((HNCMA.PROJECT.CATCHMENT)='Murray') AND ((HNCMA.AGREEMENTS_EOI.CASENO)= :old.CASENO )) ;

End;
替换 varstatus=2且
varstatus:=2
如果
然后再试一次

已编辑。对于更新的问题>>

错误
SQL命令未正确结束
是因为您应该使用
UPDATE
命令进行检查

更新中的子句似乎存在问题, 正如我认为的那样,最好尝试一下
UPDATE…如果存在..
MERGE
命令,oracle不支持UPDATE中的FROM子句,您可以将其用作查询

替换 varstatus=2且
varstatus:=2
如果
然后再试一次

已编辑。对于更新的问题>>

错误
SQL命令未正确结束
是因为您应该使用
UPDATE
命令进行检查

更新中的子句似乎存在问题, 正如我认为的那样,最好尝试一下
UPDATE…如果存在..
MERGE
命令,oracle不支持UPDATE中的FROM子句,相反,您可以将其用作查询

您需要
elsif
not
else if
组合多个ifs。有关详细信息,请参阅手册:您需要
elsif
not
else if
组合多个ifs。请参阅详情如下:
AFTER UPDATE OF STATUS ON HNCMA.AGREEMENTS_EOI
FOR EACH ROW 

DECLARE

VarStatus Varchar(50);
VarStatusCode Int;

BEGIN

VarStatus := :new.status;

CASE varstatus

WHEN 'Proposed' THEN VarstatusCode := 2;
WHEN 'Recommended' THEN VarStatusCode := 5;
WHEN 'Funded' THEN VarStatusCode := 5;
WHEN 'Completed' THEN VarStatusCode := 6;
WHEN 'Withdrawn' THEN VarStatusCode := 34;

END CASE;

UPDATE LMD.LM_ACTIVITY
SET ACTIVITY_STATUS_CODE = VarStatusCode
FROM (HNCMA.AGREEMENTS_EOI INNER JOIN HNCMA.PROJECT ON HNCMA.AGREEMENTS_EOI.PROJECTID = HNCMA.PROJECT.PROJECTID) INNER JOIN (LMD.LM_POLYGON_PROJECT_REL INNER JOIN LMD.LM_ACTIVITY ON LMD.LM_POLYGON_PROJECT_REL.LMID = LMD.LM_ACTIVITY.LMID) ON HNCMA.AGREEMENTS_EOI.CASENO = LMD.LM_POLYGON_PROJECT_REL.LOCAL_PROJECT_NAME
WHERE (((HNCMA.PROJECT.CATCHMENT)='Murray') AND ((HNCMA.AGREEMENTS_EOI.CASENO)= :old.CASENO )) ;

End;