我想創建一個我創建的觸發器插入序列以應用于表上的所有主鍵,
CREATE SEQUENCE HR.PRIMARY_KEY
START WITH 300
INCREMENT BY 10
MAXVALUE 99990
MINVALUE 1
NOCYCLE
NOCACHE
NOORDER;
create or replace trigger increment_pk_trigger
before insert
ON schema
--FOR EACH ROW
DECLARE
CURSOR get_pk_CURSOR IS
select a.constraint_name, b.column_name, a.table_name
from user_constraints a, user_cons_columns b
where a.constraint_type = 'P' and a.constraint_name = b.constraint_name;
BEGIN
FOR V_RECORD IN get_pk_CURSOR LOOP
EXECUTE IMMEDIATE 'insert into '||V_RECORD.TABLE_NAME||' :new.V_RECORD.column_name := primary_key.nextva ';
END LOOP;
END;
我的問題我無法得到我將table_name嘗試做的事情database|schema
但不起作用
uj5u.com熱心網友回復:
這不是一個有意義的要求,所以你實際上不能。
將單個序列作為每個表上主鍵的源會非常奇怪——最終會在該單個序列上產生相當多的爭用。為每個表創建一個序列或(假設是最新版本的 Oracle)簡單地將主鍵宣告為標識列會更正常。
如果您真的想要,您可以撰寫一些代碼,為模式中的每個表動態生成觸發器。像這樣(假設每個表都有一個單列主鍵,并且您確實希望使用相同的序列來生成每個表上的主鍵,盡管會影響性能)
begin
for pk in (select a.constraint_name, b.column_name, a.table_name
from user_constraints a, user_cons_columns b
where a.constraint_type = 'P'
and a.constraint_name = b.constraint_name)
loop
execute immediate 'create or replace trigger trg_pk_' || pk.table_name ||
' before insert on ' || pk.table_name ||
' for each row ' ||
'begin ' ||
' :new.' || pk.column_name || ' := primary_key.nextval; ' ||
'end; ';
end loop
end;
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/486118.html
