【问题标题】:Creating a trigger in Oracle Express在 Oracle Express 中创建触发器
【发布时间】:2012-08-23 08:40:42
【问题描述】:

我试图在 Oracle 11g Express 和 SQL Developer 中执行诸如自动增量之类的操作。 我对 Oracle 知之甚少,而且我对触发器也很陌生。

我试过运行它,但我不知道如何正确运行。

CREATE TABLE theschema.thetable
(id NUMBER PRIMARY KEY,
name VARCHAR2(30));

CREATE SEQUENCE theschema.test1_sequence
START WITH 1
INCREMENT BY 1;

create or replace trigger insert_nums
before insert on theschema.thetable
for each row
begin
select test1_sequence.nextval into :new.id from dual;
end;
/

当我尝试创建触发器时,我得到一个屏幕,要求我提供一些“绑定”。 该对话框只有一个复选框“null”。这是什么意思,我该怎么做 一个可以正常工作的脚本?

在进行这种“自动增量”时要采取什么预防措施?

【问题讨论】:

  • 我添加了 SQL-Developer 标签,因为这段代码看起来不错;它要求你填写一个绑定变量,所以我假设你必须关闭一些设置......但我不知道是什么。
  • 顺便说一句,从 Oracle 11 开始,您可以直接引用序列。这意味着您可以在不使用 SELECT 的情况下编写 :new.id := test1_sequence.nextval
  • 同样的问题!谢谢你的帖子!
  • 在 SQL Developer 4.2.0.x 中仍然存在问题,并且给出的解决方法仍然成功。

标签: oracle oracle11g oracle-sqldeveloper


【解决方案1】:

我是这方面的新手,所以在我给出答案时请记住这一点。 我认为问题在于代码

create or replace trigger insert_nums
before insert on theschema.thetable
for each row
begin
select test1_sequence.nextval into :new.id from dual;
end;

实际上是一个脚本而不是直接的 SQL 语句。因此,您必须运行“运行脚本”。我发现当我在 SQL Developer 中打开一个工作表时,如果我在工作表中的任何地方都有任何触发器代码,那么即使我只是尝试运行 SQL Developer 将在工作表中回顾并尝试运行的语句脚本。为了阻止这种情况发生,我不得不注释掉代码。 如果我确实想运行触发器的代码而不是打开一个新工作表,请将代码放在那里并执行 RUN SCRIPT。

【讨论】:

    【解决方案2】:

    就我而言,解决方案是为“新”输入“newrow”,为“旧”输入“oldrow”作为绑定的值...

    【讨论】:

      【解决方案3】:

      这就是我解决这个问题的方法,输入“set define off;”命令前:

      set define off;
      create or replace trigger [...]
      [...]
      end;
      /
      

      然后突出显示这两个命令并按 F9 运行。 或者您可以使用 F5 运行所有命令。

      看来,如果命令是用F9单独执行的,那么set define off就不会生效。

      【讨论】:

      • 听起来是个不错的解决方案,但如果您提及“设置定义关闭”的实际作用会更好。从我读到的,似乎它关闭提示用户这种变量/值绑定?很高兴知道。 stackoverflow.com/questions/34332639/…
      • 这并不能解决问题中的问题。它停止 SQL Developer 解释占位符变量(由 & 标记),但不影响绑定变量(由冒号标记,: )的处理,这是 OP 询问的问题。
      【解决方案4】:

      SQL Developer 似乎认为您正在运行普通的 DML(数据操作)脚本,而不是 DDL(数据定义)。它还认为:new.id是一个可绑定变量。

      为什么会这样,我不知道;我无法在 Oracle SQL Developer 2.1 中重现它。

      尝试在theschema 架构中打开一个新的 SQL 工作表窗口,然后按 F5(不是 F9)执行“整个”脚本(不是语句) .

      【讨论】:

      • 非常感谢!这样可行。我不知道为什么必须执行整个脚本才能使这个东西正常工作。为什么不能部分做。
      • 不客气!我也不知道为什么会这样,因为我的 SQL Developer 工作正常。
      • 我遇到了这个确切的问题,这就是解决方案。我可以确认它与 SQL Developer 版本有关。
      猜你喜欢
      • 2013-12-24
      • 2018-02-07
      • 1970-01-01
      • 1970-01-01
      • 2016-05-31
      • 2011-01-06
      • 1970-01-01
      • 1970-01-01
      • 2014-10-28
      相关资源
      最近更新 更多