Mik*_*ike 12 oracle triggers plsql
我之前从未在Oracle中创建过触发器,因此我正在寻找一些方向.
我想创建一个触发器,如果ID不在insert语句中,则将ID递增1.
ID应该从10000开始,并且当插入记录时,下一个ID应该是10001.如果insert语句包含ID,它应该覆盖自动增量.
即
insert into t1 (firstname, lastname) values ('Michael','Jordan'),('Larry','Bird')
Run Code Online (Sandbox Code Playgroud)
应该是这样的:
firstname姓氏ID
Micahel Jordan 10000
拉里伯德10001
insert into t1 (firstname, lastname, id) values ('Scottie','Pippen',50000)
Run Code Online (Sandbox Code Playgroud)
应该是这样的:
firstname姓氏ID
Micahel Jordan 10000
拉里伯德10001
Scottie Pippen 50000
Jus*_*ave 27
这样的东西适用于11g
CREATE SEQUENCE t1_id_seq
start with 10000
increment by 1;
CREATE TRIGGER trigger_name
BEFORE INSERT ON t1
FOR EACH ROW
DECLARE
BEGIN
IF( :new.id IS NULL )
THEN
:new.id := t1_id_seq.nextval;
END IF;
END;
Run Code Online (Sandbox Code Playgroud)
如果您使用的是早期版本,则需要执行SELECT INTO以从序列中获取下一个值
CREATE TRIGGER trigger_name
BEFORE INSERT ON t1
FOR EACH ROW
DECLARE
BEGIN
IF( :new.id IS NULL )
THEN
SELECT t1_id_seq.nextval
INTO :new.id
FROM dual;
END IF;
END;
Run Code Online (Sandbox Code Playgroud)
请注意,Oracle序列不是无间隙的.因此,出于各种原因,完全有可能跳过特定值.您的第一个插入可能具有10000的ID,如果它在几分钟,几小时或几天后完成,则第二个插入的ID可能为10020.
另外,请注意Oracle不支持像MySQL那样在VALUES子句中指定多行.所以而不是
insert into t1 (firstname, lastname) values ('Michael','Jordan'),('Larry','Bird')
Run Code Online (Sandbox Code Playgroud)
你需要两个单独的INSERT语句
insert into t1 (firstname, lastname) values ('Michael','Jordan');
insert into t1 (firstname, lastname) values ('Larry','Bird');
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
29623 次 |
| 最近记录: |