在Oracle Express中创build一个触发器
我正在尝试在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; /
当我尝试创build触发器时,我得到一个屏幕,要求我进行一些“绑定”。 对话框只有一个checkbox“null”。 这是什么意思,我怎么做一个脚本,正常工作?
做这种“自动增量”时要采取什么预防措施?
看来,SQL Developer认为你正在运行一个普通的DML(数据操作)脚本,而不是DDL(数据定义)。 它也认为:new.id
是一个可绑定的variables。
为什么发生这种情况,我不知道; 我无法在Oracle SQL Developer 2.1中重现它。
尝试在theschema
模式中打开一个新的SQL工作表窗口,并通过按F5 (不是F9 )来执行一个“整个”脚本(不是语句)。
这就是我解决这个问题的方法,把“定义掉” 命令之前:
set define off; create or replace trigger [...] [...] end; /
然后突出显示这两个命令并按F9运行。 或者你可以用F5运行所有的命令。
看来,如果这些命令是用F9单独执行的,那么定义closures不起作用。
对于我的情况,解决scheme进入“新”和“古老”作为“旧”作为价值绑定…
我在这方面是一个新手,所以要记住,因为我给我的答案。 我认为问题在于代码
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。