14

2 つのフィールドを持つテーブル「画像」があります。

  • 名前 VARCHAR2
  • データ BLOB

そのテーブルを、別のシステムにインポートできる .sql ファイルにエクスポートしたいと思います。Oracle SQL Developerの「データベースアンロード」アシスタントを使用してそうしようとしました。ただし、生成されたファイルには名前の内容だけが含まれ、データは含まれません。したがって、インポートした後、すべての名前が表示されますが、データ フィールドはどこでも null になります。

1つのファイルにすることを本当に望んでいます(fsのフィールドごとに1つのファイルにデータをダンプすることを含むいくつかの例を見ました...)

SQL Developerでそのようなスクリプトを生成することは可能ですか? または、そうする他の方法/ツールはありますか?

4

5 に答える 5

11

これは SQL Developer では可能ではないと思います (しかし、あまり頻繁には使用しません)。

私が使用している SQL クライアント - SQL Workbench/J - はこれを行うことができます。

このデータをエクスポートするには、いくつかの方法があります。

独自のスクリプトを生成する

次のような、特別な (ツール固有の) 表記法を使用して外部ファイルを参照する SQL スクリプトを作成できます。

INSERT INTO images
  (name, data)
VALUES
  ('foobar', {$blobfile='blob_r1_c2.data'});

上記のステートメントは、再度 SQL Workbench でのみ実行できます。他の SQL クライアントとは互換性がありません。

utl_raw を使用

もう 1 つの方法は「blob リテラル」を使用することですが、文字リテラルの 4000 バイトに対する Oracle の制限により、これは非常に小さな blob 値に対してのみ機能します

INSERT INTO images
  (name, data)
VALUES
  ('foobar', to_blob(utl_raw.cast_to_raw('......')));

呼び出しの文字リテラルにcast_to_rawは、BLOB の 16 進値が含まれます。これには「blob バイト」ごとに 2 文字が必要なため、2000 バイトを超える BLOB を処理することはできません。ただし、その構文は、ほぼすべての Oracle SQL ツールで機能します (非常に長い行を含むスクリプトを処理できる場合)。

SQL*ローダー入力ファイル

3 番目の方法は、SQL*Loader を使用してインポートできるテキスト ファイルにデータをエクスポートすることです。

テキスト ファイルには次のような内容が含まれます。

名前データ
foob​​ar blob_r1_c2.data

次のSQL*Loader制御ファイルとともに:

オプション (スキップ = 1)
LOAD DATA CHARACTERSET 'WE8ISO8859P15'
INFILE 'images.txt'
追記
INTO TABLE 画像
'\t' 末尾の NULLCOLS で終了するフィールド
(
  名前、
  lob_file_data FILLER、
  データ LOBFILE(lob_file_data) が EOF で終了しました
)

これは SQL*Loader を使用してロードできるため、データをインポートするために SQL Workbench は必要ありません。

詳細はマニュアルに記載されています

編集

Alex がコメントで指摘しているように、DataPump エクスポートを使用することもできますが、それにはサーバー上のファイル システムにアクセスできる必要があります。上記のソリューションはすべてクライアントにデータを保存します。

于 2012-11-23T15:53:41.103 に答える
3

答えてくれてありがとう。私は 3 番目の方法を使用しました。まず、SQL Workbench/J をダウンロードしました。次に、次のコマンドを使用してエクスポートを作成しました。

WbExport -type=text -file='c:\temp\Images' delimiter='|' -decimal=',' -sourcetable=Images -formatfile=oracle;

これにより、Images.txt ファイルと多くの Images_r*_c2.data ファイルと Images.ctl ファイルが作成されました。

次に、次のコマンドを使用してインポートできます。

sqlldr myuser@myhost/mypassword control=Images.ctl
于 2012-11-27T15:14:10.023 に答える