ओरेकल में बहु-पंक्ति सम्मिलित करने का सबसे अच्छा तरीका?


262

मैं Oracle 9 डेटाबेस में बहु-पंक्ति आवेषण प्रदर्शन करने के लिए एक अच्छे तरीके की तलाश कर रहा हूं। निम्नलिखित MySQL में काम करता है लेकिन Oracle में समर्थित नहीं है।

INSERT INTO TMP_DIM_EXCH_RT 
(EXCH_WH_KEY, 
 EXCH_NAT_KEY, 
 EXCH_DATE, EXCH_RATE, 
 FROM_CURCY_CD, 
 TO_CURCY_CD, 
 EXCH_EFF_DATE, 
 EXCH_EFF_END_DATE, 
 EXCH_LAST_UPDATED_DATE) 
VALUES
    (1, 1, '28-AUG-2008', 109.49, 'USD', 'JPY', '28-AUG-2008', '28-AUG-2008', '28-AUG-2008'),
    (2, 1, '28-AUG-2008', .54, 'USD', 'GBP', '28-AUG-2008', '28-AUG-2008', '28-AUG-2008'),
    (3, 1, '28-AUG-2008', 1.05, 'USD', 'CAD', '28-AUG-2008', '28-AUG-2008', '28-AUG-2008'),
    (4, 1, '28-AUG-2008', .68, 'USD', 'EUR', '28-AUG-2008', '28-AUG-2008', '28-AUG-2008'),
    (5, 1, '28-AUG-2008', 1.16, 'USD', 'AUD', '28-AUG-2008', '28-AUG-2008', '28-AUG-2008'),
    (6, 1, '28-AUG-2008', 7.81, 'USD', 'HKD', '28-AUG-2008', '28-AUG-2008', '28-AUG-2008');

जवाबों:


165

यह Oracle में काम करता है:

insert into pager (PAG_ID,PAG_PARENT,PAG_NAME,PAG_ACTIVE)
          select 8000,0,'Multi 8000',1 from dual
union all select 8001,0,'Multi 8001',1 from dual

यहाँ याद करने वाली बात यह है कि इसका उपयोग करना है from dual कथन ।

( स्रोत )


6
वहाँ भी 9i (?) के रूप में "सम्मिलित सभी" कहा जाता है
mlathe

4
योग्य होने के नाते, लेकिन यदि आप प्रत्येक चयनित लाइन के अंत में "यूनियन ऑल" डालते हैं तो फॉर्मटिंग अधिक मायने रखता है (अंतिम को छोड़कर)।
जॅमी

इस के साथ एक नुकसान यह है कि हम नहीं कर सकते एक का उपयोग है sequnce.nextvalके रूप में यह में निषिद्ध है unionकी select। इसके बजाय हम साथ जा सकते हैं INSERT ALL
sql_dummy

5
@ जैमी: एस्पो का प्रारूपण इस अर्थ में थोड़ा अधिक स्मार्ट है कि आपको इस बारे में चिंता करने की आवश्यकता नहीं है कि आप नई लाइनों को जोड़ते समय अंतिम पंक्ति पर हैं या नहीं। इसलिए, जब आप अपने 2 पहले चयन कर लेते हैं, तो आप आसानी से अंतिम पंक्ति (या एक मध्य एक) को कॉपी / पेस्ट कर सकते हैं, केवल उन मूल्यों पर ध्यान केंद्रित कर सकते हैं जिन्हें आपको बदलना है। यह किसी भी भाषा (कॉमा, तर्क ऑपरेटरों, प्लस ...) में अन्य मामलों के बहुत सारे के लिए एक आम चाल है। यह सिर्फ आदत की बात है, बहुत सारी पूर्व प्रथाओं को कोड के दायित्व पर ध्यान केंद्रित करने के लिए संशोधित किया गया है।
लॉरेंट.बी

12c के लिए अधिकतम क्या है?
टूलकिट

362

Oracle में, कॉलम col1, col2 और col3 के साथ टेबल टी में कई पंक्तियों को सम्मिलित करने के लिए आप निम्नलिखित सिंटैक्स का उपयोग कर सकते हैं:

INSERT ALL
   INTO t (col1, col2, col3) VALUES ('val1_1', 'val1_2', 'val1_3')
   INTO t (col1, col2, col3) VALUES ('val2_1', 'val2_2', 'val2_3')
   INTO t (col1, col2, col3) VALUES ('val3_1', 'val3_2', 'val3_3')
   .
   .
   .
SELECT 1 FROM DUAL;

54
मुझे समझ नहीं आता कि क्या SELECT 1 FROM DUALकरता है।
जम्फिशर

