Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

एक ही टेबल पर ट्रिगर डालने के बाद अपडेट करें

यदि आप एक साधारण डिफ़ॉल्ट मान निर्दिष्ट करना चाहते हैं, तो सबसे आसान तरीका है कि इसे DEFAULT क्लॉज का उपयोग करके टेबल पर घोषित किया जाए।

SQL> create table t42
  2    ( col1 number default 1 not null
  3      , col2 date)
  4  /

Table created.

SQL> insert into t42 (col2) values (sysdate)
  2  /

1 row created.

SQL> select * from t42
  2  /

      COL1 COL2
---------- ---------
         1 03-AUG-11

SQL>

यह शाब्दिक या छद्म कॉलम जैसे SYSDATE या USER के साथ काम करता है। यदि आप उपयोगकर्ता द्वारा परिभाषित फ़ंक्शन या अनुक्रम के साथ अधिक जटिल मान प्राप्त करना चाहते हैं, तो आपको एक ट्रिगर का उपयोग करना होगा।

यहाँ तालिका का एक नया संस्करण है...

SQL> create table t42
  2    ( col1 number default 1 not null
  3      , col2 date default sysdate
  4      , col3 varchar2(30) default user
  5      , col4 number )
  6  /

Table created.

SQL>

... एक ट्रिगर के साथ:

SQL> create or replace trigger t42_trg
  2      before insert or update
  3      on t42
  4      for each row
  5  begin
  6      if :new.col4 is null
  7      then
  8          :new.col4 := my_seq.nextval;
  9      end if;
 10  end;
 11  /

Trigger created.

SQL> insert into t42 (col1, col2, col3)
  2  values (99, sysdate, 'MR KNOX')
  3  /

1 row created.

SQL> select * from t42
  2  /

      COL1 COL2      COL3                                 COL4
---------- --------- ------------------------------ ----------
        99 03-AUG-11 MR KNOX                               161

SQL>

ध्यान दें कि हालांकि टेबल पर हर कॉलम डिफॉल्ट करने योग्य है, मुझे SQL को वैध बनाने के लिए कम से कम एक कॉलम को पॉप्युलेट करना होगा:

SQL> insert into t42 values ()
  2  /
insert into t42 values ()
                        *
ERROR at line 1:
ORA-00936: missing expression


SQL>

लेकिन मैं पूरी तरह से डिफ़ॉल्ट रिकॉर्ड प्राप्त करने के लिए NULL से COL4 पास कर सकता हूं:

SQL> insert into t42 (col4) values (null)
  2  /

1 row created.

SQL> select * from t42
  2  /

      COL1 COL2      COL3                                 COL4
---------- --------- ------------------------------ ----------
        99 03-AUG-11 MR KNOX                               161
         1 03-AUG-11 APC                                   162

SQL>

कैविएट लेक्टर:मेरा ट्रिगर नए 11g सिंटैक्स का उपयोग करता है। पिछले संस्करणों में हमें एक SELECT स्टेटमेंट का उपयोग करके अनुक्रम मान निर्दिष्ट करना होगा:

select my_seq.nextval
into :new.col4
from dual;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle में उपयोगकर्ता को क्लोन कैसे करें

  2. ट्रिगर के बाद उसी तालिका का उपयोग करने वाली प्रक्रिया को कैसे कॉल करें

  3. डेटाबेस में दोनों, या तो-या, लेकिन शून्य आवश्यकता नहीं लागू करना

  4. क्या यह एक संभावित ओरेकल बग है या क्या मुझे कुछ याद आ रहा है?

  5. sqlplus कमांड लाइन के साथ सादा पाठ पासवर्ड छिपाना