2012-01-11 2 views
8

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

INSERT INTO test(id, name) VALUES(42, 'foo') RETURNING *; 

что хорошее вышеприведенным утверждением, что я могу предварять Вернувшееся * 'в любой оператор DML без знания структуры или даже имени таблицы, в которой она выполнена, и просто получить все строки, например, это оператор select.

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

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

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

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

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

+0

Вы можете назвать этот SQL с Java, возможно? –

+0

Нет, на самом деле я вызываю их из сценария python, следовательно, записывая per-statement, возвращающий colname, 1 colname2 требует разбора исходного оператора и извлечения столбцов и имен таблиц, что не то, что я хотел бы сделать для такого незначительная задача. – alexk

+0

Почему вы используете отмененную и прекращенную версию Oracle? –

ответ

3

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

4

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

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