INSERT ALL - Множественная вставка

добавлено: 09 апр 15
понравилось:0
просмотров: 10757
комментов: 2

теги:

Автор: Myp3_u_K

Чалышев Максим Михайлович
Учебный тренинг. SQL от новичка до профессионала.
Бесплатные авторские видеокурсы SQL, PLSQL, JAVA

Моя книга, электронная версия бесплатно
Oracle SQL. 100 шагов от новичка до профессионала. 20 дней новых знаний и практики или платная печатная версия

Как было бы хорошо с помощью одной команды Insert добавлять много записей сразу в разные таблицы :)
И такая возможность существует. Для этого используется команда INSERT ALL


INSERT ALL  Синтаксис
INSERT ALL INTO <table_name1> VALUES <value_list)
INTO <table_name2> VALUES <value_list>)
...<SELECT Statement>;
Где table_name1, table_name1 таблицы ,  
...<SELECT Statement> - запрос  для вставки данных

Приведем пример
Создадим две таблицы tab1,tab2
create table tab1(id number , val number);

create table tab2(id number , val number);



Используя инструкцию INSERT ALL INTO добавим данные в эти таблицы

insert into tab2 values(9000,9000);
commit;
insert all 
into tab2(id,val) values(1001,1112)
into tab1(id,val) select id,val from tab2 ;
commit;


Второй вариант вставки

insert all 
into tab2(id,val) values(1001,1112)
into tab1(id,val) select id,val from tab2 ;


Дополнительный интерес представляет конструкция insert all с условным выражением приведем пример использования

INSERT ALL WHEN id1 <> 11 THEN INTO tab2
values
  (id1, val1)
  select id as id1, val as val1 from tab1;

Комментарии


  • Это правильный комментарий , спасибо что заметили неточность

  • declare
    t_obj c_obj%ROWTYPE;
    begin
    --работает такая конструкция
    EXECUTE IMMEDIATE 'select t.* from c_obj t where t.obj_id=:parmOBJ_ID'
    into t_obj using parmOBJ_ID;
    --работает такая конструкция
    insert into c_obj t values t_obj;
    --работает такая конструкция. b_obj и с_obj таблицы одной структуры
    execute immediate 'insert into b_obj
    select c.* from c_obj c where c.obj_id=:parmOBJ_ID'
    using parmOBJ_ID;
    -- к сожалению не работает такая конструкция
    EXECUTE IMMEDIATE 'insert into c_obj t values :t_obj'
    using t_obj;
    --работает такая конструкция
    update c_obj t set row=t_obj where t.obj_id=parmOBJ_ID;
    -- к сожалению не работает такая конструкция
    EXECUTE IMMEDIATE 'update c_obj t set row=:t_obj where t.obj_id=:parmOBJ_ID'
    using t_obj,parmOBJ_ID;

    Ошибка: PLS-00457: выражения должны иметь тип SQL Текст: using t_obj;

    Ошибка: PLS-00457: выражения должны иметь тип SQL Текст: using t_obj,parmOBJ_ID;

    --И пробовали как это можно обойти??



Необходимо войти на сайт, чтобы оставлять комментарии