本連載は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 /
(表示の都合で改行している個所があります。コードはlist7_1から参照できます)
それでは、次ページで順を追って解説していきましょう。(次ページへ続く)
Copyright © ITmedia, Inc. All Rights Reserved.