55
INSERT ALLएक SELECTउपशम की आवश्यकता है । उस के आसपास SELECT 1 FROM DUALजाने के लिए, डमी डेटा की एक पंक्ति देने के लिए उपयोग किया जाता है।
मार्कस जार्डेरॉट

40
यह कई इंसर्ट स्टेटमेंट से कैसे भिन्न होता है? आप अभी भी कॉलम नामों पर दोहराव रखते हैं, ताकि अधिक लाभ न हो।
बुरहान अली

28
मेरे पीसी पर 2secs में लगभग 10-12 मल्टीपल INSERT स्टेटमेंट पूरे हो जाते हैं, जबकि उपरोक्त सिंटैक्स प्रति सेकंड INSERT 1000 रिकॉर्ड्स में सक्षम होता है! प्रभावित किया! ध्यान दें कि मैं अंत में केवल COMMIT करता हूं।
कैंट पवार

13
यह ठीक काम करता है, हालांकि यदि आप किसी अनुक्रम का उपयोग कर सम्मिलित कर रहे हैं, तो उपयोगकर्ता का कहना है। NEXTVAL यह प्रत्येक प्रविष्टि के लिए समान मान लौटाएगा। आप इसे मैन्युअल रूप से सम्मिलित सभी में बढ़ा सकते हैं, फिर सम्मिलित के बाहर अनुक्रम को अपडेट कर सकते हैं।
user1412523

33

SQL * लोडर का उपयोग करें। यह एक छोटी सी सेटिंग लेता है, लेकिन अगर यह एक बंद नहीं है, इसके लायक है।

तालिका बनाएं

SQL> create table ldr_test (id number(10) primary key, description varchar2(20));
Table created.
SQL>

सीएसवी बनाएं

oracle-2% cat ldr_test.csv
1,Apple
2,Orange
3,Pear
oracle-2% 

लोडर नियंत्रण फ़ाइल बनाएँ

oracle-2% cat ldr_test.ctl 
load data

 infile 'ldr_test.csv'
 into table ldr_test
 fields terminated by "," optionally enclosed by '"'              
 ( id, description )

oracle-2% 

SQL * लोडर कमांड चलाएँ

oracle-2% sqlldr <username> control=ldr_test.ctl
Password:

SQL*Loader: Release 9.2.0.5.0 - Production on Wed Sep 3 12:26:46 2008

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.

Commit point reached - logical record count 3

डालने की पुष्टि करें

SQL> select * from ldr_test;

        ID DESCRIPTION
---------- --------------------
         1 Apple
         2 Orange
         3 Pear

SQL>

SQL * लोडर में बहुत सारे विकल्प हैं, और इसके इनपुट के रूप में किसी भी पाठ फ़ाइल को बहुत अधिक ले सकते हैं। आप अपनी कंट्रोल फाइल में डेटा को इनलाइन भी कर सकते हैं।

यहाँ कुछ और विवरणों के साथ एक पृष्ठ है -> एसक्यूएल * लोडर


यह शीर्ष उत्तर IMHO होना चाहिए, कुछ और (बड़े पैमाने पर कार्यों के लिए) परेशानी के लिए पूछ रहा है
डकैती

मेरी तालिका में ID कॉलम स्वतःपूर्ण है। क्या मैं लोडर नियंत्रण फ़ाइल में आईडी क्षेत्र को छोड़ सकता हूं?
थोम डेकार्लो

@ थोम, अनुक्रम का उपयोग करें। एक्स्टेंवल उदाहरण fruit_id "fruit_seq.nextval"के लिए स्तंभ परिभाषा में
6

कुछ ही मिनटों में 50 मिलियन रिकॉर्ड। जाने का रास्ता
टूलकिट

20

जब भी मुझे ऐसा करने की आवश्यकता होती है, मैं इस तरह की स्थानीय प्रक्रिया के साथ एक साधारण PL / SQL ब्लॉक बनाता हूं:

declare
   procedure ins
   is
      (p_exch_wh_key INTEGER, 
       p_exch_nat_key INTEGER, 
       p_exch_date DATE, exch_rate NUMBER, 
       p_from_curcy_cd VARCHAR2, 
       p_to_curcy_cd VARCHAR2, 
       p_exch_eff_date DATE, 
       p_exch_eff_end_date DATE, 
       p_exch_last_updated_date DATE);
   begin
      insert into tmp_dim_exch_rt 
      (exch_wh_key, 
       exch_nat_key, 
       exch_date, exch_rate, 
       from_curcy_cd, 
       to_curcy_cd, 
       exch_eff_date, 
       exch_eff_end_date, 
       exch_last_updated_date) 
      values
      (p_exch_wh_key, 
       p_exch_nat_key, 
       p_exch_date, exch_rate, 
       p_from_curcy_cd, 
       p_to_curcy_cd, 
       p_exch_eff_date, 
       p_exch_eff_end_date, 
       p_exch_last_updated_date);
   end;
