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

Posted

技术标签:

【中文标题】在 Oracle 中插入具有自动增量 ID 的新行【英文标题】:Insert New Row with Auto Incremental ID in Oracle 【发布时间】:2014-12-17 09:13:15 【问题描述】:

我使用 oracle forms builder,我在数据库表 XXCR_MAINT_HDRS 中包含 maintenaceNO number(15),并且我有 SEQUENCE INV_HDR_NO_S,我必须在编译时编写 new_form_instance 触发器来系统生成 maintenanceNO并运行 oracle 表单,我写了这段代码

BEFORE INSERT ON XXCR_MAINT_HDRS
REFERENCING OLD AS OLD NEW AS NEW
FOR EACH ROW
   WHEN (NEW.TRX_NUM IS NULL)
BEGIN
  select INV_HDR_NO_S.NEXTVAL
   INTO :NEW.TRX_NUM from dual;
END;

还有这段代码

BEFORE INSERT ON XXCR_MAINT_HDRS
REFERENCING OLD AS OLD NEW AS NEW
FOR EACH ROW
 WHEN (NEW.ID IS NULL)
BEGIN
  select INV_HDR_NO_S_ID.NEXTVAL
   INTO :NEW.ID from dual;
END;

对于这两个代码我都有这个

error 103 at line 在期望 :=@% 时遇到了符号插入

【问题讨论】:

您正在使用哪个数据库。 CREATE 关键字在哪里 您的触发器缺少create trigger 部分 【参考方案1】:

您不能选择进入需要使用中间变量的行变量 代码需要如下所示:

CREATE OR REPLACE TRIGGER XXCR_MAINT_HDRS_TRG
BEFORE INSERT ON XXCR_MAINT_HDRS
REFERENCING OLD AS OLD NEW AS NEW
FOR EACH ROW
 WHEN (NEW.ID IS NULL)
DECLARE
  v_id XXCR_MAINT_HDRS.ID%TYPE;
BEGIN

   select INV_HDR_NO_S_ID.NEXTVAL INTO v_id from dual;
  :new.ID := v_id;
END XXCR_MAINT_HDRS_TRG;

Oracle 12 添加

实现这一点的另一种方法是在 oracle 12 中引入的一个新功能,它可以将序列用作标识列:

CREATE SEQUENCE t1_seq;

CREATE TABLE t1 (
  id          NUMBER DEFAULT t1_seq.NEXTVAL,
  description VARCHAR2(30)
);

有关更多信息,请查看这些链接:

http://oracle-base.com/articles/12c/identity-columns-in-oracle-12cr1.php

http://oracle-base.com/articles/12c/default-values-for-table-columns-enhancements-12cr1.php

【讨论】:

【参考方案2】:

如果使用此语法,您正在编写数据库触发器。 因此,如果您使用 asafm 示例并创建此数据库触发器,那么它将填写数字。

如果您想在 oracle 表单中使用触发器来填写数字,您应该创建一个预插入触发器。或者,如果您希望在创建记录时存在该值,则应使用 when-create-record 触发器。此触发器的代码如下:

select INV_HDR_NO_S.NEXTVAL
into :BLOCK_NAME.TRX_NUM from dual;

【讨论】:

以上是关于在 Oracle 中插入具有自动增量 ID 的新行的主要内容,如果未能解决你的问题,请参考以下文章

Laravel:在具有自动增量ID的字段上插入随机ID

Oracle自动增量[重复]

带有Python的Mysql无法插入具有自动增量ID的记录,为啥?

插入具有自动增量 id 的行 - Playframework Scala - Slick

表A至表B中的触发ID

MySQL 多行插入是不是获取顺序自动增量 ID?