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

SQL脚本在到达第一个触发器结束后停止编译,sql,oracle,plsql,database-trigger,Sql,Oracle,Plsql,Database Trigger,每次我尝试运行数据库脚本时,我都会到达包含两个触发器的最后几行,并且我的脚本在编译第一个触发器后停止 这是我的两个触发器,它编译了“玩家回合触发器”,然后脚本停止,没有达到我的第二个触发器“障碍触发器” 我正在Oracle SQL Developer版本4.1.2.20(最新的atm)中运行该脚本。我对Oracle SQL Developer不是很熟悉,但是否可以选择“作为脚本执行”来运行该脚本?此功能在TOAD上可用…我对Oracle SQL Developer不太熟悉,但是否可以选择“作为脚

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

这是我的两个触发器,它编译了“玩家回合触发器”,然后脚本停止,没有达到我的第二个触发器“障碍触发器”


我正在Oracle SQL Developer版本4.1.2.20(最新的atm)中运行该脚本。

我对Oracle SQL Developer不是很熟悉,但是否可以选择“作为脚本执行”来运行该脚本?此功能在TOAD上可用…

我对Oracle SQL Developer不太熟悉,但是否可以选择“作为脚本执行”来运行脚本?此功能在蟾蜍上可用。

实际上,第一个触发器编译时出错,并中断脚本。

您可以做一个实验-将第一个触发器的头更改为
创建或替换触发器…

然后在SQL Developer中,单击第一个触发器将光标移动到其代码中,然后按Ctrl-Enter键-这将在光标所在的位置执行一条语句(实际上是第一个触发器的“CREATE”语句)。

然后检查“编译器日志”窗口-您将看到如下消息:

此触发器有两个问题:

  • 您使用的是
    OLD.column\u name
    NEW.column\u name
    ,有什么问题吗。您需要使用
    :OLD.column\u name
    :NEW.column\u 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
输入值。实际上,第一个触发器编译时出错,并中断脚本。

您可以做一个实验-将第一个触发器的头更改为
创建或替换触发器…

然后在SQL Developer中,单击第一个触发器将光标移动到其代码中,然后按Ctrl-Enter键-这将在光标所在的位置执行一条语句(实际上是第一个触发器的“CREATE”语句)。

然后检查“编译器日志”窗口-您将看到如下消息:

此触发器有两个问题:

  • 您使用的是
    OLD.column\u name
    NEW.column\u name
    ,有什么问题吗。您需要使用
    :OLD.column\u name
    :NEW.column\u 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

输入一个值,错误是什么?@a_horse_和_no_name没有错误。在编译完第一个触发器后,脚本刚刚完成,没有错误。它没有达到第二次触发,你是怎么启动的?F5?@hinotf是的,我用F5运行它。@重述很奇怪,但为什么是OLD而不是:OLD?有什么错误吗?@a_horse_和_no_name没有错误。在编译完第一个触发器后,脚本刚刚完成,没有错误。它没有达到第二次触发,你是怎么启动的?F5?@hinotf是的,我用F5运行它。@重述很奇怪,但为什么是OLD而不是:OLD?