Oracle触发器错误:缺少左括号

rjjhvcjd  于 2023-01-12  发布在  Oracle
关注(0)|答案(1)|浏览(132)

有人能帮我弄到这个触发器吗。

CREATE or replace trigger check_limit_to_Y
AFTER INSERT OR UPDATE ON api_user for each row
WHEN EXISTS (SELECT '1' FROM profile b WHERE  NEW.mvno_limit!='Y' and b.mvno_id = NEW.mvno_id)
BEGIN
   raise_application_error (-20999,'MVNO LIMIT MUST BE SET Y FOR ANY REAL MVNO_ID');
END;

我得到了错误

Error report -
ORA-00906: missing left parenthesis
00906. 00000 -  "missing left parenthesis"
*Cause:    
*Action:
jjhzyzn0

jjhzyzn01#

这来自Oracle站点:https://docs.oracle.com/cd/E11882_01/appdev.112/e25519/create_trigger.htm#LNPLS01374
WHEN (condition)
指定数据库为触发语句影响的每一行计算的SQL条件。如果受影响行的condition值为TRUE,则为该行运行tps_body;否则,tps_body不会为该行运行。无论condition的值如何,触发语句都会运行。
condition可以包含相关名(请参见referencing_clause ::=)。在condition中,不要在相关名NEWOLDPARENT之前放置冒号(:)(在此上下文中,它不是绑定变量的占位符)。
有关SQL条件的信息,另请参阅:Oracle Database SQL Language Reference
WHEN (condition)的限制

  • 如果指定此子句,则还必须至少指定以下时间点之一:
  • BEFORE EACH ROW
  • AFTER EACH ROW
  • INSTEAD OF EACH ROW
  • 条件不能包括子查询或PL/SQL表达式(例如,调用用户定义的函数)。

您的代码似乎不满足最后两个限制(还有:WHEN关键字后面的整个条件必须用括号括起来)。
但是,您似乎需要使用“复合触发器语法”,因为您希望同时处理插入和更新。请仔细查看文档。

更新:尝试以下操作:

CREATE TRIGGER t
  BEFORE INSERT OR UPDATE ON api_user FOR EACH ROW
  
DECLARE  CNT integer; 
BEGIN
  SELECT count(*) into CNT FROM profile b where :NEW.mvno_limit!='Y' and b.mvno_id = :NEW.mvno_id;
  IF CNT > 0 THEN
      RAISE_APPLICATION_ERROR(-20999,'MVNO LIMIT MUST BE SET Y FOR ANY REAL MVNO_ID');
  END IF;
END;

相关问题