44

我试图在 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”。这是什么意思,我如何制作一个正常工作的脚本?

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

输入绑定

4

4 回答 4

52

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

为什么会发生这种情况,我不知道;我无法在 Oracle SQL Developer 2.1 中重现它。

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

于 2012-08-28T21:10:38.150 回答
15

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

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

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

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

于 2013-09-11T14:13:05.787 回答
0

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

于 2014-01-02T15:13:14.870 回答
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。

于 2015-09-14T19:46:34.057 回答