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

एकाधिक सम्मिलित SQL oracle

संपादित करें दो परीक्षण मामले और एक संभावित समाधान जोड़ा गया।

हालांकि Insert कथन और insert all स्टेटमेंट व्यावहारिक रूप से एक ही पारंपरिक इंसर्ट स्टेटमेंट हैं। लेकिन जब सीक्वेंस की बात आती है, तो वे अलग तरह से काम करते हैं।

टेस्ट केस 1:पहचान कॉलम

SQL> DROP TABLE table1 PURGE;

Table dropped.

SQL>
SQL> CREATE TABLE Table1 (
  2    Table1Id NUMBER GENERATED ALWAYS AS IDENTITY,
  3    column3 NUMBER,
  4    PRIMARY KEY (Table1Id)
  5  );

Table created.

SQL>
SQL> INSERT ALL
  2    INTO Table1 (column3) VALUES ('1')
  3    INTO Table1 (column3) VALUES ('2')
  4  SELECT * FROM dual;
INSERT ALL
*
ERROR at line 1:
ORA-00001: unique constraint (LALIT.SYS_C0010439) violated


SQL>

आइए देखें कि वास्तव में हुड के नीचे क्या हो रहा है -

SQL> CREATE TABLE Table1 (
  2    Table1Id NUMBER GENERATED ALWAYS AS IDENTITY,
  3    column3 NUMBER,
  4    CONSTRAINT A UNIQUE (Table1Id)
  5  );

Table created.

SQL> INSERT ALL
  2    INTO Table1 (column3) VALUES (1)
  3    INTO Table1 (column3) VALUES (2)
  4  SELECT * FROM dual;
INSERT ALL
*
ERROR at line 1:
ORA-00001: unique constraint (LALIT.A) violated


SQL> SELECT * FROM table1;

no rows selected

SQL> ALTER TABLE table1
  2  DISABLE CONSTRAINT a;

Table altered.

SQL> INSERT ALL
  2    INTO Table1 (column3) VALUES (1)
  3    INTO Table1 (column3) VALUES (2)
  4  SELECT * FROM dual;

2 rows created.

SQL> SELECT * FROM table1;

  TABLE1ID    COLUMN3
---------- ----------
         2          1
         2          2

SQL>

तो, अनुक्रम nextval तक आगे बढ़ा हालांकि पहली बार जब हमने सभी सम्मिलित करें तो एक अद्वितीय बाधा उल्लंघन हुआ था। इसके बाद, हमने अद्वितीय बाधा को अक्षम कर दिया , और बाद के इन्सर्ट ऑल से पता चलता है कि अनुक्रम नेक्स्टवल तक आगे नहीं बढ़ा, बल्कि इसने डुप्लिकेट कुंजियाँ सम्मिलित करने का प्रयास किया। ।

हालांकि समस्या INSERT-INTO-SELECT . के साथ नहीं होती है बयान।

SQL> INSERT INTO table1(column3) SELECT LEVEL FROM dual CONNECT BY LEVEL <=5;

5 rows created.

SQL>
SQL> SELECT * FROM table1;

  TABLE1ID    COLUMN3
---------- ----------
         2          1
         3          2
         4          3
         5          4
         6          5

SQL>

हैरानी की बात है कि मेटाडेटा के अनुसार, अनुक्रम स्वचालित रूप से अगली बार आगे बढ़ना चाहिए, हालांकि यह सभी सम्मिलित करें कथन के साथ नहीं होता है।

SQL> SELECT COLUMN_NAME,
  2    IDENTITY_COLUMN,
  3    DATA_DEFAULT
  4  FROM user_tab_cols
  5  WHERE table_name   ='TABLE1'
  6  AND IDENTITY_COLUMN='YES';

COLUMN_NAME     IDENTITY_COLUMN DATA_DEFAULT
--------------- --------------- ------------------------------
TABLE1ID        YES             "LALIT"."ISEQ$$_94458".nextval

SQL>

टेस्ट केस 2:अनुक्रम का स्पष्ट रूप से उपयोग करना

सभी डालें एक पहचान कॉलम का उपयोग किया जाता है या एक स्पष्ट अनुक्रम . उसी तरह काम करेगा उपयोग किया जाता है।

SQL> DROP SEQUENCE s;

Sequence dropped.

SQL>
SQL> CREATE SEQUENCE s;

Sequence created.

SQL>
SQL> DROP TABLE t PURGE;

Table dropped.

SQL>
SQL> CREATE TABLE t (
  2    ID NUMBER,
  3    text VARCHAR2(50),
  4    CONSTRAINT id_pk PRIMARY KEY (ID)
  5  );

Table created.

SQL>
SQL> INSERT ALL
  2    INTO t VALUES (s.nextval, 'a')
  3    INTO t VALUES (s.nextval, 'b')
  4    INTO t VALUES (s.nextval, 'c')
  5    INTO t VALUES (s.nextval, 'd')
  6  SELECT * FROM dual;
INSERT ALL
*
ERROR at line 1:
ORA-00001: unique constraint (LALIT.ID_PK) violated


SQL>
SQL> SELECT * FROM T;

no rows selected

SQL>
SQL> ALTER TABLE t
  2    DISABLE CONSTRAINT id_pk;

Table altered.

SQL> INSERT ALL
  2    INTO t VALUES (s.nextval, 'a')
  3    INTO t VALUES (s.nextval, 'b')
  4    INTO t VALUES (s.nextval, 'c')
  5    INTO t VALUES (s.nextval, 'd')
  6  SELECT * FROM dual;

4 rows created.

SQL> SELECT * FROM T;

        ID TEXT
---------- ----------------------------------------
         2 a
         2 b
         2 c
         2 d

SQL>

संभावित समाधान - एक पंक्ति स्तर ट्रिगर का उपयोग करना

SQL> CREATE OR REPLACE TRIGGER t_trg
  2      BEFORE INSERT ON t
  3      FOR EACH ROW
  4      WHEN (new.id IS NULL)
  5      BEGIN
  6        SELECT s.NEXTVAL
  7        INTO   :new.id
  8        FROM   dual;
  9      END;
 10  /

Trigger created.

SQL> truncate table t;

Table truncated.

SQL> INSERT ALL
  2    INTO t (text) VALUES ('a')
  3    INTO t (text) VALUES ('b')
  4    INTO t (text) VALUES ('c')
  5    INTO t (text) VALUES ('d')
  6  SELECT * FROM dual;

4 rows created.

SQL> SELECT * FROM t;

        ID TEXT
---------- -------------------------
         3 a
         4 b
         5 c
         6 d

SQL>


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. DG4ODBC के लिए Oracle भाषा पैरामीटर सेट करना

  2. ग्राहक.पीके_नाम लेनदेन में शामिल होना। एफके_नाम बनाम ग्राहक। पीके_आईडी [धारावाहिक] लेनदेन में शामिल होना। एफके_आईडी [पूर्णांक]

  3. इकाई फ्रेमवर्क और एकाधिक स्कीमा

  4. Oracle इंस्टेंट क्लाइंट स्थापित करना

  5. क्लाइंट और सर्वर के बीच कनेक्शन को कॉन्फ़िगर करना Oracle 10g