ওরাকলে মাল্টি-সারি সন্নিবেশ করানোর সেরা উপায়?


262

আমি ওরাকল 9 ডাটাবেসে মাল্টি-সারি সন্নিবেশ সম্পাদন করার জন্য একটি ভাল উপায় খুঁজছি। নিম্নলিখিতটি মাইএসকিউএলে কাজ করে তবে মনে হয় না ওরাকলে এটি সমর্থিত।

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

এটি ওরাকলে কাজ করে:

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 (?) হিসাবে "
sertোকান

4
বাছাই করা হচ্ছে, তবে আপনি প্রতিটি নির্বাচিত লাইনের শেষে (শেষটি বাদে) "ইউনিয়ন অল" রাখলে ফর্ম্যাটিংটি আরও তাত্পর্যপূর্ণ হবে।
জেমি

এই সঙ্গে এক অসুবিধা আমরা নাকিসুরে একটি ব্যবহার করেন sequnce.nextvalযেমন নিষিদ্ধ unionএর select। পরিবর্তে আমরা সঙ্গে যেতে পারেন INSERT ALL
sql_dummy

5
@ জ্যামি: এস্পোর বিন্যাসটি এই দিক থেকে কিছুটা স্মার্ট হয় যে নতুন লাইন যুক্ত করার সময় আপনি শেষ লাইনে আছেন কিনা তা নিয়ে আপনাকে চিন্তা করার দরকার নেই। অতএব, একবার আপনার 2 টি প্রথম নির্বাচিত হয়ে গেলে, আপনি সহজেই আপনার পরিবর্তন করতে হবে এমন মানগুলিতে মনোযোগ নিবদ্ধ করে সহজেই শেষ লাইনটি (বা কোনও মধ্যবর্তী একটি) অনুলিপি / পেস্ট করতে পারেন। এটি যে কোনও ভাষাতে প্রচুর পরিমাণে অন্যান্য ক্ষেত্রে (কমা, লজিক অপারেটরগুলি, এবং আরও ...) জন্য সাধারণ কৌশল। এটি কেবল অভ্যাসের বিষয়, স্বজ্ঞাততার চেয়ে কোডের দায়বদ্ধতায় ফোকাস করার জন্য প্রচুর প্রাক্তন অনুশীলনগুলি সংশোধন করা হয়েছে।
লরেন্ট.বি

12c জন্য সর্বোচ্চ কত?
টুলকিট

362

ওরাকল-এ, কলাম 1, কল 2 এবং কল 3 দিয়ে টেবিল টিতে একাধিক সারি সন্নিবেশ করানোর জন্য আপনি নিম্নলিখিত সিনট্যাক্সটি ব্যবহার করতে পারেন:

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একটি SELECTsubquery প্রয়োজন । এটি পেতে SELECT 1 FROM DUAL, ডামি ডেটার একক সারি দেওয়ার জন্য ব্যবহৃত হয়।
মার্কাস জারদারোট

40
এটি একাধিক সন্নিবেশ বিবৃতি থেকে কীভাবে আলাদা? আপনার কাছে এখনও কলামের নামগুলিতে পুনরাবৃত্তি রয়েছে তাই তেমন লাভ হবে বলে মনে হয় না।
বুরহান আলী

28
আমার পিসিতে প্রায় 10-12 টির মধ্যে একাধিক INSERT বিবৃতি সম্পূর্ণ হয়, যখন উপরের সিনট্যাক্স প্রতি সেকেন্ডে 1000 রেকর্ড INSERT করতে সক্ষম হয়! মুগ্ধ! মনে রাখবেন যে আমি কেবল শেষে কমিট করি।
কেন্ট পওয়ার

