2012-01-11 10 views
8

OracleからPostgreSQLへのDML(INSERT/UPDATE/DELETE)クエリの束を変換したので、同じ行セットを生成するかどうかを確認する必要があります。つまり、oracleとpostgresqlデータベースは、*何上記の文について良いことだが、私は戻って」先頭に追加できるということですつまりPostgreSQLのOracleに相当するINSERT ... RETURNING *;

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

、最初に、更新はPostgreSQLの側など、同じ行を更新し、私はDML文でRETURNING句を使用することができ、同じデータが含まれています'をDML文の構造や名前を知らなくても実行することができ、select文のようにすべての行を取得するだけです。

しかし、Oracle側では光っていないようです。 Oracle 8i(私が扱っているもの)によれば、RETURNING節をサポートしていますが、結果を変数に格納しなければならず、列名を手動で指定する代わりにすべての結果列を取得する明白な方法がないようです。

したがって、問題は、PostgreSQLをエミュレートするoracleステートメント(または一連のステートメント)があり、テーブル名または列名をハードコードせずに「*を返す」場合です。言い換えれば、このようなOracleの機能を記述する方法があります:

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

これは、SQL文で挿入(または一般的な場合には修正された)行の集合を返す必要があります。

更新: 私は実際にa very similar question(PostgreSQLではなくSQLサーバーからOracleへの変換用)を見つけました。それでも、私はできるだけ簡単な答えを聞きたいです。

+0

JavaからこのSQLを呼び出していますか? –

+0

いいえ、実際に私はPythonスクリプトから呼び出しています。したがって、文ごとにcolnameを返します.1 colname2は元の文を解析し、列名と表名を抽出する必要があります。マイナーな仕事。 – alexk

+0

サポートされなくなり、廃止されたOracleバージョンを使用しているのはなぜですか? –

答えて

3

特に8iなどの旧バージョンのOracleでは、現在のところ実行できません。同様の質問にこのanswerを参照してください。

4

私はEXECUTE IMMEDIATE, RETURNINGREF CURSORを含む解決策を想像することができましたが、明らかに単純ではありません。以前は、任意のタイプのレコードを使用する問題に対して、this one, involving XMLのような解決策を発見しました。彼らは、少なくとも、あまりにも言い表せば、非常に気まずいです。私はあなたが2つの別々のクエリを実行することに頼らざるを得ないと思います...特に、Oracle 8iでは、これらの機能のほとんどから利益を得ることさえできないのではないかと心配しています。

要するに、OracleではPostgres ... RETURNING節のような強力なSQL構文はないと思います。

関連する問題