Вставка в несколько таблиц Oracle (Multi table insert)

«Multi table insert» или вставка одним запросом в несколько таблиц. Наверняка многим не хватало такой фишки, кто как реализовывал ее, но не знали, что это можно реализовать средствами Oracle.

Сегодня встретил заметку в блоге «System Engineering and RDBMS», в которой описывались конструкции, позволяющие делать вставки в несколько таблиц одним запросом. Сразу скажу, что все это возможно для версий 9i и выше.
Пример:

  1. create table TAB1 (COL1 NUMBER(#cc66cc;">30), COL2 NUMBER(#cc66cc;">30) );
  2. create table TAB2 (COL3 NUMBER(#cc66cc;">30), COL4 DATE);
  3. CREATE SEQUENCE TEST_SEQ INCREMENT BY #cc66cc;">1;
  4. insert
  5. when mod( object_id, #cc66cc;">2 ) = #cc66cc;">1 then
  6. into TAB1 ( COL1, COL2 ) values ( test_seq.nextval, object_id )
  7. when mod( object_id, #cc66cc;">2 ) = #cc66cc;">0 then
  8. into TAB2 ( COL3, COL4 ) values ( test_seq.nextval, created )
  9. select object_id, created from all_objects;
  10.  

Т.е. между INSERT и запросом с исходными данными у нас идет конструкция:

Изображение

Двумя словами можно описать следующим образом (для тех, у кого плохо с чтением подобных карт):
По некому условию (в качестве параметров условия можно брать значения из исходного запроса) мы делим вставку на несколько, т.е. в зависимости от исходных данных формируем отдельные вставки в разные таблицы либо в одну таблицу но, допустим, в разном формате. Кроме того, мы можем по одному условию делать вставки в несколько таблиц:


  1. INSERT ALL
  2. INTO sales (prod_id, cust_id, time_id, amount)
  3. VALUES (product_id, customer_id, weekly_start_date, sales_sun)
  4. INTO sales (prod_id, cust_id, time_id, amount)
  5. VALUES (product_id, customer_id, weekly_start_date+#cc66cc;">1, sales_mon)
  6. INTO sales (prod_id, cust_id, time_id, amount)
  7. VALUES (product_id, customer_id, weekly_start_date+#cc66cc;">2, sales_tue)
  8. INTO sales (prod_id, cust_id, time_id, amount)
  9. VALUES (product_id, customer_id, weekly_start_date+#cc66cc;">3, sales_wed)
  10. INTO sales (prod_id, cust_id, time_id, amount)
  11. VALUES (product_id, customer_id, weekly_start_date+#cc66cc;">4, sales_thu)
  12. INTO sales (prod_id, cust_id, time_id, amount)
  13. VALUES (product_id, customer_id, weekly_start_date+#cc66cc;">5, sales_fri)
  14. INTO sales (prod_id, cust_id, time_id, amount)
  15. VALUES (product_id, customer_id, weekly_start_date+#cc66cc;">6, sales_sat)
  16. SELECT product_id, customer_id, weekly_start_date, sales_sun,
  17. sales_mon, sales_tue, sales_wed, sales_thu, sales_fri, sales_sat
  18. FROM sales_input_table;
  19.  

(из примера в документации)
Еще один важный момент, сразу после INSERT указывается ALL (по-умолчанию) либо FIRST, в первом случае все условия проверяются и выполняются все вставки, результат вычисления значений у которых TRUE, во втором варианте проверяются все условия в порядке их указания в запросе до первого FALSE. Вставка, указанная в ELSE, будет выполнена если не выполнено ни одно условие.
Еще несколько примеров из доки:

  1. INSERT ALL
  2. WHEN order_total <> #cc66cc;">1000000 AND order_total <> #cc66cc;">2000000 THEN
  3. INTO large_orders
  4. SELECT order_id, order_total, sales_rep_id, customer_id
  5. FROM orders;
  6.  

Выполняет то же самое что и

  1. INSERT ALL
  2. WHEN order_total <> #cc66cc;">1000000 AND order_total < #cc66cc;">2000000 THEN
  3. INTO medium_orders
  4. #b1b100;">ELSE
  5. INTO large_orders
  6. SELECT order_id, order_total, sales_rep_id, customer_id
  7. FROM orders;
  8.  

А следующий пример вставляет заказы больше 2900000 в таблицу special_orders, но не вставляет в large_orders:

  1. INSERT FIRST
  2. WHEN ottl <> #cc66cc;">1000000 and ottl <> #cc66cc;">2900000 THEN
  3. INTO special_orders
  4. WHEN ottl > #cc66cc;">2000000 THEN
  5. INTO large_orders
  6. VALUES(oid, ottl, sid, cid)
  7. SELECT o.order_id oid, o.customer_id cid, o.order_total ottl,
  8. o.sales_rep_id sid, c.credit_limit cl, c.cust_email cem
  9. FROM orders o, customers c
  10. WHERE o.customer_id = c.customer_id;
  11.  
Источники
http://www.interface.ru/home.asp?artId=22689 http://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_9014.htm
09:39
2.45K
Нет комментариев. Ваш будет первым!
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.