在 Oracle Express 中创建触发器

Posted

技术标签:

【中文标题】在 Oracle Express 中创建触发器【英文标题】:Creating a trigger in 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 中仍然存在问题,并且给出的解决方法仍然成功。 【参考方案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就不会生效。

【讨论】:

听起来是个不错的解决方案,但如果您提及“设置定义关闭”的实际作用会更好。从我读到的,似乎它关闭提示用户这种变量/值绑定?很高兴知道。 ***.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 版本有关。

以上是关于在 Oracle Express 中创建触发器的主要内容,如果未能解决你的问题,请参考以下文章

如何使用触发器在 oracle 中创建镜像表?

Oracle中创建触发器示例及注意事项

在 Oracle PL/SQL 中创建触发器时如何解决“编译错误成功”错误?

在 oracle 中创建一个触发器,它不允许使用 if 条件进行任何插入或更新

使用 oracle 触发器审计 50 列

使用 oracle 触发器审计 50 列