【问题标题】:Create/replace trigger in Squirrel在 Squirrel 中创建/替换触发器
【发布时间】:2010-12-02 09:05:01
【问题描述】:

我用的是松鼠 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"

这和松鼠有关系吗?如果是这样,我该如何解决?

【问题讨论】:

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

标签: oracle squirrel-sql


【解决方案1】:

你应该在 SQuirrel 中卸载 "sqlparam" 插件,之后它不会要求你为 ":paramName" 变量填充值

【讨论】:

  • 是的!它可以工作,并且触发器在 Oracle 中创建并有效!
【解决方案2】:

您可能希望在触发器中添加 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 等)执行该语句。

分享和享受。

【讨论】:

  • 什么都不做,如果你想引用新的东西,你最好把它重命名为新的东西,比如n
猜你喜欢
  • 2016-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-22
  • 2018-03-04
  • 2013-12-24
  • 2013-05-30
  • 2018-02-07
相关资源
最近更新 更多