13
এটি দুর্দান্ত কাজ করে, তবে আপনি যদি সিকোয়েন্স ব্যবহার করে সন্নিবেশ করিয়ে থাকেন তবে user.NEXTVAL বলুন এটি প্রতিটি সন্নিবেশের জন্য একই মান প্রদান করবে return আপনি এটি সমস্ত allোকাতে ম্যানুয়ালি বৃদ্ধি করতে পারেন, তারপরে সন্নিবেশের বাইরে সিকোয়েন্সটি আপডেট করুন।
ব্যবহারকারী 1412523

33

এসকিউএল * লোডার ব্যবহার করুন। এটি সামান্য সেটআপ লাগবে, তবে এটি যদি এটি বন্ধ না করে তবে এটি তার পক্ষে মূল্যবান।

ছক তৈরি কর

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>

এসকিউএল * লোডারের প্রচুর বিকল্প রয়েছে এবং এটি কোনও ইনপুট হিসাবে কোনও পাঠ্য ফাইলও নিতে পারে। আপনি চাইলে আপনার নিয়ন্ত্রণ ফাইলে ডেটাও ইনলাইন করতে পারেন।

এখানে আরও কিছু বিশদ সহ একটি পৃষ্ঠা রয়েছে -> এসকিউএল * লোডার


এটি শীর্ষস্থানীয় উত্তর আইএমএইচও হওয়া উচিত, অন্য যে কোনও কিছু (বৃহত্তর কাজের জন্য) সমস্যার জন্য জিজ্ঞাসা করছে
রোব্লগিক

আমার টেবিলের আইডি কলামটি স্বয়ংক্রিয়ভাবে তৈরি। আমি কি লোডার কন্ট্রোল ফাইলে আইডি ক্ষেত্রটি এড়িয়ে যেতে পারি?
থম ডিকার্লো

@ থম, সিকোয়েন্সটি ব্যবহার করুন .পূর্ব উদাহরণ যেমন fruit_id "fruit_seq.nextval"কলাম সংজ্ঞাতে
রোব্লগিক

কয়েক মিনিটে 50 মিলিয়ন রেকর্ড। যাওয়ার উপায়
টুলকিট

20

যখনই আমাকে এটি করার দরকার হয় আমি এর মতো স্থানীয় পদ্ধতি সহ একটি সাধারণ পিএল / এসকিউএল ব্লক তৈরি করি:

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;

অন্যথায়, আপনি একক সারির সন্নিবেশ বিবৃতিগুলির একটি গুচ্ছ তালিকাবদ্ধ করতে পারেন এবং ওরাকল এবং মাইএসকিউএল উভয় ক্ষেত্রেই কাজ করে এমন কিছুর জন্য সময় সাশ্রয় করতে বাল্কের বেশ কয়েকটি প্রশ্ন জমা দিতে পারেন।

আপনার ডেটা ইতিমধ্যে কোনও টেবিলে না থাকলে @ এসপো এর সমাধানটিও খুব ভাল যা ওরাকল এবং মাইএসকিউএল উভয় ক্ষেত্রেই কাজ করবে।


4

আপনি কিছু এলোমেলো মান সন্নিবেশ করতে চাইলে লুপ ব্যবহার করে সন্নিবেশ করতে পারেন।

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

0

কার্সারগুলিও ব্যবহার করা যেতে পারে, যদিও এটি অদক্ষ। নিম্নলিখিত স্ট্যাকওভারফ্লো পোস্টে কার্সারগুলির ব্যবহার সম্পর্কে আলোচনা করা হয়েছে:

ওরাকলে কার্সার ব্যবহার করে রেকর্ড সন্নিবেশ করান এবং আপডেট করুন


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_B থেকে কেবল একটি কলাম ব্যবহার করে এবং অন্য কোথাও অন্য স্থান (ক্রম এবং একটি হার্ডকোডযুক্ত মান) পেয়ে অনেকগুলি সারি সারণি টেবিল_এতে সন্নিবেশ করার জন্য একটি সাধারণ সারণী বিবরণটি ব্যবহার করতে সক্ষম হয়েছি:

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

ইত্যাদি

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.