本連載はSQLの応用力を身に付けたいエンジニア向けに、さまざまなテクニックを紹介する。SQLの基本構文は平易なものだが、実務で活用するには教科書的な記述を理解するだけでは不十分だ。本連載は、著名なメールマガジン「おら!オラ! Oracle - どっぷり検証生活」を発行するインサイトテクノロジーのコンサルタントを執筆陣に迎え、SQLのセンス向上に役立つ大技小技を紹介していく。(編集局)
今回は、非常に大きなデータを扱う方法を紹介しましょう。大きなデータを格納する際には、LOB(Large Object)という非構造化データ(バイナリデータや大量のテキストデータ)を使用します。
Oracleデータベースに格納できるLOBには、以下の4種類が存在します。
| LOBの種類 | 説明 |
|---|---|
| BFILE | データをデータベース内に格納せず、OS上のファイルシステムに記録します |
| BLOB | 音声・画像などのバイナリデータをデータベース内部に格納します |
| CLOB | 大量の文字列データをデータベース内部に格納します(シングルバイト・キャラクタまたはマルチバイト・キャラクタを含む) |
| NCLOB | 大量の文字列データをデータベース内部に格納します(Unicodeキャラクタを含む) |
| 表1 Oracleデータベースに格納できるLOBの種類 | |
今回は、BLOBについてSQL文でのアクセス方法などを紹介します。BLOBは大量のバイナリデータを格納することができるデータ型です。Pro*CやJavaなどのアプリケーション・プログラムからバイナリデータを読み込んで格納する方法もありますが、ここではPL/SQLで実装する方法を簡単な例で解説します。
本記事で解説する例題のサンプルソースを以下からダウンロードできます。アーカイブファイルは3種類の文字コード(SJIS、EUC、UTF-8)を用意してありますので、必要な方を利用してください。
Samples
▼atmarkit_7_sjis.zip(SJIS用)
▼atmarkit_7_euc.zip(EUC用)
▼atmarkit_7_utf-8.zip(UTF-8用)
内容物は、以下のとおりです。
これらのサンプルコードは、Oracle Database 10.1.0.4で動作を確認しています。
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 /
それでは、次ページで順を追って解説していきましょう。(次ページへ続く)
Copyright © ITmedia, Inc. All Rights Reserved.