begin
   ins (1, 1, '28-AUG-2008', 109.49, 'USD', 'JPY', '28-AUG-2008', '28-AUG-2008', '28-AUG-2008'),
   ins (2, 1, '28-AUG-2008', .54, 'USD', 'GBP', '28-AUG-2008', '28-AUG-2008', '28-AUG-2008'),
   ins (3, 1, '28-AUG-2008', 1.05, 'USD', 'CAD', '28-AUG-2008', '28-AUG-2008', '28-AUG-2008'),
   ins (4, 1, '28-AUG-2008', .68, 'USD', 'EUR', '28-AUG-2008', '28-AUG-2008', '28-AUG-2008'),
   ins (5, 1, '28-AUG-2008', 1.16, 'USD', 'AUD', '28-AUG-2008', '28-AUG-2008', '28-AUG-2008'),
   ins (6, 1, '28-AUG-2008', 7.81, 'USD', 'HKD', '28-AUG-2008', '28-AUG-2008', '28-AUG-2008');
end;
/

12

यदि आपके पास वे मान हैं जो आप पहले से ही किसी अन्य तालिका में सम्मिलित करना चाहते हैं, तो आप चुनिंदा कथन से सम्मिलित कर सकते हैं।

INSERT INTO a_table (column_a, column_b) SELECT column_a, column_b FROM b_table;

अन्यथा, आप Oracle और MySQL दोनों में काम करने वाली चीज़ के लिए समय बचाने के लिए सिंगल रो इन्सर्ट स्टेटमेंट्स का एक गुच्छा सूचीबद्ध कर सकते हैं और बल्क में कई क्वेरीज़ सबमिट कर सकते हैं।

@Espo का समाधान भी एक अच्छा है जो कि Oracle और MySQL दोनों में काम करेगा यदि आपका डेटा पहले से टेबल में नहीं है।


4

यदि आप कुछ यादृच्छिक मान सम्मिलित करना चाहते हैं तो आप लूप का उपयोग कर सकते हैं।

BEGIN 
    FOR x IN 1 .. 1000 LOOP
         INSERT INTO MULTI_INSERT_DEMO (ID, NAME)
         SELECT x, 'anyName' FROM dual;
    END LOOP;
END;


0

ओरेकल में बहु पंक्तियों को सम्मिलित करने के लिए कदम गाइडलाइन द्वारा एक बहुत ही उपयोगी कदम है:

https://livesql.oracle.com/apex/livesql/file/content_BM1LJQ87M5CNIOKPOWPV6ZGR3.html

अंतिम चरण:

INSERT ALL
/* Everyone is a person, so insert all rows into people */
WHEN 1=1 THEN
INTO people (person_id, given_name, family_name, title)
VALUES (id, given_name, family_name, title)
/* Only people with an admission date are patients */
WHEN admission_date IS NOT NULL THEN
INTO patients (patient_id, last_admission_date)
VALUES (id, admission_date)
/* Only people with a hired date are staff */
WHEN hired_date IS NOT NULL THEN
INTO staff (staff_id, hired_date)
VALUES (id, hired_date)
  WITH names AS (
    SELECT 4 id, 'Ruth' given_name, 'Fox' family_name, 'Mrs' title,
           NULL hired_date, DATE'2009-12-31' admission_date
    FROM   dual UNION ALL
    SELECT 5 id, 'Isabelle' given_name, 'Squirrel' family_name, 'Miss' title ,
           NULL hired_date, DATE'2014-01-01' admission_date
    FROM   dual UNION ALL
    SELECT 6 id, 'Justin' given_name, 'Frog' family_name, 'Master' title,
           NULL hired_date, DATE'2015-04-22' admission_date
    FROM   dual UNION ALL
    SELECT 7 id, 'Lisa' given_name, 'Owl' family_name, 'Dr' title,
           DATE'2015-01-01' hired_date, NULL admission_date
    FROM   dual
  )
  SELECT * FROM names

0

मेरे मामले में, मैं TABLE_A से कई पंक्तियों को TABLE_A में केवल एक कॉलम का उपयोग करके थोक में डालने के लिए एक सरल सम्मिलित विवरण का उपयोग करने में सक्षम था और अन्य डेटा को कहीं और प्राप्त करना (अनुक्रम और एक हार्डकोड मूल्य):

INSERT INTO table_a (
    id,
    column_a,
    column_b
)
    SELECT
        table_a_seq.NEXTVAL,
        b.name,
        123
    FROM
        table_b b;

परिणाम:

ID: NAME: CODE:
1, JOHN, 123
2, SAM, 123
3, JESS, 123

आदि

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.