问题 在Squirrel中创建/替换触发器


我用的是松鼠3.2.0 当我尝试替换此触发器时:

CREATE OR REPLACE TRIGGER crw_ins_trig
  BEFORE INSERT OR UPDATE ON crew
  FOR EACH ROW
DECLARE

BEGIN
    if (:new.crw_id is null) then
        select crw_id_seq.nextval
        into :new.crw_id
        from dual;
    end if;  
END;
/

我收到消息“请输入参数值。值为':new'”

单击“确定”后,结果消息为:

Warning:   Warning: execution completed with warning
SQLState:  null
ErrorCode: 17110
Position: 27

Query 1 of 1, Rows read: 0, Elapsed time (seconds) - Total: 0.023, SQL query: 0.023, Building output: 0

在我的应用程序中,我收到错误 "ORA-04098: trigger 'CRW_INS_TRIG' is invalid and failed re-validation"

这与Squirrel有关吗?如果是这样,我该如何解决?


12781
2017-12-02 09:05


起源

问题可能是DECLARE和BEGIN之间的空白行。也许Squirrel将前四行解释为CREATE TRIGGER命令(导致触发无效),然后尝试将BEGIN-END块作为匿名块执行。 - Jeffrey Kemp


答案:


您应该在SQuirrel中卸载“sqlparam”插件,之后它不会要求您填充“:paramName”变量的值


15
2017-11-02 19:52



是!它的工作原理和触发器在Oracle中创建并且有效! - Guus


您可能希望在触发器中添加REFERENCING行,使其看起来像

CREATE OR REPLACE TRIGGER crw_ins_trig  
  BEFORE INSERT OR UPDATE ON crew  
  REFERENCING NEW AS NEW
              OLD AS OLD
  FOR EACH ROW  
BEGIN  
    if (:new.crw_id is null) then  
        select crw_id_seq.nextval  
        into :new.crw_id  
        from dual;  
    end if;    
END crw_ins_trig;

试试吧。如果它不起作用,请尝试使用其他工具(例如SQL * Plus,PL / SQL Developer,Toad等)执行该语句。

分享和享受。


0
2017-12-02 12:06



没有做任何事情,如果你想引用new作为某些东西,你最好将它重命名为new,而不是n - Alex