SQL 脚本在到达第一个触发器 END 后停止编译

SQL script stops compiling after reaching first trigger END

每次我尝试 运行 我的数据库脚本时,我都会到达包含我的 2 个触发器的最后几行,并且我的脚本在编译第一个触发器后停止。

这些是我拥有的 2 个触发器,它编译 "Player Round Trigger" 然后脚本停止并且没有到达我的第二个触发器 "Handicap Trigger"

--
-- Player Round Trigger
--
CREATE TRIGGER playerRoundUpdateAudit BEFORE UPDATE ON PlayerRound
  FOR EACH row BEGIN
    INSERT INTO PlayerRoundAudit(old_data_PlayerID, old_data_RoundID, old_data_Holenumber, old_data_holeScore,
    new_data_PlayerID, new_data_RoundID, new_data_Holenumber, new_data_holeScore, tbl_name) 
    VALUES (OLD.playerID, OLD.roundID, OLD.holeNumber, OLD.holeScore, NEW.playerID, NEW.roundID, NEW.holeNumber, NEW.holeScore, "PlayerRound");
END;
/


--
-- Handicap Trigger
--
CREATE TRIGGER handicapUpdateAudit BEFORE UPDATE ON Handicap
  FOR EACH row BEGIN
    INSERT INTO HandicapAudit(old_data_handicapID, old_data_playerID, old_data_handicapDate, old_data_handicapScore,
    new_data_handicapID, new_data_playerID, new_data_handicapDate, new_data_handicapScore, tbl_name) 
    VALUES (OLD.handicapID, OLD.playerID, OLD.handicapDate, OLD.handicapScore, NEW.handicapID, NEW.playerID, NEW.handicapDate, NEW.handicapScore, "Handicap");
END;
/

我正在 运行在 Oracle SQL 开发人员版本 4.1.2.20(最新的一台 atm)中安装脚本

我对 Oracle SQL Developer 不是很熟悉,但是是否可以选择 运行 脚本作为 "Execute as script"?此功能在 TOAD 上可用...

实际上第一个触发器编译错误,并破坏了脚本。

你可以做个实验——把第一个触发器的header改成CREATE OR REPLACE TRIGGER ....,
然后在 SQL 开发人员中单击第一个触发器以将光标移动到它的代码中,然后按 Ctrl-Enter - 这将在放置光标的位置执行一个语句(实际上 - 第一个触发器的“CREATE”语句)。

然后检查 "Compiler log" window - 您将看到如下消息:

这个触发器有两个问题:

  • 您正在使用 OLD.column_nameNEW.column_name,有什么问题。您需要使用 :OLD.column_name:NEW.column_name,使用冒号作为前缀
  • 您在此处使用双引号而不是引号:"PlayerRound",Oracle 不会将其解释为字符串,而是将其解释为标识符(变量、列名等)。请在引号内使用 'PlayerRound'

像下面这样更改第一个触发器,它应该可以编译:

set define off
CREATE or replace TRIGGER playerRoundUpdateAudit BEFORE UPDATE ON PlayerRound
      FOR EACH row BEGIN
        INSERT INTO PlayerRoundAudit(old_data_PlayerID, old_data_RoundID,
                    old_data_Holenumber, old_data_holeScore,
                    new_data_PlayerID, new_data_RoundID, new_data_Holenumber, 
                    new_data_holeScore, tbl_name) 
        VALUES (:OLD.playerID, :OLD.roundID, :OLD.holeNumber, :OLD.holeScore, 
              :NEW.playerID, :NEW.roundID, :NEW.holeNumber, :NEW.holeScore, 'PlayerRound');
end;
/

您还需要更正第二个触发器,因为它包含类似的错误。


注意:将SET DEFINE OFF放入脚本中以关闭变量替换,否则SQL-Developer将提示为每个:NEW:OLD输入一个值