PL/SQL 建立序列和触发器

就是……在 Oracle 里给一个新表或者一堆表添加一下序列和触发器,能让它在新增记录的时候可以实现自增主键的 feature。

建立单个序列

create sequence SEQ_[TABLE_NAME]
minvalue 1
maxvalue 99999999999999999999
start with 1
increment by 1
nocache;

建立单个触发器

CREATE OR REPLACE TRIGGER TRG_[TABLE_NAME]_ID
BEFORE INSERT ON [TABLE_NAME]
FOR EACH ROW
BEGIN
if(:new.id is null) then
begin
select SEQ_[TABLE_NAME].nextval into :new.id from dual;
end;
end if;
END;

建立多个序列

首先执行

select * FROM user_cons_columns cu, user_constraints au
WHERE cu.constraint_name = au.constraint_name
AND au.constraint_type   = 'P'
AND au.table_name IN (SELECT TABLE_NAME FROM USER_TABLES);

查看是否有误

然后执行

SELECT 
'create sequence SEQ_'|| au.table_name||'
minvalue 1
maxvalue 99999999999999999999
start with 1
increment by 1
nocache;'
FROM user_cons_columns cu,
user_constraints au
WHERE cu.constraint_name = au.constraint_name
AND au.constraint_type= 'P'
AND au.table_name IN
(SELECT TABLE_NAME FROM USER_TABLES);

以创建执行脚本

最后执行全部查询结果。

建立多个触发器

首先执行

SELECT
'create or replace
TRIGGER TRG_'|| au.table_name||'  BEFORE INSERT ON '
||au.table_name||
'  FOR EACH ROW 
BEGIN
if(:new.'||cu.column_name ||' is null) then
    begin
    SELECT SEQ_'||au.table_name||'.NEXTVAL INTO :NEW.'||cu.column_name ||' FROM DUAL;  end; end if; END;'
FROM user_cons_columns cu,
  user_constraints au
WHERE cu.constraint_name = au.constraint_name
AND au.constraint_type   = 'P'
AND au.table_name IN
  (SELECT TABLE_NAME FROM USER_TABLES); 

然后执行全部查询结果。