Вставить несколько строк в Oracle [duplicate]

Я читал, это символ Arrow Functions в ES6

, этот

var a2 = a.map(function(s){ return s.length });

с использованием Arrow Function может быть записан как

var a3 = a.map( s => s.length );

MDN Docs

198
задан Lalit Kumar B 18 December 2015 в 07:33
поделиться

7 ответов

Использовать SQL * Loader.

Создать таблицу

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

Создать CSV

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 * У загрузчика много опций , и может принимать в значительной степени любой текстовый файл в качестве его ввода. Вы можете даже встроить данные в управляющий файл, если хотите.

Вот страница с более подробной информацией -> SQL * Loader

126
ответ дан Espo 18 August 2018 в 22:13
поделиться
  • 1
    Существует также что-то, называемое «Вставить все». от 9i (?) – mlathe 11 November 2010 в 20:30
  • 2
    Это должен быть главный ответ ИМХО, что-нибудь еще (для крупномасштабных задач) задает проблемы – ropata 31 May 2016 в 12:45
  • 3
    Быть разборчивым, но форматирование имеет смысл, если вы ставите «объединение всех», в конце каждой строки выбора (кроме последней). – Jamie 25 April 2017 в 20:34
  • 4
    Одним из недостатков этого является то, что мы не можем использовать sequnce.nextval, как это запрещено в union из select. Вместо этого мы можем пойти с INSERT ALL. – sql_dummy 8 May 2017 в 02:41
  • 5
    @Jamie: форматирование Espo немного умнее в том смысле, что вам не нужно беспокоиться о том, находитесь ли вы на последней строке или нет, добавляя новые строки. Следовательно, как только у вас есть ваши первые 2 выбора, вы можете легко скопировать / вставить последнюю строку (или среднюю), только сосредоточив внимание на значениях, которые вы должны изменить. Это общий трюк для множества других случаев на любых языках (запятая, логические операторы плюс ...). Это просто привычка, многие из прежних практик были пересмотрены, чтобы сосредоточиться на ответственности кода больше, чем на интуиции. – Laurent.B 24 May 2017 в 08:19
  • 6
    Столбец ID моей таблицы автогенерируется. Можно ли просто пропустить поле ID в файле управления загрузчиком? – Thom DeCarlo 8 September 2017 в 14:18
  • 7
    @Thom, используйте последовательность.nextval, например. fruit_id "fruit_seq.nextval" в определении столбца – ropata 8 February 2018 в 07:07
  • 8
    Каков максимум для 12c? – Toolkit 29 May 2018 в 16:27
  • 9
    50 миллионов записей за несколько минут. Способ передвижения – Toolkit 29 May 2018 в 17:14
128
ответ дан Espo 7 September 2018 в 05:51
поделиться
130
ответ дан Espo 30 October 2018 в 10:02
поделиться

Если у вас есть значения, которые вы хотите вставить в другую таблицу уже, то вы можете вставить из оператора select.

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

В противном случае вы можете перечислить кучу одноразовых вставных операторов и отправьте несколько запросов навалом, чтобы сэкономить время на то, что работает как в Oracle, так и в MySQL.

Решение @Espo также является хорошим, которое будет работать как в Oracle, так и в Oracle MySQL, если ваши данные еще не находятся в таблице.

9
ответ дан Community 18 August 2018 в 22:13
поделиться

В Oracle, чтобы вставить несколько строк в таблицу t с столбцами 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;
279
ответ дан Myto 18 August 2018 в 22:13
поделиться
  • 1
    Я не понимаю, что делает SELECT 1 FROM DUAL. – jameshfisher 28 March 2013 в 14:23
  • 2
    INSERT ALL требует подзапроса SELECT. Чтобы обойти это, SELECT 1 FROM DUAL используется, чтобы дать одну строку фиктивных данных. – Markus Jarderot 25 June 2013 в 09:17
  • 3
    Как это отличается от нескольких заявлений вставки? У вас все еще есть повторение по именам столбцов, поэтому, похоже, они не очень много. – Burhan Ali 21 March 2014 в 14:32
  • 4
    Примерно 10-12. Несколько операторов INSERT завершаются за 2 секунды на моем ПК, в то время как вышеприведенный синтаксис способен вставить 1000 записей в секунду! Впечатлительный! Обратите внимание, что я COMMIT только в конце. – Kent Pawar 22 April 2014 в 22:30
  • 5
    Это прекрасно работает, однако, если вы вставляете последовательность, скажем, user.NEXTVAL, она вернет одинаковое значение для каждой вставки. Вы можете вручную увеличить его во вставке, а затем обновить последовательность вне вставки. – user1412523 3 December 2015 в 13:03

Всякий раз, когда мне это нужно, я строю простой блок 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;
/
19
ответ дан user 18 August 2018 в 22:13
поделиться

Курсоры также могут использоваться, хотя и неэффективны. В следующей статье stackoverflow обсуждаются использование курсоров:

INSERT и UPDATE запись с использованием курсоров в oracle

0
ответ дан Vasanth Raghavan 18 August 2018 в 22:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: