在 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 PL/SQL 中创建触发器时如何解决“编译错误成功”错误?