Oracle эквивалент PostgreSQL INSERT ... RETURNING *; - PullRequest
8 голосов
/ 11 января 2012

Я преобразовал кучу запросов DML (INSERT / UPDATE / DELETE) из Oracle в PostgreSQL, и теперь мне нужно проверить, производят ли они одинаковый набор строк, т. Е. Удаление удаляет те же строки, предполагая, что оракул иБазы данных postgresql изначально содержат одни и те же данные, обновления обновляют те же строки и т. д. На стороне PostgreSQL я могу использовать возвращающее предложение с операторами DML, т.е.«возврат *» в любой оператор DML, не зная структуры или даже имени таблицы, в которой он выполняется, и просто получает все строки, как будто это оператор выбора.

Однако наСторона Oracle.Согласно документации, Oracle 8i (с которой я работаю) поддерживает предложение RETURNING, но оно должно сохранять результат в переменных, и, похоже, не существует очевидного способа получить все столбцы результата вместо ручного указания имени столбца.

Следовательно, вопрос заключается в том, существует ли оператор оракула (или последовательность операторов) для эмуляции PostgreSQL, «возвращающегося» * без жесткого кодирования таблицы или имен столбцов.Другими словами, есть ли способ написать функцию Oracle следующим образом:

fn('INSERT INTO test(id, name) VALUES(42, ''foo'')') 

Он должен возвращать набор строк, вставленных (или измененных в общем случае) с помощью оператора SQL.

Обновление: я действительно нашел очень похожий вопрос (для преобразования с сервера SQL, а не PostgreSQL, в Oracle).Тем не менее, я хотел бы услышать более простой ответ на этот вопрос, если это возможно.

Ответы [ 2 ]

4 голосов
/ 11 января 2012

Я мог бы представить решение, включающее EXECUTE IMMEDIATE, RETURNING и REF CURSOR, но очевидно, что оно будет далеко не простым. Ранее я нашел такие решения, как , с использованием XML для задач, где должны использоваться записи произвольного типа. Они довольно странные, если не сказать больше. Думаю, вам придется прибегнуть к выполнению двух отдельных запросов ... В частности, с Oracle 8i, боюсь, вы даже не сможете воспользоваться большинством этих функций.

Короче говоря, я не думаю, что в Oracle есть такая мощная конструкция SQL, как предложение Postgres ... RETURNING.

3 голосов
/ 11 января 2012

В настоящее время это невозможно, особенно в старой версии Oracle, такой как 8i. См. ответ на аналогичный вопрос.

...