在Oracle Express中创建触发器

时间:2012-08-28 19:19:24

标签: oracle oracle11g oracle-sqldeveloper

我试图在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”。这是什么意思,我该怎么做 一个正常运行的脚本?

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

Enter binds

4 个答案:

答案 0 :(得分:51)

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

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

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

答案 1 :(得分:15)

这就是我解决这个问题的方法,把“set define off”在命令之前:

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

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

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

答案 2 :(得分:0)

对于我的情况,解决方案是将“new”和“oldrow”输入“oldrow”作为绑定的值......

答案 3 :(得分:0)

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

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。