2011-11-30 15 views
11

मैंने ओरेकल में कभी भी ट्रिगर नहीं बनाया है, इसलिए मैं कुछ दिशा ढूंढ रहा हूं।ओरेकल ट्रिगर एक ऑटोऑम्बर बनाने के लिए

मैं एक ट्रिगर बनाना चाहता हूं जो एक आईडी को एक से बढ़ाता है यदि आईडी सम्मिलित कथन में नहीं है।

आईडी 10000 से शुरू होनी चाहिए, और जब एक रिकॉर्ड डाला जाता है तो अगली आईडी 10001 होनी चाहिए। यदि सम्मिलित कथन में एक आईडी है, तो उसे ऑटो वृद्धि को ओवरराइड करना चाहिए।

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

की तरह दिखना चाहिए अर्थात्:

FIRSTNAME LASTNAME आईडी

Micahel जॉर्डन 10000

लैरी बर्ड 10001

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

दिखना चाहिए:

FIRSTNAME LASTNAME आईडी

Micahel जॉर्डन 10000

लैरी बर्ड 10001

Scottie Pippen 50000

उत्तर

24

इस तरह कुछ

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 पर काम करेंगे

यदि आप पहले की वर्ड पर हैं सायन, आप अनुक्रम

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 दृश्यों की खाई को मुक्त नहीं कर रहे हैं से अगले मूल्य पाने के लिए एक का चयन करें जांच करने की आवश्यकता होगी। तो यह पूरी तरह से संभव है कि विभिन्न मूल्यों के लिए विशेष मूल्य छोड़े जाएंगे। आपके पहले सम्मिलन में 10000 की आईडी हो सकती है और दूसरे में 10020 की आईडी हो सकती है यदि यह मिनट, घंटे या दिन बाद हो।

इसके अतिरिक्त, ध्यान रखें कि ओरेकल VALUES खंड में एकाधिक पंक्तियों को निर्दिष्ट करने का समर्थन नहीं करता है क्योंकि MySQL करता है। तो बजाय

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

से आप दो अलग-अलग सम्मिलित बयान

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- निर्माता) – cem

2

आवश्यकता होगी मैं, ट्रिगर पर ही एक शर्त के साथ इस ट्रिगर कोड करने की सिफारिश करेंगे एसक्यूएल ब्लॉक में नहीं।

CREATE OR REPLACE TRIGGER your_trigger 
BEFORE INSERT ON your_table 
REFERENCING NEW AS NEW OLD AS OLD 
FOR EACH ROW 
WHEN (new.id IS NULL) 
    BEGIN 
    SELECT your_sequence.nextval 
    INTO :new.id 
    FROM dual; 
    END; 
/

इस समाधान के साथ ट्रिगर केवल तभी निष्पादित किया जाता है जब स्थिति मिलान (आईडी शून्य है)।

अन्यथा ट्रिगर हमेशा निष्पादित होता है और यदि ब्लॉक शून्य है तो ब्लॉक जांचता है। डीबी को SQL ब्लॉक निष्पादित करना होगा जो शून्य मानों पर कुछ भी नहीं करता है।

संबंधित मुद्दे