web-dev-qa-db-ja.com

Oracleデータベース:BLOBの読み取り方法

Oracleデータベースを使用していますが、BLOBの内容を読みたいです。どうすればいいですか?

単純なselectステートメントを実行すると、 "(BLOB)"(引用符なし)が返されるだけです。実際の内容をどのように読みますか?

12
ktm5124

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の部分文字列を表示できる、より複雑なアプローチ。

9
andrewdotn

SQL Developerでは、blobをイメージとして表示できます(少なくともjpegでは機能します)。データビューで、BLOBフィールドをダブルクリックして「鉛筆」アイコンを取得します。鉛筆をクリックすると、「画像として表示」チェックボックスを選択できるダイアログが表示されます。

7
bob coner

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ステートメントの最後のフィールドである必要さえありません。

2
Dave Harper

コンテンツが大きすぎない場合は、使用することもできます

SELECT CAST ( <blobfield> AS RAW( <maxFieldLength> ) ) FROM <table>;

または

SELECT DUMP ( CAST ( <blobfield> AS RAW( <maxFieldLength> ) ) ) FROM <table>;

これにより、HEX値が表示されます。

2
AchimHensel

BLOBからプレーンテキスト(本文部分)を取得する場合は、 CTX_DOCパッケージ を使用できます。

たとえば、CTX_DOC.FILTERプロシージャは、「プレーンテキストまたはHTMLバージョンのドキュメントを生成する」ことができます。 CTX_DOC.FILTERにはBLOB列のインデックスが必要であることに注意してください。そうしたくない場合は、代わりにCTX_DOC.POLICY_FILTERプロシージャを使用できます。これはインデックスを必要としません。

0
5ton3

どのクライアントを使用していますか? .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を使用すると、コンテンツを表示できます。

0
TTT