2008-09-02 15 views
175

मैं ओरेकल 9 डेटाबेस में बहु-पंक्ति सम्मिलित करने का एक अच्छा तरीका ढूंढ रहा हूं। MySQL में निम्न कार्य करता है लेकिन ओरेकल में समर्थित नहीं लगता है।ओरेकल में बहु-पंक्ति सम्मिलित करने का सबसे अच्छा तरीका?

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'); 

उत्तर

108

यह 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 कथन का उपयोग करने के लिए है।

(source)

+4

वहाँ भी कुछ कहा है, "सभी डालें" 9i के रूप में – mlathe

+0

picky होने के नाते, लेकिन स्वरूपण अधिक समझ में आता है अगर आप प्रत्येक चयन रेखा के अंत में "संघ सभी" डालते हैं (अंतिम के अलावा)। – Jamie

+0

इसके साथ एक नुकसान यह है कि हम एक 'sequnce का उपयोग नहीं कर सकते हैं।अगलीवाल 'के रूप में इसे' संघ 'में' चुनिंदा 'में प्रतिबंधित है। इसके बजाय हम 'INSERT ALL' के साथ जा सकते हैं। –

10

आप मान जो आप पहले से ही एक और तालिका में सम्मिलित करना चाहते हैं, तो आप एक का चयन करें बयान से सम्मिलित कर सकते हैं।

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

अन्यथा, आप एकल पंक्ति डालने बयान के एक झुंड की सूची और कुछ है कि दोनों Oracle और MySQL में काम करता है के लिए समय बचाने के लिए थोक में कई प्रश्नों प्रस्तुत कर सकते हैं।

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

28

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

टेबल

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% 

भागो एसक्यूएल * लोडर आदेश

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*Loader

+0

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

+0

मेरी तालिका में आईडी कॉलम स्वत: उत्पन्न है। क्या मैं बस लोडर नियंत्रण फ़ाइल में आईडी फ़ील्ड छोड़ सकता हूं? –

+0

@ थॉम, sequence.nextval उदा। कॉलम परिभाषा – ropata

19

मैं इस तरह एक स्थानीय प्रक्रिया के साथ एक सरल 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; 
/
263

ओरेकल में, कॉलम 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; 
+29

में 'fruit_id "fruit_seq.nextval" 'मुझे समझ में नहीं आता कि' डुएल से 1 चुनें 'क्या करता है। – jameshfisher

+2

[इस ट्यूटोरियल पेज] के अनुसार (http://www.techonthenet.com/sql/insert.php), 'चयन * डुएल से' भी काम करता है। –

+0

@jameshfisher मुझे नहीं पता कि एकाधिक-सम्मिलन में 'DUAL' से चयन की आवश्यकता क्यों है, लेकिन मैं आपको बता सकता हूं कि 'डुएल' क्या है: [एक पूर्व परिभाषित तालिका] (http://en.wikipedia.org/wiki/DUAL_table)। इसे देखने के लिए 'चुनें * डुएल से चुनें'। –

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