在 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 的新行的主要内容,如果未能解决你的问题,请参考以下文章
带有Python的Mysql无法插入具有自动增量ID的记录,为啥?