我试图在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”。这是什么意思,我该怎么做 一个正常运行的脚本?
在进行这种“自动增量”时需要采取什么预防措施?
答案 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。