2011-11-30 41 views
11

Daha önce Oracle'da bir tetik oluşturmamıştım bu yüzden biraz yön arıyorum.Oracle otomatik tetikleme oluşturmak için tetikleme

ID, insert ifadesinde değilse, bir kimliği birer birer artıran bir tetikleyici oluşturmak istiyorum.

Kimlik, 10000'den başlamalı ve bir kayıt eklendiğinde, bir sonraki kimlik 10001 olmalıdır. Ekleme deyimi bir kimlik içeriyorsa, otomatik artırmayı geçersiz kılmalıdır.

insert into t1 (firstname, lastname) values ('Michael','Jordan'),('Larry','Bird') 

gibi görünmelidir yani:

ad lastname kimliği

Micahel Ürdün 10000

Larry Bird 10001

insert into t1 (firstname, lastname, id) values ('Scottie','Pippen',50000) 

aşağıdaki gibi görünmelidir:

ad lastname kimliği

Micahel Ürdün 10000

Larry Bird 10001

Scottie Pippen 50000

cevap

24

Böyle bir şey

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; 
11g üzerinde çalışacak

Daha önceki bir karardaysanız sion, dizinin

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; 

Oracle dizileri boşluk içermeyen olmadığını unutmayın sonraki değerini almak için bir SELECT INTO yapmanız gerekir. Bu nedenle, belirli değerlerin çeşitli sebeplerden dolayı atlanması tamamen mümkündür. İlk ekinizin 10000'lük bir kimliği olabilir ve ikincisi dakikalar, saatler veya günler bittiğinde 10020 kimliğine sahip olabilir. Ayrıca, Oracle'ın MySQL'in yaptığı gibi VALUES deyiminde birden çok satır belirtmeyi desteklemediğini unutmayın. Üste | Yani daha doğrusu

insert into t1 (firstname, lastname) values ('Michael','Jordan'),('Larry','Bird') 

daha ben değil sql bloğunda, tetik kendisinde bir koşulu ile bu tetiği kodlamak için öneriyoruz iki ayrı INSERT deyimleri

insert into t1 (firstname, lastname) values ('Michael','Jordan'); 
insert into t1 (firstname, lastname) values ('Larry','Bird'); 
+0

[https://github.com/miklagard/oracle-table-creator](https://github.com/miklagard/oracle-table-creator – cem

2

gerekiyordu. Bu çözümle, tetikleyici yalnızca koşul eşleştiğinde yürütülür (id, null). Aksi takdirde tetik her zaman yürütülür ve blok id'in boş olup olmadığını kontrol eder. DB, boş olmayan değerler üzerinde hiçbir şey yapmayan SQL bloğunu çalıştırmalıdır.