Вставка в кілька таблиць Oracle

"Multi table insert" або вставка одним запитом в кілька таблиць. Напевно багатьом не вистачало такої фішки, хто як реалізовував її, але не знали, що це можна реалізувати засобами Oracle.
Сьогодні зустрів замітку в блозі "System Engineering and RDBMS", в якій описувалися конструкції, що дозволяють робити вставки в кілька таблиць одним запитом. Відразу скажу, що все це можливо для версій 9i і вище.
Приклад:

create table TAB1 (COL1 NUMBER(30), COL2 NUMBER(30) );

Table created.

create table TAB2 (COL3 NUMBER(30), COL4 DATE);

Table created.

CREATE SEQUENCE TEST_SEQ INCREMENT BY 1;

Sequence created.

insert
when mod( object_id, 2 ) = 1 then
into TAB1 ( COL1, COL2 ) values ( test_seq.nextval, object_id )
when mod( object_id, 2 ) = 0 then
into TAB2 ( COL3, COL4 ) values ( test_seq.nextval, created )
select object_id, created from all_objects
/

Тобто між INSERT і запитом з вихідними даними у нас йде конструкція:

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

INTO sales (prod_id, cust_id, time_id, amount)
VALUES (product_id, customer_id, weekly_start_date +1, sales_mon)
INTO sales (prod_id, cust_id, time_id, amount)
VALUES (product_id, customer_id, weekly_start_date +2, sales_tue)
INTO sales (prod_id, cust_id, time_id, amount)
VALUES (product_id, customer_id, weekly_start_date +3, sales_wed)
(З прикладу в документації)
Ще один важливий момент, відразу після INSERT вказується ALL (по-умовчанню) або FIRST, в першому випадку всі умови перевіряються і виконуються всі вставки, результат обчислення значень у яких TRUE, під другому варіанті перевіряються всі умови в порядку їх зазначення в запиті до першого FALSE. Вставка, зазначена в ELSE, буде виконана якщо не виконано жодне умова.
Ще кілька прикладів з доки:
INSERT ALL
WHEN order_total <> 1000000 AND order_total <> 2000000 THEN
INTO large_orders
SELECT order_id, order_total, sales_rep_id, customer_id
FROM orders;
Виконує те ж саме що і
INSERT ALL
WHEN order_total <> 1000000 AND order_total <2000000 THEN
INTO medium_orders
ELSE
INTO large_orders
SELECT order_id, order_total, sales_rep_id, customer_id
FROM orders;
А наступний приклад вставляє замовлення більше 2900000 в таблицю special_orders, але не вставляє в large_orders:
INSERT FIRST
WHEN ottl <> 1000000 and ottl <> 2900000 THEN
INTO special_orders
WHEN ottl > 2000000 THEN
INTO large_orders
VALUES(oid, ottl, sid, cid)
SELECT o.order_id oid, o.customer_id cid, o.order_total ottl,
o.sales_rep_id sid, c.credit_limit cl, c.cust_email cem
FROM orders o, customers c
WHERE o.customer_id = c.customer_id;

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*