PL/SQLでBLOBデータを自由自在に入出力SQLクリニック(7)(1/3 ページ)

» 2005年08月26日 00時00分 公開
[林優株式会社インサイトテクノロジー]

 本連載はSQLの応用力を身に付けたいエンジニア向けに、さまざまなテクニックを紹介する。SQLの基本構文は平易なものだが、実務で活用するには教科書的な記述を理解するだけでは不十分だ。本連載は、著名なメールマガジン「おら!オラ! Oracle - どっぷり検証生活」を発行するインサイトテクノロジーのコンサルタントを執筆陣に迎え、SQLのセンス向上に役立つ大技小技を紹介していく。(編集局)

 今回は、非常に大きなデータを扱う方法を紹介しましょう。大きなデータを格納する際には、LOB(Large Object)という非構造化データ(バイナリデータや大量のテキストデータ)を使用します。

Oracleに格納できるLOBの種類

 Oracleデータベースに格納できるLOBには、以下の4種類が存在します。

LOBの種類 説明
BFILE データをデータベース内に格納せず、OS上のファイルシステムに記録します
BLOB 音声・画像などのバイナリデータをデータベース内部に格納します
CLOB 大量の文字列データをデータベース内部に格納します(シングルバイト・キャラクタまたはマルチバイト・キャラクタを含む)
NCLOB 大量の文字列データをデータベース内部に格納します(Unicodeキャラクタを含む)
表1 Oracleデータベースに格納できるLOBの種類

 今回は、BLOBについてSQL文でのアクセス方法などを紹介します。BLOBは大量のバイナリデータを格納することができるデータ型です。Pro*CやJavaなどのアプリケーション・プログラムからバイナリデータを読み込んで格納する方法もありますが、ここではPL/SQLで実装する方法を簡単な例で解説します。

BLOBデータを格納するサンプル

サンプルソースのダウンロード

 本記事で解説する例題のサンプルソースを以下からダウンロードできます。アーカイブファイルは3種類の文字コード(SJIS、EUC、UTF-8)を用意してありますので、必要な方を利用してください。

Samples
atmarkit_7_sjis.zip(SJIS用)
atmarkit_7_euc.zip(EUC用)
atmarkit_7_utf-8.zip(UTF-8用)

 内容物は、以下のとおりです。

  • create_ddl.sql
     サンプル用のオブジェクト作成スクリプト
  • atmarkit_7_1.sql
     BLOBデータの格納サンプル
  • atmarkit_7_2.sql
      BLOBデータの出力サンプル

 これらのサンプルコードは、Oracle Database 10.1.0.4で動作を確認しています。

【お知らせ】
記事公開時サンプルコードでは、一部にVARCHAR型が使用されていました。VARCHARデータ型はVARCHAR2データ型と同じ意味で使用されていますが、今後、VARCHARデータ型は、異なる比較セマンティクスで比較される別の可変長文字列のデータ型に変更される予定です。このため、掲載時のサンプルコードのうち、VARCHAR型を使っている部分について、VARCHAR2型に書き換えたうえで、修正版として公開して公開しています(2008/06/11)。

 1 set serveroutput on
 2 declare
 3         v_blob_locater  blob;
 4         v_handle        bfile := bfilename('LOB_DATA_PATH',
                                              'maguro1.jpg');
 5
 6         v_amount        pls_integer;
 7         v_doffset       pls_integer := 1;
 8         v_soffset       pls_integer := 1;
 9
10 begin
11         dbms_lob.fileopen(
12                 v_handle,
13                 dbms_lob.file_readonly
14         );
15
16         v_amount := dbms_lob.getlength(v_handle);
17
18         insert into test_blob_data (
19                 id,
20                 data
21         ) values (
22                 seq_test_blob_data.nextval,
23                 empty_blob()
24         ) returning data into v_blob_locater;
25
26         dbms_lob.loadblobfromfile(
27                 v_blob_locater,
28                 v_handle,
29                 v_amount,
30                 v_doffset,
31                 v_soffset
32         );
33         dbms_output.put_line ( 
                  '書き込まれたサイズ : ' || v_doffset || 'Bytes' 
           );
34         commit;
35         dbms_lob.fileclose(v_handle);
36 end;
37 / 
リスト1 BLOBデータを格納するPL/SQLサンプル
(表示の都合で改行している個所があります。コードはlist7_1から参照できます)

 それでは、次ページで順を追って解説していきましょう。(次ページへ続く)

       1|2|3 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。