web-dev-qa-db-ja.com

Oracle:blobを含むテーブルを.sqlファイルにエクスポートして、再度インポートできるようにします。

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

  • 名前VARCHAR2
  • データBLOB

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

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

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

10
user685428

これはSQLDeveloperでは不可能だと思います(ただし、あまり頻繁には使用しません)。

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

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

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

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

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

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

Utl_rawを使用する

もう1つの方法は、「blobリテラル」を使用することですが、文字リテラルの4000バイトに対するOracleの制限により、これはreallyに対してのみ機能します。 小さな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 * Loader入力ファイル

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

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

 NAME DATA 
 foobar blob_r1_c2.data 

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

 OPTIONS(skip = 1)
 LOAD DATA CHARACTERSET'WE8ISO8859P15 '
 INFILE'images.txt' 
 APPEND 
 INTO TABLE IMAGES 
 FIELDS TERMINATED BY '\ t'TRAILING NULLCOLS 
(
 NAME、
 lob_file_data FILLER、
 DATA LOBFILE(lob_file_data)TERMINATED BY EOF 
 )

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

詳細はマニュアルにあります: http://www.sql-workbench.net/manual/command-export.html

編集

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

あなたの答えのためのThx。私は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
2
user685428

これはSQL開発者では間違いなく可能です。

  • まず、適切なテーブルを選択して、ソースの場所にテーブルをエクスポートする必要があります。

ツール>データベースのエクスポート

  • 通常使用するExcelを挿入するのではなく、出力形式をloaderとして選択します。

これらの手順に従うと、sqlldr制御ファイルとデータファイルが作成され、オプションを選択した場合はcreate table ddlも作成されます。これらを使用して、宛先に(sqlldr)データをインポートできます。

これはより優れたソリューションであり、抽出と配布の観点から移植性があります。これにより、コードリポジトリを介してデプロイされるコンポーネントを柔軟に提供できます。

これはそれを段階的に説明するリンクです。

Oracle SQL Developerを使用した複数のBLOBのエクスポート

2
Kaushik Nayak

どうしても単一の.sqlファイルを使用してBLOBをインポートする必要がある場合は、PL/SQLを使用してスクリプトを生成できます。

set serveroutput on
declare
  lob_in blob;
  i integer := 0;
  lob_size integer;
  buffer_size integer := 1000;
  buffer raw(32767);
begin
  select
    data, dbms_lob.getlength(data)
    into lob_in, lob_size
  from images
  where name = 'example.png';

  for i in 0 .. (lob_size / buffer_size) loop
    buffer := dbms_lob.substr(lob_in, buffer_size, i * buffer_size + 1);
    dbms_output.put('dbms_lob.append(lob_out, hextoraw(''');
    dbms_output.put(rawtohex(buffer));
    dbms_output.put_line('''));');
  end loop;
end;

その出力は、次のようにエンコードされたBLOBのコンテンツになります。

dbms_lob.append(lob_out, hextoraw('FFD8FFE0...0000'));
dbms_lob.append(lob_out, hextoraw('00000000...0000'));
...
dbms_lob.append(lob_out, hextoraw('007FFFD9'));

PL/SQLを使用してすでに挿入されている行にロードできるもの:

declare
  lob_out blob;
begin
  select data into lob_out
  from images
  where name = 'example.png'
  for update;

  dbms_lob.append(lob_out, hextoraw('FFD8FFE0...0000'));
  dbms_lob.append(lob_out, hextoraw('00000000...0000'));
  ...
  dbms_lob.append(lob_out, hextoraw('007FFFD9'));
end;

結果の.sqlファイルは巨大になることを覚えておいてください。

1
Diogo Kollross

SQLワークベンチは、.sqlに加えて、blobデータに特別なファイル形式を使用します。このようなファイルを受け入れることができる場合、さらに簡単な解決策は、Oracleの 元のインポートとエクスポート を使用することです。 (非推奨ですが、OracleのDataPumpとは異なり、サーバーへのアクセス権は必要ありません。)

これがニースです エクスポート部分のチュートリアル

0
user474491