Oracleデータベースを使用していますが、BLOBの内容を読みたいです。どうすればいいですか?
単純なselectステートメントを実行すると、 "(BLOB)"(引用符なし)が返されるだけです。実際の内容をどのように読みますか?
UTL_RAW.CAST_TO_RAW(UTL_RAW.CAST_TO_VARCHAR2())
を使用して、値を16進数でダンプできます。
SELECT b FROM foo;
-- (BLOB)
SELECT UTL_RAW.CAST_TO_RAW(UTL_RAW.CAST_TO_VARCHAR2(b))
FROM foo;
-- 1F8B080087CDC1520003F348CDC9C9D75128CF2FCA49D1E30200D7BBCDFC0E000000
これは、BLOB列への挿入に使用されるのと同じ形式であるため便利です。
CREATE GLOBAL TEMPORARY TABLE foo (
b BLOB);
INSERT INTO foo VALUES ('1f8b080087cdc1520003f348cdc9c9d75128cf2fca49d1e30200d7bbcdfc0e000000');
DESC foo;
-- Name Null Type
-- ---- ---- ----
-- B BLOB
ただし、特定のポイント(2000バイト?)で、対応する16進文字列がOracleの最大文字列長を超えています。そのケースを処理する必要がある場合は、 Oracle SQLのBLOBからテキストコンテンツを取得する方法 と DMBS_LOB.SUBSTR
のドキュメント を組み合わせる必要があります。 BLOBの部分文字列を表示できる、より複雑なアプローチ。
SQL Developerでは、blobをイメージとして表示できます(少なくともjpegでは機能します)。データビューで、BLOBフィールドをダブルクリックして「鉛筆」アイコンを取得します。鉛筆をクリックすると、「画像として表示」チェックボックスを選択できるダイアログが表示されます。
MicrosoftドライバーではなくOracleネイティブデータプロバイダーを使用すると、すべてのフィールドタイプを取得できます
_Dim cn As New Oracle.DataAccess.Client.OracleConnection
Dim cm As New Oracle.DataAccess.Client.OracleCommand
Dim dr As Oracle.DataAccess.Client.OracleDataReader
_
接続文字列にはProvider値が必要ないため、次のようなものを使用します。
_"Data Source=myOracle;UserID=Me;Password=secret"
_
接続を開きます。
_cn.ConnectionString = "Data Source=myOracle;UserID=Me;Password=secret"
cn.Open()
_
コマンドを添付して、SQLステートメントを設定します
_cm.Connection = cn
cm.CommandText = strCommand
_
フェッチサイズを設定します。 4000を使用します。これは、varcharと同じ大きさだからです。
_cm.InitialLONGFetchSize = 4000
_
リーダーを起動し、レコード/列をループします
_dr = cm.ExecuteReader
Do while dr.read()
strMyLongString = dr(i)
Loop
_
列のデータ型を最初に識別すると、たとえばdr.GetOracleString(i)dr.GetOracleClob(i)など、読み取りをより具体的にすることができます。 LONGデータ型を読み取る場合、単純なdr(i)
またはdr.GetOracleString(i)
は正常に機能します。重要なのは、InitialLONGFetchSizeがデータ型に対して十分な大きさであることを確認することです。また、ネイティブドライバーはデータリーダーの_CommandBehavior.SequentialAccess
_をサポートしていませんが、必要ではないことに注意してください。また、LONGフィールドはselectステートメントの最後のフィールドである必要さえありません。
コンテンツが大きすぎない場合は、使用することもできます
SELECT CAST ( <blobfield> AS RAW( <maxFieldLength> ) ) FROM <table>;
または
SELECT DUMP ( CAST ( <blobfield> AS RAW( <maxFieldLength> ) ) ) FROM <table>;
これにより、HEX値が表示されます。
BLOB
からプレーンテキスト(本文部分)を取得する場合は、 CTX_DOCパッケージ を使用できます。
たとえば、CTX_DOC.FILTER
プロシージャは、「プレーンテキストまたはHTMLバージョンのドキュメントを生成する」ことができます。 CTX_DOC.FILTER
にはBLOB
列のインデックスが必要であることに注意してください。そうしたくない場合は、代わりにCTX_DOC.POLICY_FILTER
プロシージャを使用できます。これはインデックスを必要としません。
どのクライアントを使用していますか? .Net、Java、Ruby、SQLPLUS、SQL DEVELOPER?単純なselect文はどこで書きましたか?
そして、なぜblobの内容を読みたいのですか?blobにはバイナリデータが含まれているので、データは読み取れません。バイナリコンテンツの代わりにテキストを保存する場合は、blobではなくclobを使用する必要があります。
SQL DEVELOPER: http://www.Oracle.com/technetwork/developer-tools/sql-developer/overview/index.html をダウンロードすることをお勧めします。 SQL DEVELOPERを使用すると、コンテンツを表示できます。