2つのフィールドを持つテーブル「Images」があります。
そのテーブルを別のシステムにインポートできる.sqlファイルにエクスポートしたいと思います。 OracleSQLDeveloperの「データベースアンロード」アシスタントを使用してこれを実行しようとしました。ただし、生成されたファイルには名前のコンテンツが含まれているだけで、データは含まれていません。したがって、インポートした後、すべての名前になりますが、データフィールドはどこでもnullになります。
私はそれがただ1つのファイルであることを本当に望んでいます(私はfsのフィールドごとに1つのファイルにデータをダンプすることを含むいくつかの例を見ました...)
SQL Developerでそのようなスクリプトを生成することは可能ですか?またはそうするための他の方法/ツールはありますか?
これはSQLDeveloperでは不可能だと思います(ただし、あまり頻繁には使用しません)。
私が使用しているSQLクライアント- SQL Workbench/J -これを行うことができます。
このデータをエクスポートする方法はいくつかあります。
次のような特別な(ツール固有の)表記を使用して外部ファイルを参照するSQLスクリプトを作成できます。
INSERT INTO images
(name, data)
VALUES
('foobar', {$blobfile='blob_r1_c2.data'});
上記のステートメントは、SQLWorkbenchでのみ再度実行できます。他のSQLクライアントとは互換性がありません。
もう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ツールで機能します(非常に長い行のスクリプトを処理できる場合)。
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
これはSQL開発者では間違いなく可能です。
ツール>データベースのエクスポート
loader
として選択します。これらの手順に従うと、sqlldr
制御ファイルとデータファイルが作成され、オプションを選択した場合はcreate table
ddlも作成されます。これらを使用して、宛先に(sqlldr
)データをインポートできます。
これはより優れたソリューションであり、抽出と配布の観点から移植性があります。これにより、コードリポジトリを介してデプロイされるコンポーネントを柔軟に提供できます。
これはそれを段階的に説明するリンクです。
どうしても単一の.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ファイルは巨大になることを覚えておいてください。
SQLワークベンチは、.sqlに加えて、blobデータに特別なファイル形式を使用します。このようなファイルを受け入れることができる場合、さらに簡単な解決策は、Oracleの 元のインポートとエクスポート を使用することです。 (非推奨ですが、OracleのDataPumpとは異なり、サーバーへのアクセス権は必要ありません。)
これがニースです エクスポート部分のチュートリアル 。