こんにちは、カメ助(@kamesuke_blog)です。
業務でOracleDBのBLOBデータの中身を確認する必要がありました。しかし、単純なSELECT文では(BLOB)と表示され、BLOBデータの中身を確認できません。
そこで、BLOBデータの中身を確認するSQLを作成したのでまとめておきます。Oracleユーザーの参考になれば嬉しいです。
BLOBデータの中身を確認するSQL
単純なSQL(SELECT文)では、BLOBデータは(BLOB)と表示され確認できませんが、このSQLを実行すると確認できます。
1 2 3 4 |
SELECT UTL_RAW.CAST_TO_VARCHAR2(SYS.DBMS_LOB.SUBSTR(BLOBのカラム, 2000, 1)) FROM 対象テーブル; |
上記の例は、対象テーブルからBLOBのカラムの1バイト~最大2000バイトまでのデータを読み取り、文字列として出力します。
続いてSQLでBLOBデータを確認する具体例を見ていきましょう。
具体例:BLOBデータの中身を確認する
前提のDBデータ
DB(TEST_BLOB_TABLEテーブル)に以下のデータが登録されているとします。
ID | BLOB_COLUMN ※BLOB型 |
---|---|
1 | test_blob_data |
2 | test_blob_data2 |
当然ですが、単純なSQL(SELECT文)で内容を確認すると、下図の通りBLOBのデータは見えません。
BLOBデータの中身を確認するSQL
1 2 3 4 5 |
SELECT ID, UTL_RAW.CAST_TO_VARCHAR2(SYS.DBMS_LOB.SUBSTR(BLOB_COLUMN, 2000, 1)) BLOB_COLUMN FROM TEST_BLOB_TABLE; |
実行結果
BLOBカラムのデータ内容が文字列として確認できますね。
SQL解説
SQLの内容について解説します。忙しい方は読み飛ばしていただいて問題ありません。
まず、SYS.DBMS_LOB.SUBSTR(BLOB_COLUMN, 2000, 1)では、BLOBデータを16進数で表示します。
1 2 3 4 5 |
SELECT ID, SYS.DBMS_LOB.SUBSTR(BLOB_COLUMN, 2000, 1) BLOB_COLUMN FROM TEST_BLOB_TABLE; |
SQLの実行結果
データの中身は(BLOB)ではない状態になっていますね。ただし、16進数のため中身を確認することが難しいです。そこで、UTL_RAW.CAST_TO_VARCHAR2() を使うと、16進数のデータをVARCHAR2型(文字列)に変換できます。
SYS.DBMS_LOB.SUBSTR(BLOB_COLUMN, 2000, 1)の部分をUTL_RAW.CAST_TO_VARCHAR2(SYS.DBMS_LOB.SUBSTR(BLOB_COLUMN, 2000, 1))に変更することで、BLOBのデータの中身が確認できるようになります。
ちなみに、16進数:746573745F626C6F625F64617461 = 文字列:test_blob_data を意味しています。
- BLOBデータを16進数で表示:SYS.DBMS_LOB.SUBSTR()
- 16進数を文字列に変換:UTL_RAW.CAST_TO_VARCHAR2()
まとめ
BLOBデータの中身を確認するSQLについて紹介しました。
DBで大きなデータを扱う際には、BLOBデータを扱うことが多いと思いますので、今回の記事を参考にしてください。
コメント