2012-01-11 65 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的'返回*'而沒有硬編碼表或列名稱。換句話說,有沒有寫這樣一個Oracle功能的方法:

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

應該由SQL語句返回集插入(或修改一般情況下)行。

更新: 我實際上發現a very similar question(用於從SQL服務器,而不是PostgreSQL到Oracle的轉換)。不過,如果可能的話,我很樂意聽到更簡單的答案。

+0

你是從Java調用這個SQL嗎? – 2012-01-11 14:22:32

+0

不,實際上我是從一個python腳本調用它們,因此,編寫per-statement返回colname,1 colname2需要解析原始語句並提取列和表名,這不是我喜歡做的這樣一個小任務。 – alexk 2012-01-11 14:33:21

+0

你爲什麼使用一個不支持和停止使用的Oracle版本? – 2012-01-11 15:09:15

回答

3

目前不可能,尤其是在Oracle的舊版本(如8i)中。看到這個answer類似的問題。

4

我可以想象一個涉及EXECUTE IMMEDIATE, RETURNINGREF CURSOR的解決方案,但顯然它不會很簡單。我以前發現如this one, involving XML這樣的解決方案存在任何類型的記錄將被使用的問題。至少可以說,他們很怪異。我想你不得不求助於運行兩個單獨的查詢......具體來說,對於Oracle 8i,恐怕你甚至不能從大多數這些功能中獲利。

總之,我不認爲有任何SQL構造像Oracle中的Postgres ... RETURNING子句那樣強大。