Oracle 自动增量触发器问题

Posted

技术标签:

【中文标题】Oracle 自动增量触发器问题【英文标题】:Oracle auto increment trigger issue 【发布时间】:2016-08-22 16:19:41 【问题描述】:

在 Oracle 11g 中创建自动增量触发器时遇到问题。如果有人能指出我做错了什么,我将不胜感激。我的序列脚本是这样的:

CREATE SEQUENCE SPSS_QUOTE_LINE_ITEMS_SEQ start with 1
increment by 1
minvalue 1;

触发器的脚本:

CREATE OR REPLACE TRIGGER SPSSQUOTELINEITEMS_ON_INSERT
BEFORE INSERT ON SPSS_QUOTE_LINE_ITEMS
FOR EACH ROW

BEGIN
 SELECT SPSS_QUOTE_LINE_ITEMS_SEQ.NEXTVAL
 INTO   :new.line_num
 FROM   dual;
END;

我得到的错误: [代码:900,SQL 状态:42000] ORA-00900:无效的 SQL 语句

非常感谢。

【问题讨论】:

可能同样的问题:***.com/questions/29450495/… 你用的是什么客户端? 为什么不直接使用:new.line_num := SPSS_QUOTE_LINE_ITEMS_SEQ.NEXTVAL; 而不是select ... from dual; @Codo,我尝试使用建议,但是当我在脚本末尾添加 / 时,我收到另一个错误,显示 [代码:17439,SQL 状态:99999] SQL 类型无效: sqlKind = 未初始化。 @sstan,我正在使用 DBVisualizer 【参考方案1】:

修改触发器的正确​​方法如下:

CREATE OR REPLACE TRIGGER SPSSQUOTELINEITEMS_ON_INSERT
BEFORE INSERT ON SPSS_QUOTE_LINE_ITEMS
FOR EACH ROW
BEGIN

 :new.line_num := SPSS_QUOTE_LINE_ITEMS_SEQ.NEXTVAL;
 --No need to write any Select Into statement here.
END;

或者如果我按照你的方式,那么它就像

CREATE OR REPLACE TRIGGER SPSSQUOTELINEITEMS_ON_INSERT
BEFORE INSERT ON SPSS_QUOTE_LINE_ITEMS
FOR EACH ROW
declare
var number;

BEGIN

SELECT SPSS_QUOTE_LINE_ITEMS_SEQ.NEXTVAL
 INTO   var
 FROM   dual;

 :new.line_num :=var;

END;

您通常在触发器中使用术语,使用 :old 来引用列的旧值,使用 :new 来引用新值。

【讨论】:

感谢您的回复。

以上是关于Oracle 自动增量触发器问题的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 包中的自动增量

Oracle 的自动增量

Oracle中如何将自动增量添加到现有表中

用于Java开发人员的Oracle数据库中的自动增量

在 Oracle 中插入具有自动增量 ID 的新行

oracle DB 中的自动增量替代方案