2012-01-11 14 views
8

Przekonwertowałem kilka zapytań DML (INSERT/UPDATE/DELETE) z Oracle do PostgreSQL i teraz muszę sprawdzić, czy tworzą ten sam zestaw wierszy, tj. Że usuwanie usuwa te same wiersze, zakładając oracle i postgresql bazy danych zawierają te same dane początkowo, aktualizacja aktualizuje te same wiersze itd. na stronie PostgreSQL, mogę skorzystać z powracającego klauzuli z instrukcji DML, tjOracle odpowiednik PostgreSQL INSERT ... RETURNING *;

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

Co jest dobre na temat rachunku powyżej jest to, że mogę poprzedzić „powrocie * "do dowolnej instrukcji DML bez znajomości struktury, a nawet nazwy tabeli, z której jest wykonywany i po prostu uzyskać wszystkie wiersze, takie jak to jest instrukcja select.

Jednak wydaje się, że nie jest tak błyszczące po stronie Oracle. Zgodnie z dokumentacją, Oracle 8i (ten, z którym pracuję) obsługuje klauzulę RETURNING, ale musi przechowywać wynik w zmiennych i wydaje się, że nie ma oczywistego sposobu na uzyskanie wszystkich kolumn wynikowych zamiast ręcznego określania nazwy kolumny.

W związku z tym pytanie brzmi, czy istnieje wyrażenie Oracle (lub sekwencja instrukcji) do emulacji PostgreSQL "powracającego" bez sztywnych nazw tabel lub kolumn. Innymi słowy, czy istnieje sposób napisać funkcję Oracle takiego:

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

Należy zwrócić zestawu wierszy wstawionych (lub zmodyfikowanych w ogólnym przypadku) przez SQL.

Aktualizacja: Tak naprawdę znalazłem a very similar question (dla konwersji z serwera SQL, nie PostgreSQL, na Oracle). Mimo to, chciałbym usłyszeć prostszą odpowiedź, jeśli to możliwe.

+0

Czy dzwonisz do tego SQL z Java? –

+0

Nie, tak naprawdę wywołuję je ze skryptu Pythona, stąd pisanie instrukcji per-statement zwracających nazwę kolumny, 1 nazwa_kara2 wymaga przeanalizowania oryginalnej instrukcji i wyodrębnienia nazw kolumn i tabel, co nie jest tym, co chciałbym zrobić dla takiego niewielkie zadanie. – alexk

+0

Dlaczego korzystasz z wycofanej i wycofanej wersji Oracle? –

Odpowiedz

3

Obecnie nie jest to możliwe, szczególnie w starej wersji Oracle, takiej jak 8i. Zobacz to answer na podobne pytanie.

4

Mogę sobie wyobrazić rozwiązanie z udziałem EXECUTE IMMEDIATE, RETURNING i REF CURSOR, ale oczywiście nie będzie to łatwe. Wcześniej znalazłem rozwiązania, takie jak this one, involving XML, w których występują problemy z rekordami dowolnego typu. Są co najmniej dziwne. Domyślam się, że musisz uciec się do dwóch oddzielnych zapytań ... W szczególności, z Oracle 8i, obawiam się, że nie będziesz w stanie czerpać zysków z większości tych funkcji.

Podsumowując, nie sądzę, aby istniała jakakolwiek konstrukcja SQL tak silna jak klauzula Postgres ... RETURNING w Oracle.

Powiązane problemy