2013-10-04 6 views
-2

У меня есть одна родительская таблица, состоящая из 150 столбцов. Мне нужно получить записи из родительской таблицы и вставить их в 11 разных дочерних таблиц, которые имеют имена столбцов и типы данных.Вставьте данные в несколько таблиц из одной таблицы, используя процедуру

+0

I не вижу причин для PL/SQL, простой SQL будет делать. – user272735

+0

Будьте более конкретными. Вы хотите, чтобы данные были одинаковыми и отображали изменения во всех других таблицах при изменении любой другой таблицы. или распределять строки по таблицам. (попросил Anubhav Srivastava) –

+0

i Просто хочу, чтобы данные были одинаковыми и отображали изменения во всех остальных 11 таблицах при изменении в родительской (основной) таблице. Я не собираюсь ничего делать вручную, с дочерними таблицами. – Aaryan

ответ

1

У Oracle есть очень удобная команда INSERT ALL, которая может помочь в этом случае.

Синтаксис безусловной версии:

INSERT ALL 
    INTO child1(col1, col2, col3) VALUES(col1, col2, col3) 
    INTO child2 VALUES(col1, col2, col3) 
    INTO child3 (col1, col2, col3) 
    INTO child4 
SELECT col1, col2, col3 
FROM parent 
-- WHERE some conditions; 

Ссылка на демонстрационный пример: ->http://sqlfiddle.com/#!4/3eb62/1

Эта команда извлекает все строки из таблицы, используя parentSELECT ... FROM ... (в нижней части) , то для каждой полученной записи он выполняет все операторы INSERT ....
Если предложение SELECT также содержит предложение WHERE conditions, тогда будут вставлены только строки, соответствующие этим условиям.

INSERT часть запроса в примере, может иметь различные формы:

  • Полные формы с явно определяемыми столбцами таблиц источника и назначения:

    INTO dest_table(destcol1, ... destcolN) VALUES (sourcecol1, ..., sourcecolN)

  • A сокращенная форма, где даны только столбцы из таблицы источников

    INTO dest_table VALUES (sourcecol1, ..., sourcecolN)

  • Другой сокращенная форма, где только столбцы из таблицы назначения приведены

    INTO dest_table(destcol1, ... destcolN)

  • или самый простой:

    INTO dest_table


INSERT ALL имеет также версию условного:

INSERT ALL 
    WHEN 1=1 THEN INTO child1(col1, col2, col3) VALUES(col1, col2, col3) 
    WHEN col1 <> 2 THEN INTO child2 VALUES(col1, col2, col3) 
    WHEN col3 < 3 THEN INTO child3 (col1, col2, col3) 
    WHEN col2 = 'rec 3' THEN INTO child4 
SELECT col1, col2, col3 
FROM parent; 

Ссылка на демо: --->http://sqlfiddle.com/#!4/e7da3/1

Эта версия вставляет строки только тогда, когда указанное условие после WHEN положение Достойно.
Для каждой выбранной строки всегда выполняются все условия.



Существует также другой условная форма: INSERT FIRST

INSERT FIRST 
    WHEN col1 >= 4 THEN INTO child1(col1, col2, col3) VALUES(col1, col2, col3) 
    WHEN col1 >= 3 THEN INTO child2 VALUES(col1, col2, col3) 
    WHEN col1 >= 2 THEN INTO child3 (col1, col2, col3) 
    WHEN col1 >= 1 THEN INTO child4 
SELECT col1, col2, col3 
FROM parent; 

Ссылка на демонстрационный пример: http://sqlfiddle.com/#!4/a421e/1

Здесь для каждого исходного ряда, Oracle оценивает условия сверху вниз, а когда какое-то условие истинно, тогда execu tes только этот оператор INSERT и пропускает оставшиеся вставки.




------- EDIT -------

пример, как сделать это в процедурном образом:

CREATE OR REPLACE PROCEDURE name 
AS 
BEGIN 
    INSERT ALL 
     INTO child1(col1, col2, col3) VALUES(col1, col2, col3) 
     INTO child2 VALUES(col1, col2, col3) 
     INTO child3 (col1, col2, col3) 
     INTO child4 
    SELECT col1, col2, col3 
    FROM parent ; 
    -- if commit is required, place it here 
    -- COMMIT; 
END; 
/
+0

Спасибо за ответ выше, но на самом деле мне нужно написать выше запрос в процедурной форме (в виде хранимой процедуры), чтобы я мог ее скриптировать. Я не хочу добавлять или вставлять столбцы каждый раз по одному. это должно быть как всякий раз, когда я буду запускать процедуру, все данные должны быть вставлены автоматически за один раз. – Aaryan

+0

Я приложил пример процедуры. – krokodilko

+0

Извините Mate ,, я попробовал, но он показал ошибку, говорящую о PL/SQL; SQL Statement игнорируется и показывает красную метку рядом с вставкой всех. не могли бы вы посоветовать мне, что делать дальше. я также пытался поставить запятые и точки с запятой, но не смог исправить. :( – Aaryan

Смежные вопросы