У меня есть одна родительская таблица, состоящая из 150 столбцов. Мне нужно получить записи из родительской таблицы и вставить их в 11 разных дочерних таблиц, которые имеют имена столбцов и типы данных.Вставьте данные в несколько таблиц из одной таблицы, используя процедуру
ответ
У 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
Эта команда извлекает все строки из таблицы, используя parent
SELECT ... 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;
/
Спасибо за ответ выше, но на самом деле мне нужно написать выше запрос в процедурной форме (в виде хранимой процедуры), чтобы я мог ее скриптировать. Я не хочу добавлять или вставлять столбцы каждый раз по одному. это должно быть как всякий раз, когда я буду запускать процедуру, все данные должны быть вставлены автоматически за один раз. – Aaryan
Я приложил пример процедуры. – krokodilko
Извините Mate ,, я попробовал, но он показал ошибку, говорящую о PL/SQL; SQL Statement игнорируется и показывает красную метку рядом с вставкой всех. не могли бы вы посоветовать мне, что делать дальше. я также пытался поставить запятые и точки с запятой, но не смог исправить. :( – Aaryan
- 1. Вставьте данные из одной таблицы в другую таблицу, используя Symfony
- 2. Вставьте некоторые данные в несколько таблиц, используя C#
- 3. Вставьте данные в несколько таблиц, используя одну форму
- 4. Вставьте данные в несколько таблиц из 1 источника
- 5. mysql создать несколько таблиц из одной таблицы
- 6. вставьте данные из одной таблицы в другую в mysql
- 7. Вставьте мои данные из реляционных таблиц в объектно-реляционные таблицы
- 8. Вставьте данные из таблицы A в таблицуB
- 9. Вставьте данные в несколько таблиц с одним триггером
- 10. Вставьте несколько записей одной таблицы Yii2
- 11. SQL - несколько таблиц против одной большой таблицы
- 12. Вставьте в несколько строк на нескольких таблиц
- 13. Вставьте данные из одной таблицы SQL Server в другую
- 14. Вставьте данные из одной таблицы в другую таблицу
- 15. Mysql удалить из одной таблицы, используя условие из двух таблиц
- 16. Hive создать/обновить несколько таблиц из данных одной таблицы
- 17. Вставьте данные одной таблицы в db в другую таблицу db.
- 18. Данные SQL из одной из двух таблиц
- 19. Вставьте данные из другого БД в таблицы
- 20. Вставьте данные в несколько таблиц в инфраструктуру сущности
- 21. Вставьте данные в несколько таблиц одним нажатием кнопки
- 22. вставьте данные из таблицы html в mysql, используя php
- 23. Вставьте значение из одной таблицы в другую
- 24. вставки данных из одной таблицы в несколько таблиц
- 25. Как вставить в несколько таблиц из одной таблицы через процедуры?
- 26. SQL * Loader: вставьте связанные данные в несколько таблиц
- 27. Вставьте общие данные из одной базы данных в другую?
- 28. Вставьте данные для двух таблиц, используя одну форму в zend
- 29. Выберите из одной таблицы и вставьте в другую две таблицы
- 30. Вставьте данные из двух таблиц в другую таблицу
I не вижу причин для PL/SQL, простой SQL будет делать. – user272735
Будьте более конкретными. Вы хотите, чтобы данные были одинаковыми и отображали изменения во всех других таблицах при изменении любой другой таблицы. или распределять строки по таблицам. (попросил Anubhav Srivastava) –
i Просто хочу, чтобы данные были одинаковыми и отображали изменения во всех остальных 11 таблицах при изменении в родительской (основной) таблице. Я не собираюсь ничего делать вручную, с дочерними таблицами. – Aaryan