2012-03-23 2 views
0

アプリケーショントランザクション中にエラーが発生したときにテーブルの内容をダンプするPL/SQLプロシージャを開発しました。 dumpは、トランザクションのROLLBACKの前にテーブルの内容と一致する必要があります。"CREAT TABLE"を実行せずにOracle外部テーブル "ダンプファイル"を取得する方法

テーブル(TYPE ORACLE_DATAPUMP)のダンプ形式として外部表を使用することを考えました。 Oracleのドキュメントを通過した後、私はそれに唯一の方法は、実行していることがわかった。

CREATE TABLE tabtest_test (
F1 NUMBER, 
F2 CHAR(10)) 
ORGANIZATION EXTERNAL (
TYPE ORACLE_DATAPUMP 
DEFAULT DIRECTORY USER_DUMP_DEST 
LOCATION ('tabtest.dmp’)); 

問題は、「CREATE TABLE」を実行することで、Oracleは暗黙的にする必要が私たちの失敗したトランザクション内でコミットを実行していることですテーブルのダンプの後にロールバックされます。

私は "CREATE TABLE"を実行するのに "PRAGMA AUTONOMOUS_TRANSACTION;"を使用することを考えましたが、アプリケーショントランザクションの外でテーブルの内容をダンプするので、私たちの必要性に実際には合いません。

私の質問:「作成テーブル」を実行せずに 'tabtest.dmp'を取得する方法はありますか?たとえば、これを担当するOracle APIに直接アクセスすることによって実現できます。

よろしくお願いいたします。

+2

テーブルを1回作成するだけで済みます。コンテンツをダンプするたびにこれを行う必要はありません。 –

+0

@a_horse_with_no_name:いいえ、毎回テーブルを作成するために必要なdmpファイルを取得します。 – SamiBOB

+1

エラーが発生するたびに内容全体をダンプする必要がありますか?あなたの要件を見直すか、そうでなければ経営陣を説得したいかもしれません。 – tbone

答えて

0

AUTONOMOUS_TRANSACTIONSを使用して別のトランザクションでテーブルを作成することができます(これは大きなIFです)。これはあなたがする必要があると思います。現在のトランザクションの範囲内でテーブルを作成し、新しく作成したテーブルにデータを書き込むと、ROLLBACKを実行するとすぐにそのデータはすべての権利によって消えます。

ここで発生している問題は、「リレーショナルデータベースをフラットファイルとして処理しようとすると発生する問題」という大きな問題のサブセットです。リレーショナルデータベースは、AS DATABASESを使用すると優れていますが、フラットファイルでは本当に悪いです。それは農場のような動物のようなものです - 羊は偉大なAS SHEEPですが、貧しい牛を作る。牛は卑劣な山羊を作る。ヤギ - 偉大な動物 - インテリジェントで愛情のある(肯定的な)、メンテナンスが低い、それらに対して話されている言葉は聞こえませんが、ドラフトで欲しいものではありません - そのために馬、牛、またはミュールを使用してください。基本的には、コースのために馬を選ぶべきです(表現を赦してください)。データベースは虚偽のフラットファイルを作成し、その逆もあります。適切なものを使用してください。

IMOフラットファイルにデータを書き込む方がよいでしょう。おそらく、このファイルを外部テーブルとしてマップすることができます。あなたは他の多くのツールが処理できるCSV形式のようなものでファイルを書きたいかもしれません。 YMMV。

共有して楽しんでください。

1

アプリケーション設定プロセスの一環として、一度外部テーブルを作成するのはどうですか?

これは失敗する可能性がありますが、トランザクションの開始時に必要になる可能性があります。エラーが発生した場合は、それを入力します。トランザクションが正常に終了したら、それをドロップします。

0

なぜ外部テーブルを使用する必要がありますか?あなたはUTL_FILEを使ってファイルを読むことができます。

関連する問題