Oracle® Database

SecureFilesおよびラージ・オブジェクト開発者ガイド

11gリリース2(11.2)

B56263-04(原本部品番号:E18294-04)

2013年7月

Oracle Database SecureFilesおよびラージ・オブジェクト開発者ガイド, 11gリリース2(11.2)

B56263-04

Copyright © 1996, 2013, Oracle and/or its affiliates.All rights reserved.

原本著者: Roza Leyderman

原本協力者: Bharath Aleti, Geeta Arora, Thomas H.Chang, Maria Chien, Subramanyam Chitti, Amit Ganesh, Kevin Jernigan, Vikram Kapoor, Balaji Krishnan, Jean de Lavarene, Geoff Lee, Scott Lynn, Jack Melnick, Atrayee Mullick, Eric Paapanen, Ravi Rajamani, Kam Shergill, Ed Shirk, Srinivas Vemuri

このソフトウェアおよび関連ドキュメントの使用と開示は、ライセンス契約の制約条件に従うものとし、知的財産に関する法律により保護されています。ライセンス契約で明示的に許諾されている場合もしくは法律によって認められている場合を除き、形式、手段に関係なく、いかなる部分も使用、複写、複製、翻訳、放送、修正、ライセンス供与、送信、配布、発表、実行、公開または表示することはできません。このソフトウェアのリバース・エンジニアリング、逆アセンブル、逆コンパイルは互換性のために法律によって規定されている場合を除き、禁止されています。

ここに記載された情報は予告なしに変更される場合があります。また、誤りが無いことの保証はいたしかねます。誤りを見つけた場合は、オラクル社までご連絡ください。

このソフトウェアまたは関連ドキュメントを、米国政府機関もしくは米国政府機関に代わってこのソフトウェアまたは関連ドキュメントをライセンスされた者に提供する場合は、次の通知が適用されます。

U.S. GOVERNMENT END USERS: Oracle programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, delivered to U.S. Government end users are "commercial computer software" pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations.As such, use, duplication, disclosure, modification, and adaptation of the programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, shall be subject to license terms and license restrictions applicable to the programs.No other rights are granted to the U.S. Government.

このソフトウェアもしくはハードウェアは様々な情報管理アプリケーションでの一般的な使用のために開発されたものです。このソフトウェアもしくはハードウェアは、危険が伴うアプリケーション(人的傷害を発生させる可能性があるアプリケーションを含む)への用途を目的として開発されていません。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用する際、安全に使用するために、適切な安全装置、バックアップ、冗長性(redundancy)、その他の対策を講じることは使用者の責任となります。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用したことに起因して損害が発生しても、オラクル社およびその関連会社は一切の責任を負いかねます。

OracleおよびJavaはOracle Corporationおよびその関連企業の登録商標です。その他の名称は、それぞれの所有者の商標または登録商標です。

Intel、Intel Xeonは、Intel Corporationの商標または登録商標です。すべてのSPARCの商標はライセンスをもとに使用し、SPARC International, Inc.の商標または登録商標です。AMD、Opteron、AMDロゴ、AMD Opteronロゴは、Advanced Micro Devices, Inc.の商標または登録商標です。UNIXは、The Open Groupの登録商標です。

このソフトウェアまたはハードウェア、そしてドキュメントは、第三者のコンテンツ、製品、サービスへのアクセス、あるいはそれらに関する情報を提供することがあります。オラクル社およびその関連会社は、第三者のコンテンツ、製品、サービスに関して一切の責任を負わず、いかなる保証もいたしません。オラクル社およびその関連会社は、第三者のコンテンツ、製品、サービスへのアクセスまたは使用によって損失、費用、あるいは損害が発生しても一切の責任を負いかねます。

目次

例一覧

図一覧

表一覧

タイトルおよび著作権情報

はじめに

- 対象読者

- ドキュメントのアクセシビリティについて

- 関連ドキュメント

- 表記規則

『Oracle Database SecureFilesおよびラージ・オブジェクト開発者ガイド』の新機能

- Oracle Database 11gリリース2で導入されたLOBの新機能

- Oracle Database 11gリリース1で導入されたLOBの新機能

1 ラージ・オブジェクトの概要

- ラージ・オブジェクト

- ラージ・オブジェクトを使用する理由

- 半構造化データに対するLOBの使用

- 非構造化データに対するLOBの使用

- LONGを使用しない理由

- 各種のLOB

- 内部LOB

- 外部LOBとBFILEデータ型

- LOBロケータの概要

- 内部LOBと外部LOBのデータベース・セマンティクス

- ラージ・オブジェクト・データ型

- オブジェクト・データ型とLOB

- LOBを使用した他のデータ型の格納と作成

- LOBとして格納されるVARRAY

- CLOBとして格納されるXMLType列

- Oracle Multimediaで使用されるLOB

第I部 スタート・ガイド

2 LOBの作業

- LOB列のステータス

- LOBを含む行のロック

- LOBのオープンおよびクローズ

- LOBロケータとLOB値

- LOB用データ・インタフェースの使用

- LOBロケータを使用したLOB値へのアクセスと変更

- LOBロケータとBFILEロケータ

- print_media表

- ロケータを含めるためのLOB列の初期化

- 永続LOB列の初期化

- BFILEの初期化

- LOBへのアクセス

- SQLを使用したLOBへのアクセス

- データ・インタフェースを使用したLOBへのアクセス

- ロケータ・インタフェースを使用したLOBへのアクセス

- LOBのルールと制限

- LOB列のルール

- LOB操作の制限

3 LOBの管理: データベース管理

- データをLOBにロードするためのデータベース・ユーティリティ

- SQL*Loaderを使用したLOBのロード

- SQL*Loaderを使用したBFILE列への移入

- Oracle Data Pumpを使用したLOBデータの転送

- 一時LOBの管理

- 一時LOB用の一時表領域の管理

- BFILEの管理

- ディレクトリ・オブジェクトおよびBFILEの使用規則

- オープンできるBFILE数の上限の設定

- LOB表領域の記憶域の変更

第II部 SecureFiles LOB

4 Oracle SecureFiles LOBの使用

- SecureFiles LOBについて

- 圧縮について

- 重複除外について

- 暗号化について

- SecureFiles LOBを含んだCREATE TABLEの使用

- SecureFiles LOB用のCREATE TABLEのパラメータ

- BASICFILE

- SECUREFILE

- CHUNK

- RETENTION

- MAXSIZE

- FREEPOOLS

- LOGGING、NOLOGGINGまたはFILESYSTEM_LIKE_LOGGING

- FREELISTSまたはFREELIST GROUPS

- PCTVERSION

- COMPRESSまたはNOCOMPRESS

- DEDUPLICATEまたはKEEP_DUPLICATES

- ENCRYPTまたはDECRYPT

- CREATE TABLE圧縮

- CREATE TABLE圧縮での使用上の注意

- CREATE TABLE圧縮の例

- CREATE TABLE重複除外

- CREATE TABLE重複除外での使用上の注意

- CREATE TABLE重複除外の例

- CREATE TABLE暗号化

- CREATE TABLE暗号化での使用上の注意

- CREATE TABLE暗号化の例

- SecureFiles LOBを含んだALTER TABLEの使用

- SecureFiles LOB用のCREATE TABLEのパラメータ

- RETENTION

- COMPRESSまたはNOCOMPRESS

- DEDUPLICATEまたはKEEP_DUPLICATES

- ENCRYPTまたはDECRYPT

- ALTER TABLE圧縮

- ALTER TABLE圧縮での使用上の注意

- ALTER TABLE圧縮の例

- ALTER TABLE重複除外

- ALTER TABLE重複除外での使用上の注意

- ALTER TABLE重複除外の例

- ALTER TABLE暗号化

- ALTER TABLE暗号化での使用上の注意

- ALTER TABLE暗号化の例

- データベース・ファイルシステム・リンク

- データベース・ファイルシステム・リンクの概要

- データベース・ファイルシステム・リンクの作成

- データベース・ファイルシステム・リンクのコピー

- 表間でのリンク済LOBのコピー

- オンライン再定義およびDBFSリンク

- 透過的読取り

- SecureFiles LOBの初期化パラメータdb_securefile

- 互換性およびアップグレード

- BasicFiles LOBからSecureFiles LOBへの列の移行

- SecureFiles LOBへの移行時のREDO領域の生成防止

- BasicFiles LOBのためのオンライン再定義

- オンライン再定義のメリット

- オンライン再定義のデメリット

- BasicFiles LOBを含む表の移行時のオンライン再定義の使用

- パラレル・オンライン再定義

- SecureFiles LOBおよびDBFS用のPL/SQLパッケージ

- DBMS_LOBパッケージ

- GETOPTIONS()

- SETOPTIONS()

- ISSECUREFILE()

- MOVE_TO_DBFS_LINK()

- COPY_FROM_DBFS_LINK()

- COPY_DBFS_LINK()

- GET_DBFS_LINK()

- SET_DBFS_LINK()

- GET_DBFS_LINK_STATE()

- DBFS_LINK_GENERATE_PATHNAME()

- SETCONTENTTYPE()

- GETCONTENTTYPE()

- APPEND()

- COMPARE()

- CONVERTTOBLOB()

- CONVERTTOCLOB()

- COPY()

- ERASE()

- FRAGMENT_DELETE()

- FRAGMENT_INSERT()

- FRAGMENT_MOVE()

- FRAGMENT_REPLACE()

- LOADBLOBFROMFILE()

- LOADCLOBFROMFILE()

- LOADFROMFILE()

- READ()

- SUBSTR()

- TRIM()

- WRITE()

- WRITEAPPEND()

- DBMS_SPACEパッケージ

- SPACE_USAGE()

5 Oracle Database File Systemの概要

- データベース・ファイルシステムを使用する理由

- Oracle Database File System(DBFS)の概要

6 DBFSファイルシステム・クライアント

- DBFSのインストール

- DBFSの前提条件

- FUSEのインストール(Linuxのみ)

- DBFSインストール・ホーム

- ファイルシステムの作成

- ファイルシステムの削除

- DBFSマウント・インタフェース

- DBFSストアのマウント

- Linuxでのファイルシステムのアンマウント

- マウントされたファイルシステムの制限事項

- Linuxでのfstabユーティリティを使用したDBFSのマウント

- Solaris 11 SRU7におけるOracle Databaseリリース11.2.0.3

- Solaris 11 SRU7以降でのFUSEのインストール

- DBFSのアンマウント

- DBFSストアのマウント: Solaris固有の権限

- Solaris用のvfstabユーティリティを使用したDBFSのマウント

- DBFSコマンド・インタフェースの使用

- DBFSの使用

- ディレクトリの作成

- ディレクトリのリスト

- ファイルおよびディレクトリのコピー

- ファイルおよびディレクトリの削除

- DBFS管理

- DBFSクライアントでのOracle Walletの使用

- ファイルシステム・セキュリティ・モデル

- 共有ルート・アクセスの有効化

- 複数のRDBMSユーザー間のDBFSアクセスの有効化

- DBFS診断の実行

- DBFSクライアント・フェイルオーバーの管理

- DBFSの共有およびキャッシュ

- DBFSのバックアップ

- データベース・レベルでのDBFSのバックアップ

- ファイルシステム・ユーティリティによるDBFSのバックアップ

- DBFSの小さいファイルのパフォーマンスの向上

- DBFSの高度なSecureFiles LOBの有効化

7 DBFSコンテンツAPI

- DBFSコンテンツAPIの概要

- ストアおよびパッケージDBMS_DBFS_CONTENT

- DBMS_DBFS_CONTENTパッケージの開始

- DBFSコンテンツAPIのロール

- パス名の定数およびタイプ

- コンテンツ・プロパティ

- パス名タイプ

- ストア機能

- ロック・タイプ

- 標準プロパティ

- オプション・プロパティ

- プロパティ・アクセス・フラグ

- 例外

- プロパティ・バンドル

- ストア記述子

- 管理および問合せAPI

- コンテンツ・ストアの登録

- コンテンツ・ストアの登録解除

- 登録されたストアのマウント

- 以前にマウントされたストアのアンマウント

- 使用可能なすべてのストアおよびその機能のリスト

- 使用可能なすべてのマウント・ポイントのリスト

- ルックアップ固有のストアおよびその機能

- DBFSコンテンツAPIの領域使用量

- DBFSコンテンツAPIのセッション・デフォルト

- DBFSコンテンツAPIのインタフェース・バージョニング

- パス名に対するDBFSコンテンツAPIの注意点

- DBFSコンテンツAPIの作成操作

- DBFSコンテンツAPIの削除操作

- DBFSコンテンツAPIパスのgetおよびput操作

- DBFSコンテンツAPIの名前変更および移動操作

- ディレクトリ・リスト

- DBFSコンテンツAPIのディレクトリ・ナビゲーションおよび検索

- DBFSコンテンツAPIのロック操作

- DBFSコンテンツAPIの抽象化操作

- DBFSコンテンツAPIのアクセス・チェック

- DBFSコンテンツAPIのパスの正規化

- DBFSコンテンツAPIの統計サポート

- DBFSコンテンツAPIのトレース・サポート

- リソースおよびプロパティ・ビュー

8 DBFS SecureFilesストア

- DBFS SecureFilesストア・パッケージ(DBMS_DBFS_SFS)

- 新しいSecureFilesストアの作成および登録

- SecureFilesストアの初期化または再初期化

- SecureFilesストア・ファイルシステム・ストアの登録解除および削除

- DBFS SecureFilesストア・ファイルシステムの使用

- 権限の管理

- SecureFilesファイルシステム・ストアの作成

- SecureFiles LOBとBasicFiles LOBの比較

- SecureFilesストア・ファイルシステムの初期化

- SecureFilesストア・ファイルシステムの削除

- DBFSコンテンツAPIの操作

9 DBFS階層ストア

- ウォレット管理

- DBMS_DBFS_HSを使用したストレージの管理

- DBMS_DBFS_HSパッケージの定数

- DBMS_DBFS_HSパッケージのメソッド

- CREATESTORE()

- DROPSTORE()

- RECONFIGCACHE()

- SETSTOREPROPERTY()

- GETSTOREPROPERTY()

- CREATEBUCKET()

- STOREPUSH()

- CLEANUPUNUSEDBACKUPFILES()

- REGISTERSTORECOMMAND()

- DEREGSTORECOMMAND()

- SENDCOMMAND()

- DBFS階層ストアのユーザー・ビュー

- USER_DBFS_HS_FILES

- DBMS_DBFS_HSの使用例

- ストアの設定

- 階層ストアの使用

- ファイルシステムとしての階層ストアの使用

- SecureFiles LOBのアーカイブ・ソリューションとしての階層ストアの使用

- 階層ストアの削除

- 例: Amazon S3の使用

- 例: テープの使用

10 DBFSストアの作成

- パッケージDBMS_DBFS_CONTENT_SPI

第III部 アプリケーション設計

11 LOB記憶域

- LOBを含む表の作成

- 永続LOBをNULLまたは空として初期化

- 永続LOBをNULLに設定

- 永続LOBを空に設定

- LOBの初期化

- 永続LOB列およびLOB属性を値に初期化

- BFILEをNULLまたはファイル名に初期化

- LOBセグメントの最初のエクステントの制限

- LOB列のデータ型の選択

- LOB型とLONG型およびLONG RAW型との比較

- LOBへの可変幅文字データの格納

- LOBでの暗黙的なキャラクタ・セット変換

- LOB記憶域パラメータ

- インラインLOB記憶域とアウトラインLOB記憶域

- 永続LOBに対する表領域および記憶特性の定義

- LOBデータ・セグメント名の割当て

- LOB列またはLOB属性のLOB記憶特性

- TABLESPACEおよびLOB索引

- 非パーティション表のLOB索引に対する表領域

- PCTVERSION

- BasicFiles LOB用のRETENTIONパラメータ

- SecureFiles LOB用のRETENTIONパラメータ

- CACHE/NOCACHE/CACHE READS

- CACHE/NOCACHE/CACHE READS: LOB値とバッファ・キャッシュ

- BasicFiles LOB用のLOGGING/NOLOGGINGパラメータ

- LOBは、常にLOB索引ページに対してUNDOを生成する

- LOGGINGが設定されている場合、LOBデータ・ページの完全なREDOが生成される

- SecureFiles LOB用のLOGGING/FILESYSTEM_LIKE_LOGGING

- CACHEによって決まるLOGGING

- SecureFilesおよび効率的なREDOおよびUNDO生成の方法

- バルク・ロードまたは挿入に効果的なFILESYSTEM_LIKE_LOGGING

- CHUNK

- CHUNKの値の選択

- CHUNKよりも大きいサイズにINITIALおよびNEXTを設定する

- ENABLE句またはDISABLE STORAGE IN ROW句

- ENABLEまたはDISABLE STORAGE IN ROWのガイドライン

- LOB列に対する索引付け

- LOB列でのドメイン索引機能の使用

- テキスト索引を使用したLOB列に対する索引付け

- LOBに対するファンクション索引付け

- LOB列に対する拡張索引作成機能

- 拡張可能オプティマイザ

- Oracle TextによるXMLへの索引付けのサポート

- パーティション表内のLOBの操作

- LOB列を含む表のパーティション化

- パーティション化されたLOB列を含む表に対する索引の作成

- LOBを含むパーティションの移動

- LOBを含むパーティションの分割

- LOBを含むパーティションのマージ

- 索引構成表内のLOB

- パーティション化された索引構成表内のLOBに対する制限

- ネストした表内のLOBの更新

12 高度な設計時の考慮事項

- LOBバッファリング・サブシステム(LBS)

- LOBバッファリングのメリット

- LOBバッファリングの使用上のガイドライン

- LOBバッファリング・サブシステムの使用方法

- LOBバッファの物理構造

- LOBバッファリング・サブシステムの使用例

- LOBバッファのフラッシュ

- 更新済LOBのフラッシュ

- バッファリング対応のロケータ

- 再選択を避けるためのロケータ状態の保存

- OCI: LOBバッファリングの例

- OPENおよびCLOSEインタフェースを使用した永続LOBのオープン

- LOBの明示的なオープンによる索引のパフォーマンス上のメリット

- 明示的にオープンしたLOBインスタンスの操作

- 読取り一貫性のあるロケータ

- 読取り一貫性のあるロケータになる、SELECTされたロケータ

- LOBの更新および読取り一貫性の例

- 更新済ロケータを介したLOB更新の例

- SQL DMLおよびDBMS_LOBを使用したLOBの更新例

- 同じLOB値を更新するために1つのロケータを使用する例

- PL/SQL(DBMS_LOB)バインド変数を使用したLOBの更新の例

- LOBロケータとトランザクション境界

- ロケータを使用したLOBに対する読取りおよび書込み

- トランザクション境界外でのロケータの選択

- トランザクション境界内でのロケータの選択

- 複数のトランザクションにまたがることはできないLOBロケータ

- トランザクションにまたがらないロケータの例

- オブジェクト・キャッシュ内のLOB

- サイズがTBのLOBのサポート

- サイズがTBのLOBの最大記憶域の制限

- JDBCでのサイズがTBのLOBの使用

- DBMS_LOBパッケージでのサイズがTBのLOBの使用

- OCIでのサイズがTBのLOBの使用

- サイズがGBのLOB作成時のガイドライン

- サイズがGBのLOBを格納する表領域および表の作成

13 LOB APIの概要

- LOBをサポートするプログラム環境

- LOBインタフェースの比較

- PL/SQL(DBMS_LOBパッケージ)を使用したLOBの作業

- DBMS_LOBルーチン実行前のLOBロケータの提供

- DBMS_LOB操作のオフセット・パラメータおよび量パラメータのガイドライン

- キャラクタ・セットIDの取得

- LOB用のPL/SQLファンクションおよびプロシージャ

- LOB値を変更するPL/SQLファンクションおよびプロシージャ

- LOBのイントロスペクションに使用するPL/SQLファンクションおよびプロシージャ

- 一時LOBに対するPL/SQL操作

- PL/SQL: BFILE固有の読取り専用ファンクションおよびプロシージャ

- PL/SQL: 内部LOBおよび外部LOBをオープンおよびクローズするファンクションおよびプロシージャ

- OCIを使用したLOBの作業

- LOBデータ、長さおよびチャンク・サイズのプリフェッチ

- OCI LOB APIのCSIDパラメータの設定

- OCIにおける固定幅キャラクタ・セットと可変幅キャラクタ・セットの規則

- 他の操作

- OCIにおけるNCLOBの使用

- OCILobLoadFromFile2()の量パラメータ

- OCILobRead2()の量パラメータ

- OCILobLocatorポインタの割当て

- OCIにおける定義変数とアウトバインド変数内のLOBロケータ

- OCI: BLOB、CLOB、NCLOBおよびBFILEを操作する関数

- OCI: 永続LOB(BLOB、CLOBおよびNCLOB)の値を変更する関数

- OCI: 永続LOBおよび外部LOB(BFILE)の値の読取りまたはテストを行う関数

- OCI: 一時LOBを操作する関数

- OCI: BFILE固有の読取り専用関数

- OCI: LOBロケータ関数

- OCI: LOBバッファリング関数

- OCI: 内部LOBおよび外部LOBをオープンおよびクローズする関数

- OCI LOBの例

- OCIの詳細

- C++(OCCI)を使用したLOBの作業

- OCCIでLOBに使用するクラス

- Clobクラス

- Blobクラス

- Bfileクラス

- 固定幅キャラクタ・セットの規則

- 可変幅キャラクタ・セットの規則

- 他のOCCI操作のためのオフセット・パラメータおよび量パラメータ

- OCCIにおけるNCLOBの使用

- OCCI LOB copy()メソッドの量パラメータ

- OCCI read()操作の量パラメータ

- OCCIの詳細

- OCCI: BLOB、CLOB、NCLOBおよびBFILEを操作するメソッド

- OCCI: 永続LOB(BLOB、CLOBおよびNCLOB)の値を変更するメソッド

- OCCI: 永続LOBおよびBFILEの値の読取りまたはテストを行うメソッド

- OCCI: BFILE固有の読取り専用メソッド

- OCCI: 他のLOBメソッド

- OCCI: 内部LOBおよび外部LOBをオープンおよびクローズするメソッド

- C/C++(Pro*C)を使用したLOBの作業

- LOBを表す入力ロケータ・ポインタの割当て

- Pro*C/C++: BLOB、CLOB、NCLOBおよびBFILEを操作する文

- Pro*C/C++: 永続LOBの値を変更する埋込みSQL文

- Pro*C/C++: LOBのイントロスペクションに使用する埋込みSQL文

- Pro*C/C++: 一時LOBを操作する埋込みSQL文

- Pro*C/C++: BFILE固有の埋込みSQL文

- Pro*C/C++: LOBロケータ埋込みSQL文

- Pro*C/C++: LOBバッファリングのための埋込みSQL文

- Pro*C/C++: LOBをオープンおよびクローズするための埋込みSQL文

- COBOL(Pro*COBOL)を使用したLOBの作業

- LOBを表す入力ロケータ・ポインタの割当て

- Pro*COBOL: BLOB、CLOB、NCLOBおよびBFILEを操作する文

- Pro*COBOL: 永続LOBの値を変更する埋込みSQL文

- Pro*COBOL: LOBのイントロスペクションに使用する埋込みSQL文

- Pro*COBOL: 一時LOBを操作する埋込みSQL文

- Pro*COBOL: BFILE固有の埋込みSQL文

- Pro*COBOL: LOBロケータ埋込みSQL文

- Pro*COBOL: LOBバッファリングのための埋込みSQL文

- Pro*COBOL: LOBおよびBFILEをオープンおよびクローズするための埋込みSQL文

- COM(Oracle Objects for OLE)を使用したLOBの作業

- OO4O構文の参照

- OraBlob、OraClobおよびOraBfileオブジェクト・インタフェースによるロケータのカプセル化

- ダイナセットの一部として取り出されたOraBlobおよびOraClobオブジェクト

- ダイナセット移動からロケータの独立を維持するためのCloneメソッドの使用

- OraBlobおよびOraBfileの例

- OO4O: LOBに格納されたデータにアクセスするメソッドおよびプロパティ

- OO4O: BLOB、CLOBおよびNCLOBの値を変更するメソッド

- OO4O: 内部LOBおよび外部LOBの値の読取りまたはテストを行うメソッド

- OO4O: 外部LOB(BFILE)をオープンおよびクローズするメソッド

- OO4O: 永続LOBバッファリング・メソッド

- OO4O: LOBプロパティ

- OO4O: 外部LOB(BFILE)固有の読取り専用メソッド

- OO4O: 外部LOB(BFILE)での操作のためのプロパティ

- Java(JDBC)を使用したLOBの作業

- Javaを使用した内部永続LOBの変更

- Javaを使用した内部永続LOBおよび外部LOB(BFILE)の読取り

- BLOB、CLOBおよびBFILEクラス

- Java(JDBC)からのDBMS_LOBパッケージのコール

- パフォーマンス改善のためのLOBプリフェッチ

- パフォーマンス改善のためのSecureFilesに対するゼロコピー入力/出力

- サーバー上のゼロコピー入力/出力

- JDBC Thinドライバでのサーバー上のゼロコピー入力/出力

- JDBC-OCIドライバの考慮事項

- Java(JDBC)を使用したLOBの参照

- OracleResultSetの使用: 取り出されたBLOBとCLOBオブジェクト

- JDBC構文の参照および詳細

- LOBでの操作のためのJDBCメソッド

- JDBC: BLOB値を変更するoracle.sql.BLOBメソッド

- JDBC: BLOB値の読取りまたはテストを行うoracle.sql.BLOBメソッド

- JDBC: BLOBバッファリングのためのoracle.sql.BLOBメソッドおよびプロパティ

- JDBC: CLOB値を変更するoracle.sql.CLOBメソッド

- JDBC: CLOB値の読取りまたはテストを行うoracle.sql.CLOBメソッド

- JDBC: CLOBバッファリングのためのoracle.sql.CLOBメソッドおよびプロパティ

- JDBC: 外部LOB(BFILE)値の読取りまたはテストを行うoracle.sql.BFILEメソッド

- JDBC: BFILEバッファリングのためのoracle.sql.BFILEメソッドおよびプロパティ

- JDBC: 一時LOB API

- JDBC: LOBのオープンおよびクローズ

- JDBC: BLOBのオープンおよびクローズ

- JDBCを使用したBLOBのオープン

- JDBCを使用した、BLOBがオープンしているかどうかの確認

- JDBCを使用したBLOBのクローズ

- JDBC: CLOBのオープンおよびクローズ

- JDBCを使用したCLOBのオープン

- JDBCを使用した、CLOBがオープンしているかどうかの確認

- JDBCを使用したCLOBのクローズ

- JDBC: BFILEのオープンおよびクローズ

- BFILEのオープン

- BFILEがオープンしているかどうかの確認

- BFILEのクローズ

- 使用例(OpenCloseLob.java)

- JDBCを使用したLOBの切捨て

- JDBC: BLOBの切捨て

- JDBC: CLOBの切捨て

- JDBC BLOBストリーミングAPI

- JDBC CLOBストリーミングAPI

- BFILEストリーミングAPI

- JDBC BFILEストリーミングの例(NewStreamLob.java)

- JDBCおよび空のLOB

- Oracle Provider for OLE DB(OraOLEDB)

- Oracle Data Provider for .NET(ODP.NET)の概要

14 パフォーマンスのガイドライン

- LOBパフォーマンスのガイドライン

- チャンク・サイズ

- サイズの小さいBasicFiles LOBのパフォーマンスに関するガイドライン

- BasicFiles LOBの一般的なパフォーマンスに関するガイドライン

- 一時LOBパフォーマンスのガイドライン

- SQLセマンティクスとLOBのパフォーマンスに関する考慮事項

- スレッド環境におけるLOBへのデータの移動

- LOBアクセス統計

- LOBアクセス統計の取得

第IV部 LOBへのSQLアクセス

15 LOBに対するDDL文とDML文

- 1つ以上のLOB列を含む表の作成

- LOBを含むネストした表の作成

- 別の表からのLOBの選択による行の挿入

- 表へのLOB値の挿入

- 初期化したLOBロケータ・バインド変数を使用した行の挿入

- PL/SQL: 初期化したLOBロケータ・バインド変数を使用した行の挿入

- C(OCI): 初期化したLOBロケータ・バインド変数を使用した行の挿入

- COBOL(Pro*COBOL): 初期化したLOBロケータ・バインド変数を使用した行の挿入

- C/C++(Pro*C/C++): 初期化したLOBロケータ・バインド変数を使用した行の挿入

- COM(OO4O): 初期化したLOBロケータ・バインド変数を使用した行の挿入

- Java(JDBC): 初期化したLOBロケータ・バインド変数を使用した行の挿入

- EMPTY_CLOB()またはEMPTY_BLOB()を使用したLOBの更新

- 別の表からのLOBの選択による行の更新

16 SQLセマンティクスとLOB

- SQLでのLOBの使用

- LOBでの使用がサポートされるSQLファンクションおよび演算子

- Unicodeサポート

- コードポイント・セマンティクス

- LOBのSQLセマンティクスの戻り値

- LOBに対するLENGTHの戻り値

- SQLでのLOBデータ型の暗黙的な変換

- SQLでのCLOBデータ型とNCLOBデータ型の間の暗黙的な変換

- SQLでサポートされないLOBの使用

- LOBのVARCHAR2およびRAWセマンティクス

- SQLファンクションから戻されるLOB

- VARCHAR2とCLOBでのIS NULLとIS NOT NULLの使用方法

- LOBでのWHERE句の使用方法

- リモートLOBおよびBFILE用の組込みファンクション

17 LOBに対するPL/SQLセマンティクス

- PL/SQL文およびPL/SQL変数

- CLOBとVARCHAR2の間の暗黙的な変換

- 明示的な変換ファンクション

- PL/SQL組込みファンクションでのVARCHAR2およびCLOB

- PL/SQL CLOBの比較規則

- VARCHAR2の照合順番に従うCLOB

- リモートLOBおよびBFILE用のPL/SQLファンクション

- リモートのユーザー定義型ファンクションの制限

- PL/SQL、OCIおよびJDBC内のリモート・ファンクション

18 LONGからLOBへの列の移行

- LONG列からLOB列に移行するメリット

- LONG列からLOB列に移行するための事前条件

- LOBへの変換前のLONG列のドメイン索引削除

- LOBデータ型に変換する表のREDO領域の生成防止

- utldtree.sqlを使用したアプリケーションの変更部分の判断

- LONGデータ型からLOBデータ型への表の変換

- ALTER TABLEを使用したLONG列からLOB列への変換

- 移行時の問題

- TO_LOB演算子を使用したLONGからLOB列へのコピー

- LONG列を含む表のオンライン再定義

- Oracle Data Pumpを使用したデータベースの移行

- LONGからLOBへのアプリケーションの移行

- クラスタ化表で使用できないLOB列

- AFTER UPDATE OFトリガーに使用できないLOB列

- LONGデータ型からLOBデータ型に変換された列の索引

- 空のLOBとNULLまたは長さが0(ゼロ)のLONGの違い

- アンカー型でのオーバーロード

- LOBデータ型に対してサポートされない一部の暗黙的変換

第V部 LOB APIの使用

19 永続LOBに固有の操作と一時LOBに固有の操作

- 永続LOBの操作

- 表へのLOBの挿入

- 表からのLOBの選択

- 一時LOBの操作

- 一時LOBの作成と解放

- PL/SQLにおける永続LOBと一時LOBの作成

- OCIでの一時LOBの解放

20 永続LOB用のデータ・インタフェース

- 永続LOB用のデータ・インタフェースの概要

- 永続LOB用のデータ・インタフェースを使用するメリット

- PL/SQLにおける永続LOB用のデータ・インタフェースの使用

- SQLとPL/SQLでデータ・インタフェースを使用してLOB列にアクセスする際のガイドライン

- 暗黙的な割当ておよびパラメータの受渡し

- SQLおよびPL/SQL組込みファンクションへのCLOBの受渡し

- 明示的な変換ファンクション

- SQLからのPL/SQLプロシージャおよびCプロシージャのコール

- PL/SQLからのPL/SQLプロシージャおよびCプロシージャのコール

- INSERT操作とUPDATE操作でのすべてのサイズのバインド

- SQL演算子の結果に対する4000バイトの制限

- SQL演算子の結果に対する4000バイトの制限の例

- 4000バイトを超えるバインドに対する制限

- LOBに対するパラレルDMLのサポート

- 例: PL/SQL: INSERTおよびUPDATEでの4000バイトを超えるバインドの使用

- LOB用のデータ・インタフェースを使用したINSERT、UPDATEおよびSELECT操作

- LOB用のデータ・インタフェースを使用した割当てとパラメータの受渡し

- LOB用のデータ・インタフェースを使用したPL/SQL組込みファンクション

- OCIにおける永続LOB用のデータ・インタフェースの使用

- OCIでのLOBデータ型のバインド

- OCIでのLOBデータ型の定義

- LOB用データ・インタフェースでのOCIのマルチバイト・キャラクタ・セットの併用

- OCI関数を使用したLOB列のINSERTまたはUPDATEの実行

- 1つのピースでの標準のINSERTまたはUPDATE

- ポーリングによるピース単位のINSERTおよびUPDATE

- コールバックによるピース単位のINSERTおよびUPDATE

- 配列のINSERT操作およびUPDATE操作

- データ・インタフェースを使用したOCIでのLOBデータのフェッチ

- 1つのピースでの標準のフェッチ

- ポーリングによるピース単位のフェッチ

- コールバックによるピース単位のフェッチ

- 配列のフェッチ

- OCIからのPL/SQLバインドおよびCバインド

- begin foo(:1); end;形式でのPL/SQLアウトバインドのコール

- call foo(:1);形式でのPL/SQLアウトバインドのコール

- 例: C(OCI): INSERTおよびUPDATEでの4000バイトを超えるバインド

- LOB用データ・インタフェースを使用したLOBに対するOCIからのPL/SQLバインド

- begin foo(:1); end;形式でのPL/SQLアウトバインドのコール

- call foo(:1);形式でのPL/SQLアウトバインドのコール

- 4000バイトを超えるバインドでのLOB列に対するLONGデータのバインド

- ポーリングによるピース単位INSERTを使用したLOB列へのLONGデータのバインド

- コールバックによるピース単位INSERTを使用したLOB列へのLONGデータのバインド

- 配列のINSERTを使用したLOB列へのLONGデータのバインド

- 単純フェッチを使用したLONGバッファへのLOB列の選択

- ポーリングによるピース単位フェッチを使用したLONGバッファへのLOB列の選択

- コールバックによるピース単位フェッチを使用したLONGバッファへのLOB列の選択

- 配列フェッチを使用したLONGバッファへのLOB列の選択

- Javaにおける永続LOB用のデータ・インタフェースの使用

- リモートLOB用データ・インタフェースの使用

- サポートされない構文

- PL/SQLにおけるリモート・データ・インタフェースの例

- OCIにおけるリモート・データ・インタフェースの例

- JDBCにおけるリモート・データ・インタフェースの例

21 BFILE操作用のLOB API

- BFILE APIについてサポートされている環境

- BFILEへのアクセス

- ディレクトリ・オブジェクト

- BFILEロケータの初期化

- BFILEへのOSファイルの対応付け

- BFILENAMEと初期化

- BFILEデータ型の特性

- ディレクトリ名の指定

- Windowsプラットフォーム上の場合

- BFILEセキュリティ

- 所有権および権限

- ディレクトリ・オブジェクトに対する読取り権限

- BFILEセキュリティ用のSQL DDL

- BFILEセキュリティ用のSQL DML

- ディレクトリのカタログ・ビュー

- ディレクトリ・オブジェクト使用のガイドライン

- 共有サーバー(マルチスレッド・サーバー)・モードのBFILE

- 外部LOB(BFILE)ロケータ

- BFILE表内の2つの行が同じファイルを参照するとき

- BFILEロケータ変数

- BFILEの固有のガイドライン

- LOBへのBFILEデータのロード

- OPENを使用したBFILEのオープン

- FILEOPENを使用したBFILEのオープン

- ISOPENを使用した、BFILEがオープンしているかどうかの確認

- FILEISOPENを使用した、BFILEがオープンしているかどうかの確認

- BFILEデータの表示

- BFILEからのデータの読取り

- SUBSTRを使用した、BFILEデータの一部の読取り

- 2つのBFILEの全体または一部の比較

- INSTRを使用した、BFILEにパターンが存在するかどうかの確認

- BFILEが存在するかどうかの確認

- BFILEの長さの取得

- BFILEロケータの割当て

- BFILEのディレクトリ・オブジェクト名とファイル名の取得

- 初期化したBFILEロケータを使用したBFILEの更新

- FILECLOSEを使用したBFILEのクローズ

- CLOSEを使用したBFILEのクローズ

- FILECLOSEALLを使用したオープン中のすべてのBFILEのクローズ

- BFILEを含む行の挿入

22 LOB APIの使用

- サポートされている環境

- 他のLOBへのLOBの追加

- キャラクタ・セット・フォームの取得

- キャラクタ・セットIDの取得

- LOBへのBFILEデータのロード

- BLOBへのBFILEデータのロード

- CLOBまたはNCLOBへのBFILEデータのロード

- PL/SQL: BFILEからLOBへの文字データのロード

- PL/SQL: 異なるLOBへの文字データ・セグメントのロード

- LOBがオープンしているかどうかの確認

- Java(JDBC): LOBがオープンしているかどうかの確認

- CLOBがオープンしているかどうかの確認

- BLOBがオープンしているかどうかの確認

- LOBデータの表示

- LOBからのデータの読取り

- LOB配列読取り

- LOBの一部の読取り(SUBSTR)

- 2つのLOBの全体または一部の比較

- パターン: INSTRを使用したLOB内のパターンの有無の確認

- 長さ: LOBの長さの取得

- 他のLOBへのLOBの全体または一部のコピー

- LOBロケータのコピー

- 等値: 2つのLOBロケータが等しいかどうかの確認

- LOBロケータが初期化されているかどうかの確認

- LOBへの追加

- LOBへのデータの書込み

- LOB配列書込み

- LOBデータの切捨て

- LOBの一部の消去

- LOBバッファリングの使用可能化

- バッファのフラッシュ

- LOBバッファリングの使用禁止化

- LOBインスタンスが一時LOBであるかどうかの確認

- Java(JDBC): BLOBが一時LOBであるかどうかの確認

- BLOBからCLOBへの変換

- CLOBからBLOBへの変換

- 読取り一貫性の保証

A LOBデモ・ファイル

- PL/SQLのLOBデモ・ファイル

- OCIのLOBデモ・ファイル

- COM OO4O LOBデモ・ファイル

- JavaのLOBデモ・ファイル

用語集

索引

例一覧

- 4-1 CREATE TABLE用のBNF

- 4-2 LOW圧縮を使用したSecureFiles LOB列の作成

- 4-3 MEDIUM(デフォルト)圧縮を使用したSecureFiles LOB列の作成

- 4-4 HIGH圧縮を使用したSecureFiles LOB列の作成

- 4-5 無効化された圧縮を使用したSecureFiles LOB列の作成

- 4-6 1つのパーティションで圧縮を使用したSecureFiles LOB列の作成

- 4-7 重複除外を使用したSecureFiles LOB列の作成

- 4-8 無効化された重複除外を使用したSecureFiles LOB列の作成

- 4-9 1つのパーティションで重複除外を使用したSecureFiles LOB列の作成

- 4-10 1つのパーティションで無効化された重複除外を使用したSecureFiles LOB列の作成

- 4-11 特定の暗号化アルゴリズムを使用したSecureFiles LOB列の作成

- 4-12 すべてのパーティションで暗号化を使用したSecureFiles LOB列の作成

- 4-13 パスワード・キーに基づいた暗号化を使用したSecureFiles LOB列の作成

- 4-14 無効化された暗号化を使用したSecureFiles LOB列の作成

- 4-15 ALTER TABLE用のBNF

- 4-16 SecureFiles LOB列の変更によるLOW圧縮の有効化

- 4-17 SecureFiles LOB列の変更による圧縮の無効化

- 4-18 SecureFiles LOB列の変更によるHIGH圧縮の有効化

- 4-19 SecureFiles LOB列の変更による1つのパーティションでの圧縮の有効化

- 4-20 SecureFiles LOB列の変更による重複除外の無効化

- 4-21 SecureFiles LOB列の変更による重複除外の有効化

- 4-22 SecureFiles LOB列の変更による1つのパーティションでの重複除外の有効化

- 4-23 特定のアルゴリズムに基づいた暗号化によるSecureFiles LOB列の変更

- 4-24 パスワード・キーに基づいた暗号化によるSecureFiles LOB列の変更

- 4-25 暗号化に再度キーを付けることによるSecureFiles LOB列の変更

- 4-26 ALTER SYSTEMによるdb_securefileパラメータの設定

- 4-27 オンライン再定義の例

- 6-1 ファイルシステムのマウント

- 6-2 コマンド・プロンプトでパスワードを使用したファイルシステムのマウント

- 6-3 ファイルから読み込まれたパスワードを使用したファイルシステムのマウント

- 6-4 他のユーザーのルート・アクセスの有効化

- 6-5 DBFSクライアント・フェイルオーバー・イベントの有効化

- 6-6 フェイルオーバー・イベント中のデータ損失の防止

- 6-7 DBFSの高度なSecure Files LOBの有効化

- 7-1 DBFSコンテンツのトレース

- 8-1 DBFSコンテンツAPIの操作

図一覧

- 4-1 データベース・ファイルシステム・リンク

- 5-1 Oracle Database File System(DBFS)

表一覧

- 1-1 ラージ・オブジェクト・データ型

- 4-1 CREATE TABLE文のパラメータ

- 4-2 ALTER TABLE文のパラメータ

- 4-3 一部のDBMS_LOB定数

- 4-4 DBMS_LOBメソッド

- 9-1 DBMS_DBFS_HS Pl/SQLパッケージのメソッド

- 11-1 LOBとLONG RAW

- 11-2 推奨されるPCTVERSION設定

- 11-3 CACHE、NOCACHEおよびCACHE READSの使用時期

- 11-4 データ・サイズとCHUNKサイズ

- 13-1 LOBをサポートするプログラム環境

- 13-2 LOBインタフェースの比較(1/2)

- 13-3 LOBインタフェースの比較(2/2)

- 13-4 PL/SQL: LOB値を変更するDBMS_LOBプロシージャ

- 13-5 PL/SQL: 内部LOBおよび外部LOBの値の読取りまたはテストを行うDBMS_LOBプロシージャ

- 13-6 PL/SQL: 一時LOBを操作するDBMS_LOBプロシージャ

- 13-7 PL/SQL: BFILE固有のDBMS_LOB読取り専用プロシージャ

- 13-8 PL/SQL: 内部LOBおよび外部LOBをオープンおよびクローズするDBMS_LOBプロシージャ

- 13-9 OCI: 永続LOB(BLOB、CLOBおよびNCLOB)の値を変更する関数

- 13-10 OCI: 永続LOBおよび外部LOB(BFILE)の値の読取りまたはテストを行う関数

- 13-11 OCI: 一時LOBを操作する関数

- 13-12 OCI: BFILE固有の読取り専用関数

- 13-13 OCI: LOBロケータ関数

- 13-14 OCI: LOBバッファリング関数

- 13-15 OCI: 内部LOBおよび外部LOBをオープンおよびクローズする関数

- 13-16 OCCI: 永続LOB(BLOB、CLOBおよびNCLOB)の値を変更するClobメソッドおよびBlobメソッド

- 13-17 OCCI: 永続LOBおよびBFILEの値の読取りまたはテストを行うBlob、ClobおよびBfileのメソッド

- 13-18 OCCI: BFILE固有の読取り専用メソッド

- 13-19 他のOCCI LOBメソッド

- 13-20 OCCI: 内部LOBおよび外部LOBをオープンおよびクローズするメソッド

- 13-21 Pro*C/C++: 永続LOBの値を変更する埋込みSQL文

- 13-22 Pro*C/C++: LOBのイントロスペクションに使用する埋込みSQL文

- 13-23 Pro*C/C++: 一時LOBを操作する埋込みSQL文

- 13-24 Pro*C/C++: BFILE固有の埋込みSQL文

- 13-25 Pro*C/C++: LOBロケータ埋込みSQL文

- 13-26 Pro*C/C++: LOBバッファリングのための埋込みSQL文

- 13-27 Pro*C/C++: 永続LOBおよび外部LOB(BFILE)をオープンおよびクローズするための埋込みSQL文

- 13-28 Pro*COBOL: LOBの値を変更する埋込みSQL文

- 13-29 Pro*COBOL: LOBのイントロスペクションに使用する埋込みSQL文

- 13-30 Pro*COBOL: 一時LOBを操作する埋込みSQL文

- 13-31 Pro*COBOL: BFILE固有の埋込みSQL文

- 13-32 Pro*COBOL: LOBロケータ埋込みSQL文

- 13-33 Pro*COBOL: LOBバッファリングのための埋込みSQL文

- 13-34 Pro*COBOL: 永続LOBおよびBFILEをオープンおよびクローズするための埋込みSQL文

- 13-35 OO4O: BLOB、CLOBおよびNCLOBの値を変更するメソッド

- 13-36 OO4O: 内部LOBおよび外部LOBの値の読取りまたはテストを行うメソッド

- 13-37 OO4O: 外部LOB(BFILE)をオープンおよびクローズするメソッド

- 13-38 OO4O: 永続LOBバッファリング・メソッド

- 13-39 OO4O: LOBプロパティ

- 13-40 OO4O: 外部LOB(BFILE)固有の読取り専用メソッド

- 13-41 OO4O: 外部LOB(BFILE)での操作のためのプロパティ

- 13-42 BLOBメソッドの対応関係

- 13-43 CLOBメソッドの対応関係

- 13-44 JDBC: BLOB値を変更するoracle.sql.BLOBメソッド

- 13-45 JDBC: BLOB値の読取りまたはテストを行うoracle.sql.BLOBメソッド

- 13-46 JDBC: BLOBバッファリングのためのoracle.sql.BLOBメソッドおよびプロパティ

- 13-47 JDBC: CLOB値を変更するoracle.sql.CLOBメソッド

- 13-48 JDBC: CLOB値の読取りまたはテストを行うoracle.sql.CLOBメソッド

- 13-49 JDBC: CLOBバッファリングのためのoracle.sql.CLOBメソッドおよびプロパティ

- 13-50 JDBC: 外部LOB(BFILE)値の読取りまたはテストを行うoracle.sql.BFILEメソッド

- 13-51 JDBC: BFILEバッファリングのためのoracle.sql.BFILEメソッドおよびプロパティ

- 13-52 JDBC: JDBC: 一時BLOB API

- 13-53 JDBC: JDBC: 一時CLOB API

- 13-54 JDBC: JDBC: BLOBのオープンおよびクローズ

- 13-55 JDBC: CLOBのオープンおよびクローズ

- 13-56 BFILEをオープンおよびクローズするためのJDBC拡張API

- 13-57 JDBC: BLOBの切捨て

- 13-58 JDBC: CLOBの切捨て

- 13-59 JDBC: BLOBストリーミングAPI

- 13-60 JDBC: CLOBストリーミングAPI

- 13-61 JDBC: BFILEストリーミングAPI

- 16-1 SQL LOBでのSQL VARCHAR2ファンクションおよび演算子

- 16-2 SQLでサポートされないLOBの使用

- 20-1 SQLとPL/SQLでの対応するLONGデータ型とLOBデータ型

- 20-2 OCIでの対応するLONGデータ型とLOBデータ型

- 21-1 BFILE APIについてサポートされている環境

- 22-1 LOB APIについてサポートされている環境

- 22-2 ファイルからのロード操作用の最大LOBサイズ

- 22-3 量パラメータの最大LOBサイズ

- A-1 PL/SQLデモの例

- A-2 OCIデモの例

- A-3 COM OO4Oデモの例

- A-4 Javaデモの例

はじめに

このマニュアルでは、SecureFilesおよびラージ・オブジェクト(LOB)データ型を使用するアプリケーション開発をサポートするデータベース機能について説明します。このマニュアルの情報は、すべてのプラットフォームに適用されるもので、システム固有の情報は含まれません。

対象読者

『Oracle Database SecureFilesおよびラージ・オブジェクト開発者ガイド』では、LOBを使用する新しいアプリケーションを開発するプログラマの他、すでにこのテクノロジを実装し、新機能を活用しようとしているプログラマを対象としています。

マルチメディア・データや構造化されていないデータを効率的かつ安全に格納することの重要性が高まりつつあることを受け、このマニュアルは、Oracleアプリケーション開発者用のドキュメント・セットの中で重要なリソースになっています。

機能範囲および可用性

『Oracle Database SecureFilesおよびラージ・オブジェクト開発者ガイド』では、Oracle Database 11gリリース2(11.2)のSecureFiles LOBおよびBasicFiles LOBの特長および機能について説明します。

LOB使用の前提条件

Oracle Databaseには、アプリケーションでLOBを使用するために必要なリソースがすべて組み込まれています。ただし「LOBのルールと制限」および「パーティション化された索引構成表のLOBに対する制限」で説明するように、LOBの使用方法には制限があります。

ドキュメントのアクセシビリティについて

Oracleのアクセシビリティについての詳細情報は、Oracle Accessibility ProgramのWeb サイト(http://www.oracle.com/pls/topic/lookup?ctx=acc&id=docacc)を参照してください。

Oracle Supportへのアクセス

Oracleサポート・サービスでは、My Oracle Supportを通して電子支援サービスを提供しています。詳細情報は(http://www.oracle.com/pls/topic/lookup?ctx=acc&id=info) か、聴覚に障害のあるお客様は (http://www.oracle.com/pls/topic/lookup?ctx=acc&id=trs)を参照してください。

関連ドキュメント

詳細は、次のOracleドキュメントを参照してください。

- 『Oracle Database 2日で開発者ガイド』は、アプリケーション開発者のOracle Databaseライブラリへのエントリ・ポイントです。Oracle Databaseでの開発の背後にある一般概念を説明し、SQLおよびPL/SQLの基本機能を紹介して、Oracle Databaseライブラリにある詳細な情報への参照を提供します。

- 『Oracle Databaseアドバンスト・アプリケーション開発者ガイド』では、経験豊富なアプリケーション開発者が繰り返し参照する項目について説明します。

- 『Oracle Database PL/SQL言語リファレンス』では、PL/SQL、SQLのOracle手続き型拡張機能、第4世代の高度なプログラム言語について説明します。PL/SQLの概念や言語のすべての面について説明します。

- 『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』では、Oracle Databaseで提供されるPL/SQパッケージおよび定義済タイプの詳細について説明します。パッケージは、構文、プロシージャ/ファンクション、およびパラメータでアルファベット順に表示され、パッケージごとに記載されます。

- 『Oracle Call Interfaceプログラマーズ・ガイド』では、Oracle Call Interface(OCI)について説明します。OCIを使用すると、OracleサーバーにアクセスするCまたはC++の3GLアプリケーションを作成できます。

- 『Oracle C++ Call Interfaceプログラマーズ・ガイド』

- 『Pro*C/C++プログラマーズ・ガイド』: オラクル社は、プリコンパイラのPro*シリーズも提供しています。このプリコンパイラを使用することで、アプリケーション・プログラムにSQLおよびPL/SQLを組み込むことができます。

- 『Pro*COBOLプログラマーズ・ガイド』: Pro*COBOLプリコンパイラを使用することで、OracleサーバーにアクセスするためのCOBOLプログラムにSQLおよびPL/SQLを組み込むことができます。

- Oracleプリコンパイラのプログラマーズ・ガイドおよびOracleプリコンパイラ・ガイドのPro*Fortran補足: Oracle ServerへアクセスするFortranプリコンパイラのプログラミングには、これらのドキュメントを使用してください。

- Java: Oracle Databaseでは、Javaでデータベースを操作できるようになっています。Oracle Javaマニュアル・セットには、次のマニュアルが含まれています。

- 『Oracle Database JDBC開発者ガイドおよびリファレンス』

- 『Oracle Database Java開発者ガイド』

- 『Oracle Database JPublisherユーザーズ・ガイド』

Oracle Databaseエラー・メッセージ・マニュアルは、HTMLでのみ利用可能です。Oracle Database JP Documentation Libraryにのみアクセスできる場合は、範囲を特定してエラー・メッセージを参照できます。特定の範囲を検出した後、ブラウザを使用してメッセージを検索してください。インターネットに接続している場合は、Oracleオンライン・マニュアルのエラー・メッセージ検索機能を使用して、特定のエラー・メッセージを検索できます。

このマニュアルの例の多くで、Oracle Databaseのインストール時に基本インストール・オプションを選択するとデフォルトでインストールされるサンプル・スキーマを使用しています。これらのスキーマがどのように作成されたか、およびその使用方法の詳細は、『Oracle Databaseサンプル・スキーマ』を参照してください。

Oracle Multimedia

Oracleのマルチメディア・テクノロジ用開発環境には、次の方法でアクセスできます。

- データベースと統合する自己完結型アプリケーションを作成するには、Oracleの拡張フレームワークの使用方法について、『Oracle Databaseデータ・カートリッジ開発者ガイド』を参照してください。

- Oracle Multimediaアプリケーションを使用するには、次のマニュアルを参照してください。

- 『Oracle Multimediaリファレンス』

- 『Oracle Multimediaユーザーズ・ガイド』

基本的な参照

- SQL情報は、『Oracle Database SQL言語リファレンス』および『Oracle Database管理者ガイド』を参照してください。

- Oracle XML DBでLOBを使用する方法については、『Oracle XML DB開発者ガイド』を参照してください。

- LOBデータに対するOracle XML SQLについては、『Oracle Databaseアドバンスト・レプリケーション』を参照してください。

- Oracleの基本概念については、『Oracle Database概要』を参照してください。

- Oracle Data Pump、SQL*Loaderおよびその他のデータベース・ユーティリティの使用方法については、『Oracle Databaseユーティリティ』を参照してください。

リリース・ノート、インストール関連ドキュメント、ホワイト・ペーパーまたはその他の関連ドキュメントは、OTN-J (Oracle Technology Network Japan)から、無償でダウンロードできます。OTN-Jを使用するには、オンラインでの登録が必要です。登録は、次のWebサイトから無償で行えます。

http://www.oracle.com/technetwork/index.html

OTNのユーザー名とパスワードをすでに持っている場合は、次のOTN Webサイトのドキュメント・セクションに直接移動できます。

http://www.oracle.com/technetwork/documentation/index.html

表記規則

このマニュアルでは次の表記規則を使用します。

規則

意味

太字

太字は、操作に関連するGraphical User Interface要素、または本文中で定義されている用語および用語集に記載されている用語を示します。

イタリック体

イタリックは、ユーザーが特定の値を指定するプレースホルダ変数を示します。

固定幅フォント

固定幅フォントは、段落内のコマンド、URL、サンプル内のコード、画面に表示されるテキスト、または入力するテキストを示します。

『Oracle Database SecureFilesおよびラージ・オブジェクト開発者ガイド』の新機能

ここでは、次のリリースで導入されたLOBの新機能について説明します。

- Oracle Database 11gリリース2で導入されたLOBの新機能

- Oracle Database 11gリリース1で導入されたLOBの新機能

Oracle Database 11gリリース2で導入されたLOBの新機能

- DBFSクライアントはWindowsプラットフォームをサポートしています。「DBFSの前提条件」を参照してください。

- CREATE TABLEおよびALTER TABLEで、SecureFiles圧縮のためのLOWオプションが使用できるようになりました。「CREATE TABLE圧縮」および「ALTER TABLE圧縮」を参照してください。

- LOBプリフェッチおよびゼロコピー入力/出力をJDBCでサポートしています。これら両方により、サーバーへのラウンドトリップを減らすことでパフォーマンスが改善されています。「パフォーマンス改善のためのLOBプリフェッチ」を参照してください。

- Oracle Database File Systemにより、データベース表に格納されるファイルおよびディレクトリに、標準ファイルシステム・インタフェースが作成されます。第5章「Oracle Database File Systemの概要」から第10章「DBFSストアの作成」を参照してください。

- データベース・ファイルシステム・リンクおよび階層ストレージ管理により、RMANで管理されるようなすべてのテープ・ライブラリ上にSecureFilesコンテンツを格納できます。「SecureFiles LOBおよびDBFS用のPL/SQLパッケージ」および第9章「DBFS階層ストア」を参照してください。

Oracle Database 11gリリース1で導入されたLOBの新機能

Oracle SecureFilesに次の機能が追加されました。

- 明示的にデータを圧縮し、ディスク領域の節約を可能にするインテリジェントLOB圧縮。「圧縮について」、「ALTER TABLE圧縮」および「ALTER TABLE圧縮」を参照してください。

- 重複するLOBデータを自動検出し、LOBのコピーを1つのみ格納することにより記憶域を節約する重複除外。「重複除外について」、「ALTER TABLE重複除外」および「ALTER TABLE重複除外」を参照してください。

- 暗号化では、データがインプレースで格納され、ランダムな読取りおよび書込みに使用できるようになりました。「暗号化について」、「CREATE TABLE暗号化」および「ALTER TABLE暗号化」を参照してください。

- 記憶域レイヤー上の論理キャッシュ、読取りプリフェッチ、新規キャッシュ・モード、ベクトルIOなどのLOBデータ・パスの最適化。

- 新しいLOB APIがPL/SQLパッケージおよびOCIインタフェースの両方に追加され、SecureFilesおよび新規または修正済のSQLコマンドに対応しました。既存のOCI関数で新しいSecureFilesがサポートされます。
CREATE TABLEおよびALTER TABLEなどのSQL文に新しいパラメータが追加されSecureFilesの適切な構成が可能になりました。高パフォーマンス領域管理はLOB SQL文の変更およびDBMS_SPACEパッケージ変更を含みます。第4章「Oracle SecureFiles LOBの使用」を参照してください。

OCI LOBプリフェッチにより、パフォーマンスが向上します。「LOBデータ、長さおよびチャンク・サイズのプリフェッチ」を参照してください。

1 ラージ・オブジェクトの概要

この章では、ラージ・オブジェクト(LOB)の概要と、LOBデータ型をアプリケーション開発に使用する方法について説明します。この章の内容は次のとおりです。

- ラージ・オブジェクト

- ラージ・オブジェクトを使用する理由

- LONGを使用しない理由

- 各種のLOB

- LOBロケータの概要

- 内部LOBと外部LOBのデータベース・セマンティクス

- ラージ・オブジェクト・データ型

- オブジェクト・データ型とLOB

- LOBを使用した他のデータ型の格納と作成

ラージ・オブジェクト

ラージ・オブジェクト(LOB)とは、大量のデータを保持するように設計されたデータ型のセットです。LOBには、データベースの構成に応じて最大サイズが8から128TBのデータを保持できます。データをLOBで格納すると、アプリケーションで効率的にアクセスして操作できます。

ラージ・オブジェクトを使用する理由

この項では、アプリケーション開発時に使用する各種のデータを紹介し、ラージ・オブジェクトに適したデータの種類について説明します。

現在のアプリケーションでは、次の種類のデータを扱う必要があります。

- 単純な構造化データ
この種のデータは、ビジネス・ルールに基づいて構築された単純な表に編成できます。

- 複雑な構造化データ
この種のデータは複雑な性質を持つため、コレクション型、REF型およびユーザー定義型など、Oracleデータベースのオブジェクト・リレーショナル機能に適しています。

- 半構造化データ
この種のデータは、通常はデータベースで解析されない論理構造を持っています。たとえば、アプリケーションや外部サービスで処理されるXML文書は、半構造化データとみなせます。アプリケーションで半構造化データを処理できるように、データベースにはOracle XML DB、アドバンスト・キューイングおよびメッセージなどのテクノロジが用意されています。

- 非構造化データ
この種のデータは、小さい論理構造に分解されることがなく、通常はデータベースやアプリケーションで解析されません。たとえば、バイナリ・ファイルとして格納されたフォト・イメージは、非構造化データです。

ラージ・オブジェクトは、最後の2種類のデータ、つまり半構造化データおよび非構造化データに適しています。ラージ・オブジェクト機能を使用すると、データベースからアクセスするオペレーティング・システム・ファイルのみでなく、データベースにもこの種のデータを格納できます。

インターネットおよびコンテンツ・リッチなアプリケーションの普及に伴い、データベースでは、次のことを実現するためのデータ型のサポートが不可欠になっています。

- 非構造化データと半構造化データの効率的な格納

- 大量のデータの最適化

- データベースの内外に格納されたデータにアクセスするための一定の方法の提供

半構造化データに対するLOBの使用

半構造化データの例には、XML文書やワード・プロセッサ・ファイルなどのドキュメント・ファイルがあります。この種のドキュメントの場合、データはアプリケーションで処理または解析される論理構造に含まれており、データベースへの格納時に小さい論理単位に分解されることはありません。

通常、半構造化データが関係するアプリケーションは、大量の文字データを使用します。キャラクタ・ラージ・オブジェクト(CLOB)データ型と各国語キャラクタ・ラージ・オブジェクト(NCLOB)データ型は、この種のデータの格納と操作に理想的です。

文字データは、バイナリ・ファイル・オブジェクト(BFILEデータ型)にも格納できます。BFILEを使用して、オペレーティング・システム・ファイルからCLOBまたはNCLOBインスタンスに読取り専用データをロードし、アプリケーションで操作できます。

非構造化データに対するLOBの使用

非構造化データが標準コンポーネントに分解されることはありません。たとえば、従業員に関するデータは、文字列として格納される名前、ID番号などの識別子および給与などに構造化できます。これに対して、写真データは1と0(ゼロ)の長いストリームで構成されます。これらのビットは、ディスプレイで写真を見られるようにピクセルのオンとオフの切り替えに使用されますが、データベース記憶域に関しては、それより細かい構造に分解されることはありません。

また、テキスト、図形イメージ、静止ビデオ・クリップ、フル・モーション・ビデオおよびサウンド・ウェーブフォームなどの非構造化データは、サイズが大きくなる傾向があります。従業員レコードは通常、数百バイトですが、マルチメディア・データは、わずかであってもその何千倍もの大きさになる場合があります。

SQLデータ型は、BLOBデータ型(バイナリ・ラージ・オブジェクト)やBFILEデータ型(バイナリ・ファイル・オブジェクト)を含む大量の非構造化バイナリ・データに理想的です。

LONGを使用しない理由

データベースでは、LONGデータ型およびLOBデータ型をサポートしています。LOBの方がメリットが多いため、可能な場合は、LONGではなくLOBを使用するように既存のアプリケーションを変更してください。LONGからLOBへ移行すると、LONG列にアクセスしている既存のアプリケーションを簡単に移行してLOB列を使用できます。

関連項目:
第18章「LONGからLOBへの列の移行」

バージョン7以前のOracle Database用に開発されたアプリケーションでは、非構造化データを大量に格納するためにLONGまたはLONG RAWデータ型を使用していました。

Oracle8i以上のデータベースでは、大量の構造化および半構造化データの格納にLOBデータ型の使用をお薦めします。LOBデータ型には、LONG型およびLONG RAW型と比較して次のようなメリットがあります。

- LOB容量: LOBには、はるかに大量のデータを格納できます。LOBには、システム構成に応じて4GB以上のデータを格納できます。LONG型とLONG RAW型では、データは2GBに制限されます。

- 表当たりのLOB列数: 1つの表は複数のLOB列を持つことができます。1つの表の各LOB列には、任意のLOB型を使用できます。Oracle Databaseリリース7.3以上では、表は1つのLONG列またはLONG RAW列に制限されます。

- ランダムなピース単位のアクセス: LOBはデータへのランダム・アクセスをサポートしますが、LONGでサポートされるのは逐次アクセスのみです。

- LOBはオブジェクトの属性にもなります。

各種のLOB

各種のLOBは、データベースまたは外部ファイルに格納できます。

注意:
データベース内のLOBを、内部LOBまたは内部永続LOBと呼ぶこともあります。

内部LOB

データベース内のLOBは、領域が最適化され効率的なアクセスが可能になるような形でデータベース表領域に格納されます。内部LOBの宣言がサポートされているSQLデータ型は、BLOB、CLOB、およびNCLOBです。これらのデータ型の詳細は、「ラージ・オブジェクト・データ型」を参照してください。

永続LOBと一時LOB

内部LOB(データベース内のLOB)には、永続LOBと一時LOBがあります。永続LOBとは、データベースの表の行に存在するLOBインスタンスです。一時LOBは、ローカル・アプリケーションの有効範囲内でのみLOBをインスタンス化する場合に作成されます。

一時インスタンスを表の行に挿入すると、通常のインスタンスになります。

永続LOBは、コピー・セマンティクスを使用し、データベース・トランザクションに参加します。トランザクションまたはメディアに障害が発生した場合は永続LOBをリカバリでき、永続LOB値に対する変更はすべてコミットまたはロールバックできます。つまり、データ・オブジェクトの使用に関連するすべてのACID (原子性、一貫性、独立性、耐久性)プロパティは、永続LOBの使用に関連します。

外部LOBとBFILEデータ型

外部LOBは、データベース表領域の外にあるオペレーティング・システム・ファイルに格納されるデータ・オブジェクトです。データベースは、SQL BFILEデータ型を使用して外部LOBにアクセスします。BFILEデータ型は、唯一の外部LOBデータ型です。

BFILEは読取り専用データ型です。データベースでは、BFILEに格納されているデータに対する読取り専用のバイト・ストリーム・アクセスが可能です。アプリケーション内でBFILEに書き込むことはできません。

データベースは、BFILE列で参照セマンティクスを使用します。BFILE型の表列に格納されたデータは、データベース表領域ではなくオペレーティング・システム・ファイルに物理的に置かれます。

通常、BFILEは次のデータの格納に使用します。

- 図形など、アプリケーションの実行中に変化しないバイナリ・データ

- 後で操作できるようにBLOBやCLOBのような他のラージ・オブジェクト型にロードされるデータ

- マルチメディアなど、バイト・ストリーム・アクセスに適したデータ

- 比較的サイズの大きい読取り専用データ(データベース表領域の大量使用を回避するため)

ハード・ディスク・ドライブ、CD-ROM、PhotoCDおよびDVDなど、オペレーティング・システムからアクセスする任意のストレージ・デバイスにBFILEデータを保持できます。データベースでは、オペレーティング・システムが、これらのオペレーティング・システム・ファイルへのストリーム・モード・アクセスをサポートしている場合、BFILEにアクセスできます。

注意:
外部LOBは、トランザクションには関係ありません。LOBの整合性および耐久性は、OSで管理されるファイルシステムによってサポートされる必要があります。

LOBロケータの概要

LOBインスタンスはロケータと値を持ちます。LOBロケータは、LOB値が物理的に格納されている場所への参照です。LOB値は、LOBに格納されているデータです。

LOBをパラメータ渡しなどの操作に使用する場合、実際にはLOBロケータを渡すことになります。ほとんどの場合、LOBロケータのセマンティクスに関係なく、アプリケーションでLOBインスタンスを操作できます。一部のプログラミング言語でのポインタとは異なり、LOBロケータを間接参照する必要はありません。

LOBロケータのセマンティクスとLOB値の格納方法については、いくつかの考慮事項があります。詳細は、このマニュアル全体の該当する箇所で説明しています。

関連項目:

- 「LOBロケータとLOB値」

- 「LOBロケータとBFILEロケータ」

- 「LOB記憶域パラメータ」

内部LOBと外部LOBのデータベース・セマンティクス

どのプログラム環境でも、内部LOBと外部LOBのデータベース・セマンティクスには次のような違いがあります。

- 内部LOBは、コピー・セマンティクスを使用します。
コピー・セマンティクスにより、挿入、更新または割当て操作中にLOBロケータとLOB値の両方が論理的にコピーされます。これにより、LOBを含む各表のセルまたは各変数には一意のLOBインスタンスが確実に保持されます。

- 外部LOBは、参照セマンティクスを使用します。
参照セマンティクスにより、挿入操作中にはLOBロケータのみがコピーされます。(外部LOBは読取り専用のため、更新操作は外部LOBには適用できないことに注意してください。詳細は後に説明します。)

ラージ・オブジェクト・データ型

表1-1 に、データベースでサポートされる各ラージ・オブジェクト・データ型と、各データ型が使用される典型的なデータの種類を示します。この表に示されているデータ型名は、データベースで提供されるSQLデータ型です。通常、この表とこのマニュアルの他の部分に記載されているデータ型の説明は、他のプログラム環境で提供される対応するデータ型にも適用されます。また、LOBという用語は、通常はすべてのラージ・オブジェクト・データ型の集合を指すことに注意してください。

表1-1 ラージ・オブジェクト・データ型

SQLデータ型

説明

BLOB

バイナリ・ラージ・オブジェクト

すべての種類のデータがバイナリ形式で格納されます。通常は、イメージ、オーディオおよびビデオなどのマルチメディア・データに使用します。

CLOB

キャラクタ・ラージ・オブジェクト

文字列データがデータベース・キャラクタ・セット形式で格納されます。データベース・キャラクタ・セットを使用する大きい文字列またはドキュメント専用です。データベース・キャラクタ・セットの文字は固定幅形式です。

NCLOB

各国語キャラクタ・セット・ラージ・オブジェクト

文字列データが各国語キャラクタ・セット形式で格納されます。各国語キャラクタ・セットを使用する大きい文字列またはドキュメントに使用します。可変幅形式の文字がサポートされます。

BFILE

外部バイナリ・ファイル

ホスト・オペレーティング・システムのファイルシステム内でデータベースの外部に格納される、データベース表からアクセス可能なバイナリ・ファイルです。BFILEには、アプリケーションから読取り専用でアクセスできます。BFILEは、アプリケーションで操作されない、イメージ・データなどの静的データを格納するために使用します。

BFILEには、あらゆる種類のデータ、つまり任意のオペレーティング・システム・ファイルを格納できます。たとえば、文字データをBFILEに格納し、ロード時にキャラクタ・セットを指定してBFILEデータをCLOBにロードできます。

オブジェクト・データ型とLOB

LOBデータ型は、オブジェクト・データ型のフィールドまたはメンバーとして宣言できます。たとえば、オブジェクト型でCLOB型の属性を持つことができます。通常、LOB列内のLOBインスタンスの使用方法と、オブジェクト・データ型のメンバーであるLOBインスタンスの使用方法に違いはありません。使用方法の違いについては、該当する場合に説明します。このマニュアルでは、LOB属性はオブジェクト・データ型のメンバーであるLOBインスタンスを指します。特に明記しないかぎり、LOB列の説明はLOB属性にも該当します。

LOBを使用した他のデータ型の格納と作成

LOBを使用して他のユーザー定義のデータ型を作成したり、他のデータ型をLOBとして格納できます。この項では、LOB型を使用して格納または作成するデータ型の例として、データベースで提供される一部のデータ型について説明します。

LOBとして格納されるVARRAY

次の使用例で表を作成すると、データベースではVARRAY型のインスタンスがLOBの配列として格納されます。

- VARRAYの記憶域句(VARRAY varray_item STORE AS)を指定せず、宣言したVARRAYデータのサイズが4000バイトを超える場合。

- STORE AS LOB句(VARRAY varray_item STORE AS LOB ...)を使用してVARRAY列のプロパティを指定した場合。

CLOBとして格納されるXMLType列

LOBデータ型を使用して他のデータ型を格納する方法のよい例が、XMLTypeデータ型です。XMLTypeデータ型はCLOBとして格納される場合があります。XMLTypeデータ型をCLOBとして格納するように表または列を設定すると、データベースにスキーマをほとんど使用しないXML文書を格納できます。

関連項目:

- XMLTypeの表と列の作成方法およびXMLをCLOBに格納する方法の詳細は、『Oracle XML DB開発者ガイド』を参照してください。

- XMLの操作方法の詳細は、『Oracle XML Developer's Kitプログラマーズ・ガイド』を参照してください。

Oracle Multimediaで使用されるLOB

Oracle Multimediaでは、LOBデータ型を使用して、MultimediaのORDAudio、ORDDoc、ORDImageおよびORDVideoなど、マルチメディア・アプリケーション用に特化されたデータ型が作成されます。Oracle Multimediaはデータベースのインフラストラクチャを使用して、オブジェクト型、メソッド、およびデータベースにこの特定の型のデータを表すために必要なLOBを定義します。

関連項目:

- Oracle Multimediaの使用方法の詳細は、『Oracle Multimediaユーザーズ・ガイド』を参照してください。

- Oracle Multimediaのデータ型の使用方法の詳細は、『Oracle Multimediaリファレンス』を参照してください。

第I部

スタート・ガイド

第I部では、ラージ・オブジェクト(LOB)の概要とアプリケーションでLOBを使用する場合の概念全般について説明します。

この部の構成は、次のとおりです。

- 第1章「ラージ・オブジェクトの概要」

- 第2章「LOBの作業」

- 第3章「LOBの管理: データベース管理」

2 LOBの作業

この章では、アプリケーション開発に必要なLOBLOBの使用方法とセマンティクスについて説明し、LOBを使用するための様々な技法についても説明します。

この章での永続LOBに関するほとんどの説明は、既存の表にあるLOBを扱うことを前提としています。通常、LOB列を含む表の作成作業は、データベース管理者が行います。

関連項目:

- SecureFilesパラダイムを使用したLOBの作成については、第4章「Oracle SecureFiles LOBの使用」を参照してください。

- LOBの作成に使用される記憶域パラメータについては、第11章「LOB記憶域」を参照してください。

この章の内容は次のとおりです。

- LOB列のステータス

- LOBを含む行のロック

- LOBのオープンおよびクローズ

- LOBロケータとLOB値

- LOBロケータとBFILEロケータ

- LOBへのアクセス

- LOBのルールと制限

LOB列のステータス

LOB列のセルにアクセスするときに使用する手法は、そのセルの状態に応じて異なります。LOB列のセルの状態は、次のいずれかです。

- NULL
表セルは作成されていますが、セルに値またはロケータは保持されていません。

- 空
セルにロケータを含むLOBインスタンスが存在しますが、値はありません。LOBの長さは0(ゼロ)です。

- 移入済
セルにはロケータと値を含むLOBインスタンスが存在します。

LOBを含む行のロック

LOBを含む行をロックして、トランザクション中に他のデータベース・ユーザーがLOBに書き込むのを防止できます。LOBを含む行をロックするには、行の選択時にFOR UPDATE句を指定します。行をロックすると、トランザクションを終了するまで他のユーザーはそのLOBをロックまたは更新できません。

LOBのオープンおよびクローズ

LOB APIには、LOBインスタンスを明示的にオープンおよびクローズできる操作が組み込まれています。永続LOBインスタンスは、BLOB、CLOB、NCLOBまたはBFILEなど、どの型の場合にもオープンおよびクローズできます。LOBをオープンすると、次の一方または両方の結果となります。

- LOBを読取り専用モードでオープンした場合
この場合、LOB(LOBロケータとLOB値の両方)は、明示的にクローズするまではセッションで変更できません。たとえば、このモードでオープンすることで、重要な操作でLOBを使用しているときに、そのLOBがプログラムの他の部分により変更されないようにできます。操作の実行後に、LOBをクローズできます。

- LOBを読取り/書込みモードでオープンした場合(通常のBLOB、CLOBまたはNCLOBインスタンスのみ)
LOBを読取り/書込みモードでオープンすると、そのLOBをクローズするまでLOB列の索引メンテナンスが遅延されます。このモードでのLOBのオープンが役立つのは、LOB列に拡張可能索引があり、そのLOBに書込みを行うたびにデータベースで索引メンテナンスが実行されるのを避ける場合のみです。オープンしているLOBに対して複数の書込み操作を実行する場合は、この方法でオープンするとアプリケーションのパフォーマンスを改善できます。

オープンしたLOBは、セッションのいずれかの時点でクローズする必要があります。これは、オープンしているLOBに対する唯一の要件です。LOBインスタンスがオープンしている間は、オープン時のモードで許可されている操作であれば、LOBに対して必要な数の操作を実行できます。

関連項目:
これらのAPIの使用方法の詳細は、「OPENおよびCLOSEインタフェースを使用した永続LOBのオープン」を参照してください。

LOBロケータとLOB値

LOB値にアクセスして変更するには、次の2つの方法があります。

- LOB用データ・インタフェースの使用

- LOBロケータを使用したLOB値へのアクセスと変更

LOB用データ・インタフェースの使用

OCIのLOB用データ・インタフェースを使用すると、CアプリケーションでCLOB列とBLOB列に対してバインド操作と定義操作を実行できます。これにより、次のように、LOBロケータを使用せずにLOB列にデータを挿入したり、LOB列からデータを選択できます。

- LOB列に関連付けられているバインド変数を使用して、CLOBに文字データを挿入するか、BLOBにRAWデータを挿入します。

- 定義操作を使用してアプリケーションで出力バッファを定義します。このバッファに、CLOBから選択された文字データまたはBLOBから選択されたRAWデータが保持されます。

関連項目:
LOBの他のデータ型への暗黙的な割当ての詳細は、第20章「永続LOB用のデータ・インタフェース」を参照してください。

LOBロケータを使用したLOB値へのアクセスと変更

データベースに格納されたLOBインスタンスの値には、LOBロケータ、つまりLOB値の位置への参照を介してアクセスできます。データベース表では、CLOB、BLOB、NCLOBおよびBFILE列にロケータのみが格納されます。LOBロケータとLOB値に関する注意事項は、次のとおりです。

- LOB値にアクセスしたり操作するには、各種のLOB APIにLOBロケータを渡します。

- LOBロケータは、同じ型の任意のLOBインスタンスに割り当てることができます。

- 一時LOBまたは永続LOBの特性は、ロケータには影響しません。この2つの特性はLOBインスタンスにのみ適用されます。

LOBロケータとBFILEロケータ

LOB型のBLOB、CLOBおよびNCLOBのロケータとBFILE型のロケータでは、セマンティクスに次のような違いがあることに注意する必要があります。

- LOB型のBLOB、CLOBおよびNCLOBの場合、LOB列にはLOB値のロケータが格納されます。各LOBインスタンスは固有のLOBロケータのみでなく、LOB値の固有のコピーも持ちます。

- 初期化済のBFILE列の場合、行にはBFILEの値を保持する外部オペレーティング・システム・ファイルのロケータが格納されます。行内の各BFILEインスタンスは固有のロケータを持ちますが、2つの異なる行に同じオペレーティング・システム・ファイルを指すBFILEロケータを含めることも可能です。

LOB値の格納場所に関係なく、ロケータは初期化済LOB列の表の行に格納されます。単にロケータという場合は、LOBロケータとBFILEロケータの両方を指すことに注意してください。また、表からLOBを選択した場合、戻されるLOBは常に一時LOBです。一時LOBのロケータの使用方法の詳細は、「SQLファンクションから戻されるLOB」を参照してください。

print_media表

Oracle Databaseサンプル・スキーマPMのprint_media表は、このマニュアルの多数の例で使用されており、次のように定義されています。

CREATE TABLE print_media
( product_id        NUMBER(6)
, ad_id             NUMBER(6)
, ad_composite      BLOB
, ad_sourcetext     CLOB
, ad_finaltext      CLOB
, ad_fltextn        NCLOB
, ad_textdocs_ntab  textdoc_tab
, ad_photo          BLOB
, ad_graphic        BFILE
, ad_header         adheader_typ
) NESTED TABLE ad_textdocs_ntab STORE AS textdocs_nestedtab;

関連項目:
print_mediaおよびそれに関連付けられた表とファイルの作成方法の詳細は、「1つ以上のLOB列を含む表の作成」 を参照してください。

ロケータを含めるためのLOB列の初期化

NULLのLOBインスタンスには、ロケータはありません。LOBインスタンスをLOB APIルーチンに渡す前に、そのインスタンスにロケータを含める必要があります。たとえば、行からNULLのLOBを選択できますが、そのインスタンスをPL/SQL DBMS_LOB.READプロシージャには渡せません。次の項では、永続LOB列を初期化する方法とBFILE列を初期化する方法について説明します。

永続LOB列の初期化

サポートされているプログラム環境(PL/SQL、OCI、OCCI、Pro*C/C++、Pro*COBOL、Visual Basic、JavaまたはOLEDB)を使用してデータを永続LOBに書き込む前に、LOB列およびLOB属性をNULL以外にする必要があります。つまり、ロケータを含める必要があります。

これは、BLOBに対してはEMPTY_BLOBファンクション、CLOBおよびNCLOBに対してはEMPTY_CLOBファンクションを使用して、INSERT文およびUPDATE文で永続LOBを空に初期化することによって行います。

注意:
SQLを使用すると、NULL値が含まれているLOB列にもデータを移入できます。

関連項目:
LOB列の初期化方法の詳細は、第11章「LOB記憶域」を参照してください。

EMPTY_BLOB()またはEMPTY_CLOB()ファンクションを実行すること自体では例外は発生しません。ただし、空に設定されたLOBロケータを使用して、PL/SQLのDBMS_LOBまたはOCI関数でLOB値に対してアクセスまたは操作すると、例外が発生します。

空のロケータを使用できるのは、INSERT文のVALUES句やUPDATE文のSET句などです。

関連項目:

- CREATE DIRECTORYおよびBFILENAMEの使用方法の詳細は、「ディレクトリ・オブジェクト」を参照してください。

- ディレクトリ・オブジェクトの作成方法の詳細は、『Oracle Databaseリファレンス』のCREATE DIRECTORY文の項を参照してください。

- 『Oracle Database SQL言語リファレンス』のCREATE DIRECTORY文の項を参照してください。

注意:
文字列は、インスタンス用のデフォルトのキャラクタ・セットを使用して挿入されます。

INSERT文はPMのprint_media表において次の操作を実行します。

- ad_sourcetextに文字列my Oracleを移入します。

- ad_composite、ad_finaltextおよびad_fltextnを空の値に設定します。

- ad_photoをNULLに設定します。

- ad_graphicを、論理ディレクトリmy_directory_objectにあるmy_pictureファイルを指すように初期化します。

CREATE OR REPLACE DIRECTORY my_directory_object AS 'oracle/work/tklocal';
INSERT INTO print_media VALUES (1726, 1, EMPTY_BLOB(),
'my Oracle', EMPTY_CLOB(), EMPTY_CLOB(),
NULL, NULL, BFILENAME('my_directory_object', 'my_picture'), NULL);

同様に、print_media内のad_header列のLOB属性は、次に示すようにNULL、空、または文字/生のリテラルに初期化できます。

INSERT INTO print_media (product_id, ad_id, ad_header)
VALUES (1726, 1, adheader_typ('AD FOR ORACLE', sysdate,
'Have Grid', EMPTY_BLOB()));

関連項目:

- 「別の表からのLOBの選択による行の挿入」

- 「表へのLOB値の挿入」

- 「初期化したLOBロケータ・バインド変数を使用した行の挿入」

- OCIでのLOBロケータのセマンティクスの詳細は、「OCILobLocatorポインタの割当」 を参照してください。

BFILEの初期化

LOB APIを使用してBFILE値にアクセスする前に、BFILE列または属性をNULL以外にする必要があります。BFILENAMEファンクションを使用して、外部OSファイルを指すBFILE列を初期化できます。

関連項目:
BFILE列の初期化方法の詳細は、「BFILEへのアクセス」を参照してください。

LOBへのアクセス

LOBインスタンスにアクセスするには、次の方法があります。

- SQLを使用したLOBへのアクセス

- データ・インタフェースを使用したLOBへのアクセス

- ロケータ・インタフェースを使用したLOBへのアクセス

SQLを使用したLOBへのアクセス

LOBデータ型を使用する列に対するサポートは、多数のSQLファンクションに組み込まれています。このサポートにより、SQLのセマンティクスを使用してSQLでLOB列にアクセスできます。ほとんどの場合は、VARCHAR2列に使用するのと同じSQLセマンティクスをLOB列に対して使用できます。

関連項目:
LOBに対するSQLセマンティクスのサポートの詳細は、第16章「SQLセマンティクスとLOB」を参照してください。

データ・インタフェースを使用したLOBへのアクセス

OCIやPL/SQLのLONG-to-LOB APIを使用すると、直接LOBを選択してCHARバッファまたはRAWバッファに移動できます。次のPL/SQLの例では、ad_finaltextがVARCHAR2バッファfinal_adに移動するように選択されています。

DECLARE
final_ad VARCHAR(32767);
BEGIN
SELECT ad_finaltext INTO final_ad FROM print_media
WHERE product_id = 2056 and ad_id = 12001 ;
/* PUT_LINE can only output up to 255 characters at a time  */
...
DBMS_OUTPUT.PUT_LINE(final_ad);
/* more calls to read final_ad */
...
END;

関連項目:
データ・インタフェースを使用してLOBにアクセスする方法の詳細は、第20章「永続LOB用のデータ・インタフェース」を参照してください。

ロケータ・インタフェースを使用したLOBへのアクセス

データベースで提供されるLOB APIにLOBロケータを渡すことで、LOBインスタンスにアクセスして操作できます。サポートされている各プログラム環境には、広範囲なLOB APIセットが用意されています。OCIの場合、LOBロケータはLOB値へのアクセスに使用されるロケータ・ポインタにマップされます。

注意:
OCIを含め、どの環境の場合も、LOB APIはLOB値を暗黙的に操作することに注意してください。LOBロケータの間接参照先へアクセスして操作する必要はありません。

関連項目:

- 第13章「LOB APIの概要」

- OCIでのLOBロケータのセマンティクスの詳細は、「OCILobLocatorポインタの割当」 を参照してください。

LOBのルールと制限

この項では、LOBのルールと制限の詳細を説明します。

LOB列のルール

LOB列には次のルールと制限があります。

- LOBは主キー列として指定できません。

- Oracle DatabaseのリモートLOBに対するサポートは限定されています。リモートLOBは、次の3つの形式でサポートされています。
1.AS SELECT形式での表の作成または挿入。

CREATE TABLE t AS SELECT * FROM table1@remote_site;
INSERT INTO t SELECT * FROM table1@remote_site;
UPDATE t SET lobcol = (SELECT lobcol FROM table1@remote_site);
INSERT INTO table1@remote_site SELECT * FROM local_table;
UPDATE table1@remote_site SET lobcol = (SELECT lobcol FROM local_table);
DELETE FROM table1@remote_site <WHERE clause involving non_lob_columns>

前述の例のように構造化された文の場合、SELECT構文のリストに使用できるのはスタンドアロンのLOB列のみです。

2.スカラーを戻すリモートLOB上のファンクション。LOBパラメータを含み、スカラー・データ型を戻すSQLおよびPL/SQLファンクションがサポートされています。他のSQLファンクションとDBMS_LOB APIの場合、リモートのLOB列に対する使用はサポートされていません。たとえば、次の文はサポートされています。

CREATE TABLE tab AS SELECT DBMS_LOB.GETLENGTH@dbs2(clob_col) len FROM tab@dbs2;
CREATE TABLE tab AS SELECT LENGTH(clob_col) len FROM tab@dbs2;

ただし、次の文は、DBMS_LOB.SUBSTRがLOBを戻すため、サポートされていません。

CREATE TABLE tab AS SELECT DBMS_LOB.SUBSTR(clob_col) from tab@dbs2;

3.リモートLOB用のデータ・インタフェース。文字またはバイナリのバッファをリモートのCLOBまたはBLOBに挿入、およびCLOBまたはBLOBを選択して文字またはバイナリのバッファに挿入できます。次にPL/SQLの場合の例を示します。

SELECT clobcol1, type1.blobattr INTO varchar_buf1, raw_buf2 FROM
table1@remote_site;
INSERT INTO table1@remotesite (clobcol1, type1.blobattr) VALUES varchar_buf1,
raw_buf2;
INSERT INTO table1@remotesite (lobcol) VALUES ('test');
UPDATE table1 SET lobcol = 'xxx';

リモート表のLOBに関してサポートされているのは、これらの構文のみです。他の使用方法はサポートされていません。

- クラスタには、キー列としてもキー列以外の列としても、LOBを含めることはできません。

- 次のデータ構造は、一時インスタンスとしてのみサポートされます。この種のインスタンスはデータベース表に格納できません。

- 任意のLOB型のVARRAY

- LOB属性を持つオブジェクト型など、LOB型を含む任意の型のVARRAY

- 任意のLOB型のANYDATA

- LOB型を含む任意の型のANYDATA

- 問合せのORDER BY句やGROUP BY句または集計ファンクションには、LOB列を指定できません。

- SELECT...DISTINCT文やSELECT...UNIQUE文、または結合文には、LOB列を指定できません。ただし、列のオブジェクト型にその型で定義されたMAPファンクションまたはORDERファンクションが含まれている場合、SELECT...DISTINCT文、またはUNIONやMINUS集合演算子を使用する問合せには、オブジェクト型列のLOB属性を指定できます。

- LOBセグメントの最初の(INITIAL)エクステントには、3つ以上のデータベース・ブロックを含める必要があります。

- 最小エクステント・サイズは14ブロックです。8Kブロック・サイズ(デフォルト)の場合は、112Kと同等になります。

- AFTER UPDATE DMLトリガーの作成時には、UPDATE OF句にLOB列を指定できません。

- LOB列は索引キーの一部として指定できません。ただし、ドメイン索引の索引タイプ指定には、LOB列を指定できます。また、Oracle Textを使用すると、CLOB列に索引を定義できます。

- INSERT... AS SELECT操作では、LOB列とLOB属性に最大4,000バイトのデータをバインドできます。

- 表にLONG列とLOB列の両方がある場合、同一のSQL文でLONG列とLOB列の両方に4,000バイトを超えるデータをバインドすることはできません。ただし、LONG列またはLOB列のいずれか一方には、4,000バイトを超えるデータをバインドできます。

注意:
OCI関数またはDBMS_LOBパッケージを使用して、LOB列の値またはオブジェクト型列のLOB属性を変更した場合、AFTER UPDATE DMLトリガーを定義した表では、DMLトリガーが起動されません。

関連項目:

- SecureFilesの各機能(重複除外、圧縮および暗号化)については、第4章「Oracle SecureFiles LOBの使用」を参照してください。

- 「パーティション化された索引構成表のLOBに対する制限」

- クラスタ化表、レプリケーション、トリガー、ドメイン索引およびファンクション索引におけるLONGからLOBへの移行の制限については、第18章「LONGからLOBへの列の移行」の「LONGからLOBへのアプリケーションの移行」を参照してください。

- SQLセマンティクスの制限については、「SQLでサポートされないLOBの使用」を参照してください。

- LOBセグメントのINITIALエクステントの詳細は、「LOBセグメントの最初のエクステントの制限」を参照してください。

- パーティション化された索引構成表のLOBには、他の多数の制限も適用されます。詳細は、「パーティション化された索引構成表のLOBに対する制限」を参照してください。

- 「リモートLOB用データ・インタフェースの使用」

LOB操作の制限

その他の一般的なLOBの制限は、次のとおりです。

- SQL*Loaderでは、LOBから読み取られたフィールドは句の引数として使用できません。「データをLOBにロードするためのデータベース・ユーティリティ」を参照してください。

- 共有サーバー(マルチスレッド・サーバー)・モードでのBFILEのセッション移行はサポートされません。これは、オープンされたBFILEに対する操作を、共有サーバーへのコール終了後も継続できることを意味します。BFILE操作が含まれる共有サーバーのセッションは、1台の共有サーバーに限定され、サーバー間での移行はできません。

- CLOB列に対する大/小文字を区別しない検索は、多くの場合成功しません。CLOB列に対して大/小文字を区別しない検索を行うには、たとえば次のようにします。

ALTER SESSION SET NLS_COMP=LINGUISTIC;
ALTER SESSION SET NLS_SORT=BINARY_CI;
SELECT * FROM ci_test WHERE LOWER(clob_col) LIKE 'aa%';

LOWER関数がないとSELECTは失敗します。Oracle Textでは、大/小文字を区別しない検索に対応しています。また、DBMS_LOB.INSTR()を使用する方法もあります。第16章「SQLセマンティクスとLOB」を参照してください。

3 LOBの管理: データベース管理

この章では、LOBを含むデータベースをセットアップ、メンテナンスおよび使用するために実行する必要のある管理作業について説明します。

この章の内容は次のとおりです。

- データをLOBにロードするためのデータベース・ユーティリティ

- 一時LOBの管理

- BFILEの管理

- LOB表領域の記憶域の変更

データをLOBにロードするためのデータベース・ユーティリティ

データベースのセットアップまたはメンテナンス・タスクの一環としてデータをLOB列にバルク・ロードするには、次のユーティリティの使用をお薦めします。

- SQL*Loader

- Oracle Data Pump

注意:
アプリケーション開発者: アプリケーションでLOBにデータをロードするには、LOB APIの使用をお薦めします。ファイルからLOBをロードできるAPIの詳細は、第22章「LOB APIの使用」を参照してください。

SQL*Loaderを使用したLOBのロード

SQL*Loaderを使用してデータをLOBにロードするには、次の2つの一般的な方法があります。

- プライマリ・データファイルからのデータのロード

- LOBFILEを使用したセカンダリ・データファイルからのロード

SQL*Loaderを使用してLOBをロードする場合には、次の考慮事項があります。

- SQL*Loaderの従来型パスによるロードでは、特定のLOBのロードに失敗しても、そのLOBを含むレコードが拒否されることはありません。ただし、そのレコードには空のLOBが含まれます。
SQL*Loaderのダイレクト・パス・ロードでは、LOBが空になったり、切り捨てられる可能性があります。LOBは、ロード時にピース単位でサーバーに送信されます。LOBピースにエラーがある場合、そのピースは廃棄され、そのLOBの残りはロードされません。エラーのあるLOB全体が最初のピースに含まれる場合、LOB列は空になるか、切り捨てられます。

- LOBFILEからロードする場合は、LOB型の列に対応するフィールドの最大長を指定します。最大長を指定すると、メモリー使用量の最適化のヒントとして使用されます。最大長の指定では、実際の最大長を過少評価しないしないでください。

- SQL*Loaderのダイレクト・パス・ロードを使用する場合、LOBのロードに大量のメモリーが使用されます。LOBのロード時に、メッセージ「SQL*Loader-00700: 必須割当て中にメモリー不足が発生しました[number]」(numberには数値が入ります)が表示された場合、内部コードによってロードのコール1回当たりにバッチされる行の数が、OSおよびプロセス・メモリーのサポートする数を超えている可能性があります。この問題を回避するには、ROWSオプションを使用して、データ・セーブ1回当たりに読み取る行数を少なくします。

- ダイレクト・パスAPIを使用して、LOBをロードすることもできます。

- CLOB列またはXMLType列にXMLデータを含む列をロードする場合は、LOBFILEを使用することをお薦めします。SQL*Loaderでダイレクト・パス・ロードを実行するか、従来型パスによるロードを実行するかは、ロード時にXML文書を検証する必要があるかどうかによって異なります。

- XML文書をロード時に検証する必要がある場合は、従来型パスによるロードを使用してください。

- XML文書の検証が不要な場合、またはXML文書が妥当であるとみなしても問題がない場合は、ダイレクト・パス・ロードを実行できます。XML検証によるオーバーヘッドが発生するため、ダイレクト・パス・ロードを使用する方がパフォーマンスは向上します。

conventional path loadは、SQL INSERT文を実行して、表をOracleデータベースに移入します。ダイレクト・パス・ロードは、Oracleデータ・ブロックをフォーマットし、データ・ブロックを直接データベース・ファイルに書き込むことによって、Oracleデータベースのオーバーヘッドの大半を排除します。

ダイレクト・パス・ロードでは、データベース・リソースに対して他のユーザーとの競合が発生しないため、ディスク速度に近い速度でデータをロードできます。ダイレクト・パス・ロード固有の問題(制限、セキュリティ、バックアップなど)は、『Oracle Databaseユーティリティ』で説明しています。

- データをロードする表はデータベース中に存在している必要があります。SQL*Loaderでは、表は作成されません。データが含まれているか、または空である既存の表にロードされます。

- ロードには次の権限が必要です。

- ロードされる表に関するINSERT権限

- ロードされる表に関するDELETE権限(同じ場所に新規のデータをロードする前に、REPLACEまたはTRUNCATEオプションを使用して以前のデータを空にする場合)

関連項目:
SQL*Loaderを使用してLOBをロードする方法およびその他のSQL*Loaderの使用方法の詳細は、『Oracle Databaseユーティリティ』を参照してください。

SQL*Loaderを使用したBFILE列への移入

この項では、ファイルシステム内のファイルからBFILE列にデータをロードする方法について説明します。

関連項目:
「BFILE APIについてサポートされている環境」

BFILEデータ型では、非構造化バイナリ・データはデータベース外のOSファイルに格納されることに注意してください。BFILE列または属性には、データを含むサーバー側外部ファイルを示すロケータが格納されます。

注意:
BFILEとしてロードされるファイルは、ロード時に実際に存在する必要はありません。

SQL*Loaderでは、必要なディレクトリ・オブジェクトは作成済であるとみなされます。

関連項目:
ディレクトリ・オブジェクトの作成方法は、「ディレクトリ・オブジェクト」およびそれに続く各項を参照してください。

BFILE列に対応する制御ファイル・フィールドは、列名およびそれに続くBFILEディレクティブで構成されます。

BFILEディレクティブは、DIRECTORYオブジェクト名およびそれに続けてBFILE名を引数としてとります。ディレクトリ・オブジェクト名およびBFILE名は、文字列定数として指定するか、その他のフィールドを介して動的にソース名を指定できます。

関連項目:
SQL*Loader構文の詳細は、『Oracle Databaseユーティリティ』を参照してください。

次の2つの例では、BFILESのロードを示します。

注意:
一部の例は、次のようなデータ構造を設定しないと機能しない場合があります(パスワードの入力を求められます)。

CONNECT system
Enter password:
Connected.
GRANT CREATE ANY DIRECTORY to samp;
CONNECT samp
Enter password:
Connected.
CREATE OR REPLACE DIRECTORY adgraphic_photo as '/tmp';
CREATE OR REPLACE DIRECTORY adgraphic_dir as '/tmp';

次の例では、ファイル名のみが動的に指定されます。

制御ファイル

LOAD DATA
INFILE sample9.dat
INTO TABLE Print_media
FIELDS TERMINATED BY ','
(product_id  INTEGER EXTERNAL(6),
FileName    FILLER CHAR(30),
ad_graphic  BFILE(CONSTANT "modem_graphic_2268_21001", FileName))

データファイル

007, modem_2268.jpg,
008, monitor_3060.jpg,
009, keyboard_2056.jpg,

注意:
product_IDはサイズが指定されていない場合はデフォルトで(255)に設定されます。データファイルのファイル名にマップされます。ADGRAPHIC_PHOTOはすべてのファイルが格納されているディレクトリです。ADGRAPHIC_DIRは事前に作成されたDIRECTORYオブジェクトです。

次の例では、BFILEおよびディレクトリ・オブジェクトが動的に指定されます。

制御ファイル

LOAD DATA
INFILE sample10.dat
INTO TABLE Print_media
FIELDS TERMINATED BY ','
(
product_id INTEGER EXTERNAL(6),
ad_graphic BFILE (DirName, FileName),
FileName  FILLER CHAR(30),
DirName   FILLER CHAR(30)
)

データファイル

007,monitor_3060.jpg,ADGRAPHIC_PHOTO,
008,modem_2268.jpg,ADGRAPHIC_PHOTO,
009,keyboard_2056.jpg,ADGRAPHIC_DIR,

注意:
DirName FILLER CHAR (30)は、ロードされるファイルに対応するディレクトリ名を含むデータファイル・フィールドにマップされます。

Oracle Data Pumpを使用したLOBデータの転送

Oracle Data Pumpを使用すると、あるデータベースから別のデータベースにLOBデータを転送できます。

関連項目:
Oracle Data Pumpの使用方法の詳細は、『Oracle Databaseユーティリティ』を参照してください。

一時LOBの管理

データベースは一時LOBをセッションごとに追跡しており、v$temporary_lobsというv$ビューを提供します。アプリケーションは、どのユーザーが一時LOBを所有しているかをセッションから判断できます。データベース管理者は、監視のため、および一時LOBが使用している一時領域の緊急クリーン・アップのガイドとして、このビューを使用できます。

一時LOB用の一時表領域の管理

一時表領域を使用して、一時LOBデータが格納されます。データベース管理者は、一時表領域に対するユーザー・アクセスを制御し、様々な一時表領域を作成して、一時LOBデータに使用されるデータ記憶域リソースを制御します。

関連項目:
一時表領域の管理の詳細は、『Oracle Database管理者ガイド』を参照してください。

BFILEの管理

この項では、BFILEを含むデータベースの管理作業について説明します。

ディレクトリ・オブジェクトおよびBFILEの使用規則

ディレクトリ・オブジェクトまたはBFILEを作成する場合、次の条件が満たされている必要があります。

- OSファイルが、シンボリック・リンクまたはハード・リンクではないこと。

- Oracleディレクトリ・オブジェクトに指定されているオペレーティング・システム・ディレクトリ・パスが、既存のオペレーティング・システム・ディレクトリ・パスであること。

- Oracleディレクトリ・オブジェクトに指定されているOSディレクトリ・パスのコンポーネントに、シンボリック・リンクが含まれていないこと。

オープンできるBFILE数の上限の設定

1回のセッションで同時にオープンが可能なBFILEの数には制限があります。初期化パラメータSESSION_MAX_OPEN_FILESは、1回のセッションで同時にオープンできるファイル数の上限を定義します。

このパラメータに対するデフォルト値は10です。デフォルト値を使用している場合、1回のセッションにつき10個までのファイルを同時にオープンできます。この制限を変更する場合、データベース管理者がinit.oraファイルのこのパラメータ値を変更できます。次に例を示します。

SESSION_MAX_OPEN_FILES=20

クローズされていないファイル数がSESSION_MAX_OPEN_FILES値を超えると、そのセッションでは、それ以上のファイルをオープンできなくなります。すべてのオープンしているファイルをクローズするには、DBMS_LOB.FILECLOSEALLコールを使用します。

LOB表領域の記憶域の変更

データベース管理者は、表の作成後に次の方法でLOBのデフォルト記憶域を変更できます。

- ALTER TABLE... MODIFYの使用: LOB表領域の記憶域を次のように変更できます。

注意:

- 既存のLOB列を変更するためのALTER TABLE構文には、LOB...STORE AS句ではなく、MODIFY LOB句を使用します。LOB...STORE AS句は、新しく追加されたLOB列に対してのみ使用されます。

- LOB記憶域句には、LOB_storage_clauseおよびmodify_LOB_storage_clauseの2種類があります。ALTER TABLE MODIFY LOB文に指定できるのは、modify_LOB_storage_clauseのみです。

ALTER TABLE test MODIFY
LOB (lob1)
STORAGE  (
NEXT         4M
MAXEXTENTS   100
PCTINCREASE  50
)

- ALTER TABLE... MOVEの使用: LOB表領域の記憶域を変更するためにALTER TABLE文のMOVE句も使用できます。次に例を示します。

ALTER TABLE test MOVE
TABLESPACE tbs1
LOB (lob1, lob2)
STORE AS (
TABLESPACE tbs2
DISABLE STORAGE IN ROW);

第II部

SecureFiles LOB

第II部では、SecureFiles LOB、ストアおよびOracle Database File Systemを使用するアプリケーションの設計時の考慮事項について説明します。

この部の構成は、次のとおりです。

- 第4章「Oracle SecureFiles LOBの使用」

- 第5章「Oracle Database File Systemの概要」

- 第6章「DBFSファイルシステム・クライアント」

- 第7章「DBFSコンテンツAPI」

- 第8章「DBFS SecureFilesストア」

- 第9章「DBFS階層ストア」

- 第10章「DBFSストアの作成」

4 Oracle SecureFiles LOBの使用

この章では、元のBasicFiles LOB実装を拡張するものとして導入されたSecureFiles LOBの使用方法について説明します。

この章の内容は次のとおりです。

- SecureFiles LOBについて

- SecureFiles LOBを含んだCREATE TABLEの使用

- SecureFiles LOBを含んだALTER TABLEの使用

- データベース・ファイルシステム・リンク

- SecureFiles LOBの初期化パラメータdb_securefile

- 互換性およびアップグレード

- BasicFiles LOBからSecureFiles LOBへの列の移行

- SecureFiles LOBおよびDBFS用のPL/SQLパッケージ

SecureFiles LOBについて

Oracle Database 11gリリース1以降、新しいLOB記憶域アーキテクチャであるSecureFilesが導入されました。SecureFiles LOBは、記憶域キーワードSECUREFILEがCREATE TABLE文に表れる場合に作成されます。元のLOB記憶域アーキテクチャであるBasicFiles LOBがデフォルトの記憶域です。CREATE TABLE文において、キーワードSECUREFILEが使用されない場合、またはキーワードBASICFILEが使用された場合に有効になります。

次の項では、LOB型の列を含む表の設計、作成および変更時に使用される、LOB記憶域の特性について説明します。データベース管理者は、init.oraファイルのdb_securefileの初期化パラメータを使用して、初期設定を変更できます。

CREATE TABLE文を使用して、圧縮、重複除外または暗号化を有効にしておくことをお薦めします。これらの機能をALTER TABLE文で有効にすると、表のすべてのSecureFiles LOBデータの読取り、変更および書込みが実行され、長時間に渡る可能性がある操作中にデータベースで表がロックされます。

この項の内容は次のとおりです。

- 圧縮について

- 重複除外について

- 暗号化について

圧縮について

SecureFilesインテリジェント圧縮は、Oracle Advanced Compressionオプションで使用可能で、SecureFiles LOBデータをシームレスに分析して圧縮し、ディスク領域を節約します。

SecureFilesインテリジェント圧縮を実行するには、Oracle Advanced Compressionオプションのライセンスが必要です。詳細は、『Oracle Databaseライセンス情報』を参照してください。

重複除外について

SecureFilesインテリジェント重複除外は、Oracle Advanced Compressionオプションで使用可能で、LOB列またはパーティション内で重複するLOBデータをOracle Databaseで自動検出できるようにし、データのコピーを1つのみ格納することにより領域を節約できます。

SecureFilesインテリジェント重複除外を実行するには、Oracle Advanced Compressionオプションのライセンスが必要です。詳細は、『Oracle Databaseライセンス情報』を参照してください。

Oracle Streamsでは、重複除外されるSecureFiles LOBがサポートされないことにも注意してください。

暗号化について

SecureFilesインテリジェント暗号化は、Oracle Advanced Securityオプションで使用可能で、新しいLOB暗号化機能が導入されています。データは透過的データ暗号化(TDE)使用して暗号化され、データの安全な格納だけでなく、ランダムな読取りおよび書込みアクセスが可能です。

SecureFilesインテリジェント暗号化を実行するには、Oracle Advanced Securityオプションのライセンスが必要です。詳細は、『Oracle Databaseライセンス情報』を参照してください。

SecureFiles LOBを含んだCREATE TABLEの使用

SecureFiles LOBは、自動セグメント領域管理(ASSM)で管理される表でのみ作成できます。次のパラメータに関する説明は、SECUREFILEパラメータを使用するLOB記憶域パラダイムに該当します。詳細は、『Oracle Database SQL言語リファレンス』のCREATE TABLE文に関する項を参照してください。

CREATE TABLE文を使用して、圧縮、重複除外または暗号化を有効にしておくことをお薦めします。これらの機能をALTER TABLE文で有効にすると、表のすべてのSecureFiles LOBデータの読取り、変更および書込みが実行され、長時間に渡る可能性がある操作中にデータベースで表がロックされます。

SHRINKオプションはSecureFiles LOBではサポートされていません。

SecureFiles LOBでは、新しい記憶域パラメータが導入されています。これらは、例4-1のCREATE TABLEのBNFに導入されています。パラメータの詳細は、「SecureFiles LOB用のCREATE TABLEのパラメータ」を参照してください。

例4-1 CREATE TABLE用のBNF

キーワードは太字で表されています。

CREATE [ GLOBAL TEMPORARY ] TABLE
[ schema.]table OF
[ schema.]object_type
[ ( relational_properties ) ]
[ ON COMMIT { DELETE | PRESERVE } ROWS ]
[ OID_clause ]
[ OID_index_clause ]
[ physical_properties ]
[ table_properties ] ;

<relational_properties> ::=
{ column_definition
| { out_of_line_constraint
| out_of_line_ref_constraint
| supplemental_logging_props
}
}
[, { column_definition
| { out_of_line_constraint
| out_of_line_ref_constraint
| supplemental_logging_props
}
]...

<column_definition> ::=
column data_type [ SORT ]
[ DEFAULT expr ]
[ ENCRYPT encryption_spec ]
[ ( inline_constraint [ inline_constraint ] ... )
| inline_ref_constraint
]

<data_type> ::=
{ Oracle_built_in_datatypes
| ANSI_supported_datatypes
| user_defined_types
| Oracle_supplied_types
}

<Oracle_built_in_datatypes> ::=
{ character_datatypes
| number_datatypes
| long_and_raw_datatypes
| datetime_datatypes
| large_object_datatypes
| rowid_datatypes
}

<large_object_datatypes> ::=
{ BLOB | CLOB | NCLOB| BFILE }

<table_properties> ::=
[ column_properties ]
[ table_partitioning_clauses ]
[ CACHE | NOCACHE ]
[ parallel_clause ]
[ ROWDEPENDENCIES | NOROWDEPENDENCIES ]
[ enable_disable_clause ]
[ enable_disable_clause ]...
[ row_movement_clause ]
[ AS subquery ]

<column_properties> ::=
{ object_type_col_properties
| nested_table_col_properties
| { varray_col_properties | LOB_storage_clause }
[ (LOB_partition_storage
[, LOB_partition_storage ]...
)
]
| XMLType_column_properties
}
[ { object_type_col_properties
| nested_table_col_properties
| { varray_col_properties | LOB_storage_clause }
[ ( LOB_partition_storage
[, LOB_partition_storage ]...
)
]
| XMLType_column_properties
}
]...

<LOB_partition_storage> ::=
PARTITION partition
{ LOB_storage_clause | varray_col_properties }
[ LOB_storage_clause | varray_col_properties ]...
[ ( SUBPARTITION subpartition
{ LOB_storage_clause | varray_col_properties }
[ LOB_storage_clause
| varray_col_properties
]...
)
]

<LOB_storage_clause> ::=
LOB
{ (LOB_item [, LOB_item ]...)
STORE AS [ SECUREFILE | BASICFILE ] (LOB_storage_parameters)
| (LOB_item)
STORE AS [ SECUREFILE | BASICFILE ]
{ LOB_segname (LOB_storage_parameters)
| LOB_segname
| (LOB_storage_parameters)
}
}

<LOB_storage_parameters> ::=
{ TABLESPACE tablespace
| { LOB_parameters [ storage_clause ]
}
| storage_clause
}
[ TABLESPACE tablespace
| { LOB_parameters [ storage_clause ]
}
]...

<LOB_parameters> ::=
[ { ENABLE | DISABLE } STORAGE IN ROW
| CHUNK integer
| PCTVERSION integer
| RETENTION [ { MAX | MIN integer | AUTO | NONE } ]
| FREEPOOLS integer
| LOB_deduplicate_clause
| LOB_compression_clause
| LOB_encryption_clause
| { CACHE |  NOCACHE | CACHE READS } [ logging_clause ] } }
]

<logging_clause> ::=
{ LOGGING | NOLOGGING | FILESYSTEM_LIKE_LOGGING }

<storage_clause> ::=
STORAGE
({ INITIAL integer [ K | M ]
| NEXT integer [ K | M ]
| MINEXTENTS integer
| MAXEXTENTS { integer | UNLIMITED }
| PCTINCREASE integer
| FREELISTS integer
| FREELIST GROUPS integer
| OPTIMAL [ integer [ K | M ]
| NULL
]
| BUFFER_POOL { KEEP | RECYCLE | DEFAULT }
}
[ INITIAL integer [ K | M ]
| NEXT integer [ K | M ]
| MINEXTENTS integer
| MAXEXTENTS { integer | UNLIMITED }
| MAXSIZE { { integer { K | M | G | T | P } } | UNLIMITED }
| PCTINCREASE integer
| FREELISTS integer
| FREELIST GROUPS integer
| OPTIMAL [ integer [ K | M ]
| NULL
]
| BUFFER_POOL { KEEP | RECYCLE | DEFAULT }
]...
)

<LOB_deduplicate_clause> ::=
{ DEDUPLICATE
| KEEP_DUPLICATES
}

<LOB_compression_clause> ::=
{ COMPRESS [ HIGH | MEDIUM | LOW ]
| NOCOMPRESS }

<LOB_encryption_clause> ::=
{ ENCRYPT [ USING 'encrypt_algorithm' ]
[ IDENTIFIED BY password ]
| DECRYPT
}

<XMLType_column_properties> ::=
XMLTYPE [ COLUMN ] column
[ XMLType_storage ]
[ XMLSchema_spec ]

<XMLType_storage> ::=
STORE AS
{ OBJECT RELATIONAL
| [ SECUREFILE | BASICFILE ] { CLOB | BINARY XML }
[ { LOB_segname [ (LOB_parameters) ]
| LOB_parameters
}
]

<varray_col_properties> ::=
VARRAY varray_item
{ [ substitutable_column_clause ]
STORE AS [ SECUREFILE | BASICFILE ] LOB
{ [ LOB_segname ] (LOB_parameters)
| LOB_segname
}
| substitutable_column_clause
}

SecureFiles LOB用のCREATE TABLEのパラメータ

表4-1は、CREATE TABLE文のパラメータをまとめたものです。

表4-1 CREATE TABLE文のパラメータ

パラメータ

説明

BASICFILE

LOBの元のアーキテクチャを指定するパラメータ。圧縮、重複除外または暗号化機能をサポートしないBasicFiles LOBを作成します。

SECUREFILE

パフォーマンスを改善し、圧縮、重複除外および暗号化機能もサポートするアーキテクチャであるSecureFiles LOBを指定するパラメータ。

CHUNK

LOBに対してアクセスまたは変更を行うときに、Oracle Databaseが使用するデータ・サイズです。これはBasicFiles LOBで使用され、SecureFiles LOBの場合は後方互換性のために提供されるアドバイザ・サイズです。

RETENTION

指定した方法でLOBデータの旧バージョンをLOB列に格納するように設定します。

MAXSIZE

LOBで使用可能な記憶域の上限。

FREEPOOLS

BasicFiles LOBのFREELISTグループの数を指定します(データベースが自動UNDOモードの場合)。SecureFiles LOBには使用されません。

LOGGING、NOLOGGINGまたはFILESYSTEM_LIKE_LOGGING

ロギング・オプション。

FREELISTSまたはFREELIST GROUPS

パーティション表でNULLセグメントに割り当てられるプロセス空きリスト、または空きリスト・グループの数をそれぞれ指定します。SecureFiles LOBには使用されません。

PCTVERSION

使用中のBasicFiles LOBデータ領域全体のうち、旧バージョンのLOBデータ・ページが占めることのできる割合を指定します。SecureFiles LOBには使用されません。

COMPRESSまたはNOCOMPRESS

SecureFilesインテリジェント圧縮をオンまたはオフにします。

DEDUPLICATEまたはKEEP_DUPLICATES

SecureFilesインテリジェント重複除外をオンまたはオフにします。

ENCRYPTまたはDECRYPT

SecureFilesインテリジェント暗号化をオンまたはオフにします。

BASICFILE

互換性モードが10gに設定されている場合、LOB STORAGE句は、10gで使用されていたものと同じです(BASICFILEキーワードは無効)。互換性モードが11g(またはそれ以上)に設定されている場合、デフォルトで元のリリース11.1より前のLOB機能が有効になり、完全な機能のためにこのパラメータが指定されます。

SECUREFILE

SecureFiles LOB記憶域アーキテクチャおよび機能を使用するには、SECUREFILE記憶域パラメータを明示的に指定します。SecureFiles LOBは、自動セグメント領域管理(ASSM)で管理される表領域でのみ作成できます。

BasicFiles LOBの場合、いずれかのSecureFiles LOBオプションを指定すると、エラーが発生します。

CHUNK

CHUNKは1つ以上のOracleブロックです。SecureFiles LOBでは、CHUNKはアドバイザ・サイズで、後方互換性の目的で提供されます。BasicFiles LOBでは、LOBを格納する表を作成する際にチャンク・サイズを指定できます。LOB値に対してアクセスまたは変更を行うときに、Oracle Databaseが使用するデータ・サイズに対応します。

RETENTION

Oracle Database Release 11gでは、このパラメータ名で保存ポリシーが指定されます。値がMAXの場合、セグメントで使用される領域がMAXSIZEパラメータで指定されるサイズに到達するまで、旧バージョンのLOBデータ・ブロックを保存するように指定されます。MAXSIZEが指定されない場合、MAXはAUTOと同様に機能します。

値がMINの場合、旧バージョンのLOBデータ・ブロックを指定した時間(秒)保存するように指定されます。値がNONEの場合は、保存期間がなく、必要であるとみなされる方法で領域を再利用できることを意味します。値がAUTOの場合は、時間と領域の両方の面で必要性を考慮し、可能なかぎり効率的に記憶域を管理するようにシステムが設定されます。

BasicFiles LOBで使用されるRETENTIONパラメータの詳細は、「BasicFiles LOB用のRETENTIONパラメータ」を参照してください。

MAXSIZE

LOBセグメントで使用可能な領域の量を、指定したサイズに制限します。上限に達した場合、時間要件にかかわらず、必要に応じて、旧バージョンのLOBデータ・ブロックのプールから新規のLOBデータ・ブロックが取得されます。

FREEPOOLS

BasicFiles LOBのFREELISTグループの数を指定します(データベースが自動UNDOモードの場合)。11gの互換モードでは、このパラメータはSecureFiles LOBの作成時に無視されます。

LOGGING、NOLOGGINGまたはFILESYSTEM_LIKE_LOGGING

LOBを作成してLOBへの挿入を実行し、REDOログ・ファイルにログを記録する場合、LOGGINGを指定します。デフォルトはLOGGINGです。

これらの操作をログに記録しない場合は、NOLOGGINGを指定します。

パーティション化されていないオブジェクトでは、この句に指定された値はオブジェクトに関連付けられたセグメントの実際の物理属性です。パーティション・オブジェクトの場合、この句に指定する値は、PARTITION記述でロギング属性を指定しないかぎり、CREATE文(および後続のALTER ... ADD PARTITION文)で指定するすべてのパーティションに関連付けられたセグメントのデフォルトの物理属性となります。

FILESYSTEM_LIKE_LOGGINGは、メタデータのみをログに記録することを意味します。このオプションはBasicFiles LOBでは使用できません。この設定はファイルシステムをジャーナルするメタデータと同様で、障害の平均リカバリ時間を削減できます。SecureFiles LOBのLOGGING設定は、ファイルシステムのデータ・ジャーナルと同様です。LOGGING設定およびFILESYSTEM_LIKE_LOGGING設定は、SecureFiles LOBにより完全なトランザクション・ファイルシステムを提供します。

SecureFiles LOBでは、NOLOGGING設定はFILESYSTEM_LIKE_LOGGINGに内部変換されます。

FILESYSTEM_LIKE_LOGGINGは、サーバー障害の後のデータの完全なリカバリを可能にします。

「BasicFiles LOB用のLOGGING/NOLOGGINGパラメータ」および「読取り一貫性の保証」を参照してください。

注意:
LOBセグメントでは、NOLOGGING設定およびFILESYSTEM_LIKE_LOGGING設定を使用すると、バックアップ操作中にデータがディスクで変更される可能性があります。これにより、読取り非一貫性が発生します。これを防ぐには、LOGGINGをLOB記憶域に設定してLOBセグメントに対する変更をREDOログ・ファイルに保存する必要があります。

FREELISTSまたはFREELIST GROUPS

このパラメータは、パーティション表でNULLセグメントに割り当てられるプロセス空きリストの数、または空きリスト・グループの数をそれぞれ指定します。11gまでの互換性モードでは、これらのパラメータはSecureFiles LOBの作成時に無視されます。

PCTVERSION

このパラメータでは、使用中のBasicFiles LOBデータ領域全体のうち、旧バージョンのBasicFiles LOBデータ・ページが占めることのできる割合を指定します。11gの互換モードでは、このパラメータはSecureFiles LOBの作成時に無視されます。

COMPRESSまたはNOCOMPRESS

COMPRESSオプションでは、SecureFilesインテリジェント圧縮をオンにし、NOCOMPRESSではオフにします。表または索引圧縮を設定しても、SecureFilesインテリジェント圧縮には影響しないことに注意してください。

SecureFilesインテリジェント圧縮を実行するには、Oracle Advanced Compressionオプションのライセンスが必要です。詳細は、『Oracle Databaseライセンス情報』を参照してください。

DEDUPLICATEまたはKEEP_DUPLICATES

DEDUPLICATEオプションではSecureFilesインテリジェント重複除外が有効化され、LOB列、パーティション、またはサブパーティションの複数行で同一のSecureFiles LOBデータにおいて同じデータ・ブロックを共有する必要があることを示します。データベースは同一の内容のSecureFiles LOBを単一のコピーに結合し、記憶域を削減して記憶域管理を簡素化します。このオプションの逆は、KEEP_DUPLICATESです。

SecureFilesインテリジェント重複除外を実行するには、Oracle Advanced Compressionオプションのライセンスが必要です。詳細は、『Oracle Databaseライセンス情報』を参照してください。

ENCRYPTまたはDECRYPT

ENCRYPTオプションでは、SecureFilesインテリジェント暗号化をオンにし、Oracle Transparent Data Encryption(TDE)を使用してすべてのSecureFiles LOBデータを暗号化します。DECRYPTオプションでは、SecureFilesインテリジェント圧縮をオフにします。

SecureFilesインテリジェント暗号化を実行するには、Oracle Advanced Securityオプションのライセンスが必要です。詳細は、『Oracle Databaseライセンス情報』を参照してください。

CREATE TABLE圧縮

この項では、CREATE TABLE文で使用されるSecureFilesインテリジェント圧縮について説明します。この項の内容は次のとおりです。

- CREATE TABLE圧縮での使用上の注意

- CREATE TABLE圧縮の例

CREATE TABLE圧縮での使用上の注意

- SecureFilesインテリジェント圧縮では、表または索引圧縮を有効にできません。同様に、表および索引圧縮でもSecureFilesインテリジェント圧縮を有効にできません。

- LOW、MEDIUMおよびHIGHオプションでは、異なる圧縮レベルを使用できます。圧縮度が高くなればなるほど、待機時間が長くなります。HIGH設定ではより多くの作業が発生しますが、データの圧縮が向上します。デフォルトは、MEDIUMです。
LOW圧縮オプションでは、ファイル圧縮でよく見られるCPUコストの大部分を軽減する非常に軽量の圧縮アルゴリズムが導入されています。LOWレベルで圧縮されたSecureFiles LOBにより、SecureFiles LOB記憶域を効率的に選択できるようになりました。LOWで圧縮されたSecureFiles LOBは、一般的にBasicFiles LOBよりもCPU時間と記憶域を消費せず、ディスクI/Oも減るためアプリケーションの実行を高速化できます。

- 圧縮は、パーティション・レベルで指定できます。lob_storage_clauseでは、、パーティションごとにパーティション化された表の圧縮を指定できます。

- SecureFiles LOB圧縮は、サーバー側で実行され、LOBデータへのランダムな読取りおよび書込みを可能にします。utl_compressなどのクライアント側の圧縮ユーティリティでは、ランダム・アクセスは得られません。

- メソッドDBMS_LOB.SETOPTIONS()を使用して、SecureFiles LOBごとに圧縮を有効および無効化できます。「SETOPTIONS()」を参照してください。

- LOB圧縮は、SecureFiles LOBに対してのみ適用できます。

CREATE TABLE圧縮の例

次の表に、特定の圧縮シナリオでCREATE TABLE文を発行する方法を示します。

例4-2 LOW圧縮を使用したSecureFiles LOB列の作成

CREATE TABLE t1 (a CLOB)
LOB(a) STORE AS SECUREFILE(
COMPRESS LOW
CACHE
NOLOGGING
);

例4-3 MEDIUM(デフォルト)圧縮を使用したSecureFiles LOB列の作成

CREATE TABLE t1 ( a CLOB)
LOB(a) STORE AS SECUREFILE (
COMPRESS
CACHE
NOLOGGING
);

例4-4 HIGH圧縮を使用したSecureFiles LOB列の作成

CREATE TABLE t1 ( a CLOB)
LOB(a) STORE AS SECUREFILE (
COMPRESS HIGH
CACHE
);

例4-5 無効化された圧縮を使用したSecureFiles LOB列の作成

CREATE TABLE t1 ( a CLOB)
LOB(a) STORE AS SECUREFILE (
NOCOMPRESS
CACHE
);

例4-6 1つのパーティションで圧縮を使用したSecureFiles LOB列の作成

CREATE TABLE t1 ( REGION VARCHAR2(20), a BLOB)
LOB(a) STORE AS SECUREFILE (
CACHE
)
PARTITION BY LIST (REGION) (
PARTITION p1 VALUES ('x', 'y')
LOB(a) STORE AS SECUREFILE (
COMPRESS
),
PARTITION p2 VALUES (DEFAULT)
);

CREATE TABLE重複除外

この項では、CREATE TABLE文で使用されるSecureFiles LOB重複除外について説明します。この項の内容は次のとおりです。

- CREATE TABLE重複除外での使用上の注意

- CREATE TABLE重複除外の例

CREATE TABLE重複除外での使用上の注意

- 同一のLOBがある場合、重複除外の対象となります。重複除外を使用可能にすることにより、コピー操作によるデータの重複を回避できます。

- 重複検出は、LOBセグメント内で発生します。パーティション化およびサブパーティション化されたLOB列の場合、パーティションまたはサブパーティションにまたがって重複検出することはできません。

- 重複除外は、パーティション・レベルで指定できます。lob_storage_clauseを使用して、パーティションごとにパーティション化された表を指定できます。

- 重複除外は、SecureFiles LOBに対してのみ適用できます。

- DBMS_LOB.SETOPTIONSを使用して、LOBごとに重複除外を有効化または無効化できます。

CREATE TABLE重複除外の例

次の例に、特定の重複除外シナリオでCREATE TABLE文を発行する方法を示します。

例4-7 重複除外を使用したSecureFiles LOB列の作成

CREATE TABLE t1 ( a CLOB)
LOB(a) STORE AS SECUREFILE (
DEDUPLICATE
CACHE
);

例4-8 無効化された重複除外を使用したSecureFiles LOB列の作成

CREATE TABLE t1 ( a CLOB)
LOB(a) STORE AS SECUREFILE (
KEEP_DUPLICATES
CACHE
);

例4-9 1つのパーティションで重複除外を使用したSecureFiles LOB列の作成

CREATE TABLE t1 ( REGION VARCHAR2(20), a BLOB)
LOB(a) STORE AS SECUREFILE (
CACHE
)
PARTITION BY LIST (REGION) (
PARTITION p1 VALUES ('x', 'y')
LOB(a) STORE AS SECUREFILE (
DEDUPLICATE
),
PARTITION p2 VALUES (DEFAULT)
);

例4-10 1つのパーティションで無効化された重複除外を使用したSecureFiles LOB列の作成

CREATE TABLE t1 ( REGION VARCHAR2(20), ID NUMBER, a BLOB)
LOB(a) STORE AS SECUREFILE (
DEDUPLICATE
CACHE
)
PARTITION BY RANGE (REGION)
SUBPARTITION BY HASH(ID) SUBPARTITIONS 2 (
PARTITION p1 VALUES LESS THAN (51)
lob(a) STORE AS a_t2_p1
(SUBPARTITION t2_p1_s1 lob(a) STORE AS a_t2_p1_s1,
SUBPARTITION t2_p1_s2 lob(a) STORE AS a_t2_p1_s2),
PARTITION p2 VALUES LESS THAN (MAXVALUE)
lob(a) STORE AS a_t2_p2 ( KEEP_DUPLICATES )
(SUBPARTITION t2_p2_s1 lob(a) STORE AS a_t2_p2_s1,
SUBPARTITION t2_p2_s2 lob(a) STORE AS a_t2_p2_s2)
);

CREATE TABLE暗号化

この項では、CREATE TABLE文で使用されるSecureFiles LOB暗号化について説明します。この項の内容は次のとおりです。

- CREATE TABLE暗号化での使用上の注意

- CREATE TABLE暗号化の例

CREATE TABLE暗号化での使用上の注意

- 現在の透過的データ暗号化(TDE)構文を使用して、暗号化がLOBデータ型で有効になります。LOBは、SECUREFILEパラメータを使用して作成する必要があります。

- 暗号化は、ブロック・レベルで実行されます。

- encrypt_algorithmは、暗号化アルゴリズムの名前を示します。有効なアルゴリズムは、AES192(デフォルト)、3DES168、AES128およびAES256です。

- 列の暗号化キーは、(指定されている場合は)PASSWORDから導出されます。

- SALTはLOB暗号化のデフォルトです。NO SALTはサポートされていません。

- LOB列内のすべてのLOBが暗号化されます。

- DECRYPTは、LOBをクリアテキストのままにします。

- LOBは、TDEと同様に列ごとのみで暗号化されます。LOB列内のすべてのパーティションが暗号化されます。

- キー管理により、暗号化または復号化が制御されます。

- LOBの暗号化は、SecureFiles LOBに対してのみ実行できます。

- TDEは、従来のインポートおよびエクスポート・ユーティリティまたはトランスポータブル表領域ベースのエクスポートではサポートされていません。かわりに、暗号化された列でデータ・ポンプ・インポートおよびエクスポート・ユーティリティを使用してください。

関連項目:
TDEを使用したOracle Walletの作成および使用方法は、『Oracle Database Advanced Security管理者ガイド』の「Oracle Wallet Managerの使用方法」を参照してください。

CREATE TABLE暗号化の例

次の表に、特定の暗号化シナリオでCREATE TABLE文を発行する方法を示します。

例4-11 特定の暗号化アルゴリズムを使用したSecureFiles LOB列の作成

CREATE TABLE t1 ( a CLOB ENCRYPT USING 'AES128')
LOB(a) STORE AS SECUREFILE (
CACHE
);

例4-12 すべてのパーティションで暗号化を使用したSecureFiles LOB列の作成

CREATE TABLE t1 ( REGION VARCHAR2(20), a BLOB)
LOB(a) STORE AS SECUREFILE (
ENCRYPT USING 'AES128'
NOCACHE
FILESYSTEM_LIKE_LOGGING
)
PARTITION BY LIST (REGION) (
PARTITION p1 VALUES ('x', 'y'),
PARTITION p2 VALUES (DEFAULT)
);

例4-13 パスワード・キーに基づいた暗号化を使用したSecureFiles LOB列の作成

CREATE TABLE t1 ( a CLOB ENCRYPT IDENTIFIED BY foo)
LOB(a) STORE AS SECUREFILE (
CACHE
);

暗号化オプションを文のLOB_deduplicate_clauseセクションで設定するため、次の例は同じ結果になります。

CREATE TABLE t1 (a CLOB)
LOB(a) STORE AS SECUREFILE (
CACHE
ENCRYPT
IDENTIFIED BY foo
);

例4-14 無効化された暗号化を使用したSecureFiles LOB列の作成

CREATE TABLE t1 ( a CLOB )
LOB(a) STORE AS SECUREFILE (
CACHE DECRYPT
);

SecureFiles LOBを含んだALTER TABLEの使用

ALTER TABLE文またはオンライン再定義を含んだLOB記憶域を、DBMS_REDEFINITIONパッケージを使用して変更できます。『PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

表の作成時に、圧縮、重複除外または暗号化を有効にしておくことをお薦めします。ALTER TABLEを使用してこれらの機能を有効にすると、読取り、変更および書込みコマンドでSecureFiles LOB列全体が変更され、長時間に渡る可能性があるこの操作中に、表のロックが保持されます。

SHRINKオプションはSecureFiles LOBではサポートされていません。

作成時にLOBの暗号化、圧縮または重複除外を有効化していない場合、これらのパラメータに対する変更をディスク領域で効率的に行うために、オンライン再定義を使用して作成後にそれらを有効化することをお薦めします。

例4-1のALTER TABLEのBNFでは、新しいパラメータが導入されています。パラメータの詳細は、「SecureFiles LOB用のCREATE TABLEのパラメータ」を参照してください。

ALTER TABLE文の詳細は、「BasicFiles LOBからSecureFiles LOBへの列の移行」および『Oracle Database SQL言語リファレンス』を参照してください。

例4-15 ALTER TABLE用のBNF

キーワードは太字で表されています。

ALTER TABLE [ schema.]table
[ alter_table_properties
| column_clauses
| constraint_clauses
| alter_table_partitioning
| alter_external_table_clauses
| move_table_clause
]
[ enable_disable_clause
| { ENABLE | DISABLE }
{ TABLE LOCK | ALL TRIGGERS }
[ enable_disable_clause
| { ENABLE | DISABLE }
{ TABLE LOCK | ALL TRIGGERS }
]...
] ;

<column_clauses> ::=
{ { add_column_clause
| modify_column_clause
| drop_column_clause
}
[ add_column_clause
| modify_column_clause
| drop_column_clause
]...
| rename_column_clause
| modify_collection_retrieval
[ modify_collection_retrieval ]...
| modify_LOB_storage_clause
[ modify_LOB_storage_clause ] ...
| alter_varray_col_properties
[ alter_varray_col_properties ]
}

<modify_LOB_storage_clause> ::=
MODIFY LOB (LOB_item) ( modify_LOB_parameters )

<modify_LOB_parameters> ::=
{ storage_clause
| PCTVERSION integer
| FREEPOOLS integer
| REBUILD FREEPOOLS
| LOB_retention_clause
| LOB_deduplicate_clause
| LOB_compression_clause
| { ENCRYPT encryption_spec | DECRYPT }
| { CACHE
| { NOCACHE | CACHE READS } [ logging_clause ]
}
| allocate_extent_clause
| shrink_clause
| deallocate_unused_clause
} ...

SecureFiles LOB用のCREATE TABLEのパラメータ

表4-2は、CREATE TABLE文のパラメータをまとめたものです。

表4-2 ALTER TABLE文のパラメータ

パラメータ

説明

RETENTION

指定した方法でLOBデータの旧バージョンをLOB列に格納するように設定します。

COMPRESSまたはNOCOMPRESS

SecureFiles LOB圧縮をオンまたはオフにします。

DEDUPLICATEまたはKEEP_DUPLICATES

SecureFiles LOB重複除外をオンまたはオフにします。

ENCRYPTまたはDECRYPT

SecureFiles LOB暗号化をオンまたはオフにします。

RETENTION

RETENTIONの変更は、ALTER TABLE文の実行後に作成された領域にのみ影響します。

COMPRESSまたはNOCOMPRESS

LOB圧縮を有効化または無効化します。LOBセグメント内のすべてのLOBが、この新規設定で変更されます。

DEDUPLICATEまたはKEEP_DUPLICATES

DEDUPLICATEオプションを使用して、LOB列内の2つ以上の行の同一LOBデータ間で、同じデータ・ブロックが共有されるように指定できます。データベースは同一の内容のLOBを単一のコピーに結合し、記憶域を削減して記憶域管理を簡素化します。このオプションの逆は、KEEP_DUPLICATESです。

ENCRYPTまたはDECRYPT

LOB暗号化を有効化または無効化します。LOBセグメント内のすべてのLOBが、この新規設定で変更されます。LOBセグメントは、LOB暗号化を有効化または無効化する目的でのみ変更可能です。つまり、ALTERは、暗号化アルゴリズムまたは暗号化キーを更新する目的には使用できません。暗号化アルゴリズムまたは暗号化キーは、ALTER TABLE REKEY構文を使用して更新できます。

ALTER TABLE圧縮

この項では、ALTER TABLE文で使用されるSecureFiles LOB圧縮について説明します。この項の内容は次のとおりです。

- ALTER TABLE圧縮での使用上の注意

- ALTER TABLE圧縮の例

ALTER TABLE圧縮での使用上の注意

- この構文は、LOB列の圧縮モードを変更します。

- DBMS_LOB.SETOPTIONSを使用して、LOBごとに圧縮を有効化または無効化できます。

- 圧縮は、表レベルまたはパーティション・レベルのいずれかで指定できます。

- LOW、MEDIUMおよびHIGHオプションでは、異なる圧縮レベルを使用できます。圧縮度が高くなればなるほど、待機時間が長くなります。HIGH設定ではより多くの作業が発生しますが、データの圧縮が向上します。デフォルトは、MEDIUMです。解凍が簡単で、非常に迅速です。「CREATE TABLE圧縮」を参照してください。

- LOB圧縮は、SecureFiles LOBに対してのみ適用できます。

ALTER TABLE圧縮の例

次の表に、特定の圧縮シナリオでALTER TABLE文を発行する方法を示します。

例4-16 SecureFiles LOB列の変更によるLOW圧縮の有効化

ALTER TABLE t1 MODIFY
LOB(a) (
COMPRESS LOW
);

例4-17 SecureFiles LOB列の変更による圧縮の無効化

ALTER TABLE t1 MODIFY
LOB(a) (
NOCOMPRESS
);

例4-18 SecureFiles LOB列の変更によるHIGH圧縮の有効化

ALTER TABLE t1 MODIFY
LOB(a) (
COMPRESS HIGH
);

例4-19 SecureFiles LOB列の変更による1つのパーティションでの圧縮の有効化

ALTER TABLE t1 MODIFY PARTITION p1
LOB(a) (
COMPRESS HIGH
);

ALTER TABLE重複除外

この項では、ALTER TABLE文に関連するSecureFiles LOB重複除外について説明します。この項の内容は次のとおりです。

- ALTER TABLE重複除外での使用上の注意

- ALTER TABLE重複除外の例

ALTER TABLE重複除外での使用上の注意

ALTER TABLE構文は、LOBレベルの重複除外を有効化または無効化できます。

- この構文は、LOB列の重複除外モードを変更します。

- DBMS_LOB.SETOPTIONSを使用して、LOBごとに重複除外を有効化または無効化できます。

- 重複除外は、表レベルまたはパーティション・レベルで指定できます。複数のパーティション化されたLOBにまたがって重複除外を実行することはできません。

- 重複除外は、SecureFiles LOBに対してのみ適用できます。

ALTER TABLE重複除外の例

次の例に、特定の重複除外シナリオでALTER TABLE文を発行する方法を示します。

例4-20 SecureFiles LOB列の変更による重複除外の無効化

ALTER TABLE t1 MODIFY
LOB(a) (
KEEP_DUPLICATES
);

例4-21 SecureFiles LOB列の変更による重複除外の有効化

ALTER TABLE t1 MODIFY
LOB(a) (
DEDUPLICATE
);

例4-22 SecureFiles LOB列の変更による1つのパーティションでの重複除外の有効化

ALTER TABLE t1 MODIFY PARTITION p1
LOB(a) (
DEDUPLICATE
);

ALTER TABLE暗号化

この項では、ALTER TABLE文で使用されるSecureFiles LOB暗号化について説明します。この項の内容は次のとおりです。

- ALTER TABLE暗号化での使用上の注意

- ALTER TABLE暗号化の例

ALTER TABLE暗号化での使用上の注意

- ALTER TABLEを使用して、SecureFiles LOBのLOB暗号化を有効化または無効化します。この構文では、新しいキーまたはアルゴリズムを使用してLOB列に再度キーを付けることもできます。

- ENCRYPT/DECRYPTオプションは、指定したSecureFiles LOB列内のすべてのLOBの暗号化を有効化または無効化します。

- SALTはLOB暗号化のデフォルトです。NO SALTはサポートされていません。

- DECRYPTオプションは、暗号化された列をクリアテキストの形式に変換します。

- キー管理により、暗号化または復号化が制御されます。

- LOBは、列ごとのみで暗号化されます。パーティション化されたLOBは、すべてのパーティションが暗号化されるか暗号化されないかのいずれかです。

- LOB暗号化は、SecureFiles LOBに対してのみ適用できます。

ALTER TABLE暗号化の例

次の表に、特定の暗号化シナリオでALTER TABLE文を発行する方法を示します。

例4-23 特定のアルゴリズムに基づいた暗号化によるSecureFiles LOB列の変更

3DES168を使用して、LOBの暗号化を有効化します。

ALTER TABLE t1 MODIFY
( a CLOB ENCRYPT USING '3DES168');

これは、3DES168を使用してLOBの暗号化を有効化する2番目の例です。

ALTER TABLE t1 MODIFY LOB(a)
(ENCRYPT USING '3DES168');

例4-24 パスワード・キーに基づいた暗号化によるSecureFiles LOB列の変更

SecureFiles LOB列の暗号化を有効化し、パスワードを使用して暗号化キーを作成します。

ALTER TABLE t1 MODIFY
( a CLOB ENCRYPT IDENTIFIED BY foo);

例4-25 暗号化に再度キーを付けることによるSecureFiles LOB列の変更

新しいキーを使用してLOB列を再暗号化するには、表に再度キーを付けます。

ALTER TABLE t1 REKEY USING '3DES168';

データベース・ファイルシステム・リンク

この項では、データベース・ファイルシステム・リンクについて説明します。この章の内容は、次のとおりです。

- データベース・ファイルシステム・リンクの概要

- データベース・ファイルシステム・リンクの作成

- データベース・ファイルシステム・リンクのコピー

- 表間でのリンク済LOBのコピー

- オンライン再定義およびDBFSリンク

- 透過的読取り

データベース・ファイルシステム・リンクの概要

DBFSリンクには、LOBが格納される通常のセグメントとは別の場所にSecureFiles LOBを透過的に格納し、かわりにこのLOBへのリンクをセグメントに格納する機能が用意されています。このリンクは、アクセスされたときにDBFSを使用してLOBを特定するパスを参照する必要があります。つまり、LOBは、別のファイルシステム、テープ・システム、クラウド、またはDBFSを使用してアクセスできる任意の場所に格納できます。

セグメントの外部に格納されているSecureFiles LOBにユーザーまたはアプリケーションがDBFSリンクを使用してアクセスしようとすると、試行された操作や、LOBを保持しているDBFSストアの特性に応じて、動作が異なる場合があります。

- 読取り:
LOBがデータベース内のローカル領域にまだキャッシュされていない場合、LOBが保持されているDBFSコンテンツ・ストアでPROPNAME_STREAMABLEパラメータの設定に基づいてストリーミング・アクセスが許可されていれば、このコンテンツ・ストアからLOBを直接読み取ることができます。コンテンツ・ストアでストリーミング・アクセスが許可されていない場合、データベース内のローカル領域にLOB全体が最初に読み込まれ、将来のアクセスに備えてここに一定期間格納されます。

- 書込み:
LOBがデータベース内のローカル領域にまだキャッシュされていない場合、LOBは最初にデータベースに読み込まれ、必要に応じて変更されてから、該当するLOBのDBFSリンクに定義されているDBFSコンテンツ・ストアに書き戻されます。

- 削除:
DBFSリンクを介して格納されているSecureFiles LOBが削除されると、DBFSリンクは表から削除されますが、LOB自体はDBFSコンテンツ・ストアから削除されません。または、これは、該当するDBFSコンテンツ・ストアの特性/設定によってはより複雑になります。

データベース・ファイルシステム・リンクでは、SecureFiles LOBをDBFS階層ストア(DBFS HS)と組み合せて使用することにより、階層ストレージ管理(HSM)を実装できます。HSMは、データベースが使用頻度の低いまたは未使用のデータを、高速でコストが高い小さいストレージから、速度が遅く低コストで容量の大きいストレージに移動するためのプロセスです。

図4-1 データベース・ファイルシステム・リンク

データベース・ファイルシステム・リンクの作成

データベース・ファイルシステム・リンクでは、DBFSコンテンツ・パッケージ(DBMS_DBFS_CONTENT)を使用して、データベース・ファイルシステムを作成する必要があります。

Oracleでは、DBFSリンクの作成用に複数の方法を用意しています。

- 指定したDBFSパス名にSecureFiles LOBデータを移動し、新しい場所への参照をLOBに格納できます。LOBおよびDBFSパス名引数を使用してDBMS_LOB.MOVE_TO_DBFS_LINK()をコールすると、指定したDBFS HSMストアが作成され(存在しない場合)、指定したDBFS HSMストアにSecureFiles LOBからデータがコピーされ、SecureFiles LOBからデータが削除され、このLOBを介して後続のアクセス用のファイル・パス名が格納されます。

- 既存のファイルへの参照をコピーまたは作成できます。DBMS_LOB.COPY_DBFS_LINK()をコールし、既存のDBFSリンクからリンクをコピーします。宛先SecureFiles LOBにデータがある場合、そのデータは削除され、そのリンクに対する参照のコピーが宛先SecureFiles LOBに格納されます。

- 指定されたDBFSパス名にリンクのデータが格納されている場合は、DBMS_LOB.SET_DBFS_LINK()をコールします。指定したSecureFiles LOBからデータが削除され、DBFSパス名のリンクが格納されます。

DBFSリンクを作成すると、実行可能な操作およびその実行方法に影響があります。Oracle Database 11gR2より前から存在している一部のDBMS_LOB操作では、LOBがDBFSリンクの場合に例外が発生します。アプリケーションでは、これらをコールする前にDBMS_LOB.COPY_FROM_LINK()をコールして、DBFSリンクをLOBで置き換える必要があります。完了したら、DBMS_LOB.MOVE_TO_DBFS_LINK()を使用して、更新済のLOBを必要に応じてDBFSに戻すことができます。Oracle Database 11gR2より前から存在しているその他のDBMS_LOB操作は、ストリーミングをサポートするファイルシステムにDBFSリンクが存在する場合に、透過的に動作します。ストリーミングがサポートされていないか無効の場合、これらの操作は失敗することに注意してください。

DBFSリンク・ファイルがDBFSインタフェースから直接変更されると、後続のSecureFiles LOBの読取りに変更内容が反映されます。ファイルがDBFSインタフェースからから削除されると、後続の読取りで例外が発生します。

データベースでは、エクスポートおよびインポートの際、DBAがSecureFiles LOB HSMに格納されたデータのすべてを格納することは望まない場合もあります。Oracleには、データベース・ファイルシステム・リンクのみをエクスポートおよびインポートする機能があります。このリンクは完全に修飾された識別子で、SecureFiles LOBに入れられるか、または異なるデータベースのSecureFiles LOBに登録されると、格納済のデータに対するアクセスを提供します。リンクをエクスポートおよびインポートするこの機能は、シンボリック・リンクの共通ファイルシステムの機能性に類似しています。

新しくインポートしたリンクが使用可能なのは、ソース(格納されたデータ)が使用可能である場合、または、インポートしたシステムで最初の取得が行われるまでのみです。格納されたデータベースの保存はアプリケーションが担当します。まだ参照されているデータをアプリケーション・システムがストアから削除すると、参照する側のSecureFiles LOBがこのデータにアクセスしようとしたときに例外がスローされます。Oracleでは、データベース内のデータをDBFSストアに移行した後もキャッシュ済コピーとして保持し続けることもサポートしています。保存ポリシーに準拠してこれらのコピーをパージするかどうかは、アプリケーションによって決まります。

データベース・ファイルシステム・リンクのコピー

API DBMS_LOB.COPY_DBFS_LINK(DSTLOB, SRCLOB, FLAGS)には、リンクされたSecureFiles LOBをコピーする機能が用意されています。デフォルトでは、LOBはこの操作中にDBFS HSMストアから取得されません。これは、DBFSパス名を(ソース側で)エクスポートして(宛先側で)インポートすることで可能となる参照によるコピー操作です。flags引数を使用すると、宛先ではデータベース内にローカル・コピーを持ち、DBFS HSMストア内のLOBデータを参照するよう命令できます。

表間でのリンク済LOBのコピー

CREATE TABLE ... AS SELECT (CTAS)およびINSERT TABLE ... AS SELECT (ITAS)を使用すると、ソース表のSecureFiles LOBに格納されたDBFSリンクが宛先表にコピーされます。

オンライン再定義およびDBFSリンク

オンライン再定義では、再定義される表のSecureFiles LOBで格納されたDBFSリンクがコピーされます。

透過的読取り

DBFSリンクでは、データがデータベースにキャッシュされていない場合でも、リンクされたSecureFiles LOBから読み取ることができます。この操作は、データが実際に格納されているコンテンツ・ストアからデータを読み取り、SecureFiles LOBセグメントからデータが読み取られているかのように、そのデータをユーザーのアプリケーションにストリーミングして戻すことにより実行されます。これにより、DBMS_LOB.COPY_FROM_DBFS_LINK()を最初にコールする必要なく、DBFSリンクのデータにシームレスにアクセスできます。

特定のSecureFiles LOBで透過的読取りを使用できるかどうかは、データが存在するDBFS_CONTENTストアで決定されます。この機能は、DBFS_SFSストアで常に有効で、デフォルトではDBFS_HSストアで有効です。DBFS_HSストアで透過的読取りを無効にするには、PROPNAME_STREAMABLEパラメータをFALSEに設定します。

関連項目:
「DBMS_DBFS_HSの使用例」

SecureFiles LOBの初期化パラメータdb_securefile

初期化パラメータdb_securefileパラメータは、init.oraファイルで設定されます。

パラメータdb_securefileの型はtextです。許容値は、ALWAYS、PERMITTED(デフォルト)NEVERまたはIGNOREです。db_securefileパラメータは動的で、スコープはALTER SYSTEMです。

例4-26 ALTER SYSTEMによるdb_securefileパラメータの設定

ALTER SYSTEM SET db_securefile = 'ALWAYS';

db_securefileパラメータを使用して、データベース管理者はSecureFiles LOBの作成を許可(PERMITTED)、SecureFiles LOBの作成を禁止(NEVER)、SecureFiles LOBの作成は試行するがBasicFiles LOBに戻す(ALWAYS)、またはSecureFiles LOBを禁止して、BasicFiles LOBでSecureFiles LOBオプションを強制することで発生するすべてのエラーを無視(IGNORE)のいずれかを行うことができます。

NEVERが指定された場合、SecureFiles LOBとして指定されたLOBはすべて、BasicFiles LOBとして作成されます。すべてのSecureFiles LOB特定の記憶域オプションおよび機能(圧縮、暗号化、重複除外など)で例外が発生します。指定されていない記憶域オプションには、BasicFiles LOBのデフォルト値が使用されます。

ALWAYSでは、すべてのLOBをSecureFiles LOBとして作成しようとしますが、SECUREFILEパラメータが明示的に指定されていないかぎり、ASSM表領域にないLOBをBasicFiles LOBとして作成します。指定されるBasicFiles LOB記憶域オプションはいずれも無視され、指定されていないすべての記憶域オプションには、SecureFiles LOBのデフォルト値が使用されます。

IGNOREが指定された場合、SECUREFILEキーワードおよびすべてのSecureFiles LOBオプションは無視されます。

互換性およびアップグレード

このドキュメントで説明されているすべての機能は、互換性を11.2.0.0.0以上に設定した場合に有効になります。11.2.0.0.0に設定した後は、ダウングレードはできません。

BasicFiles LOBをSecureFiles LOBにアップグレードする場合、データのアップグレードに通常使用される一般的な方法(CTAS/ITAS、オンライン再定義、エクスポート/インポート、列間でのコピー、またはビューおよび新規列の使用など)を使用する必要があります。これらのソリューションの多くは、入力LOB列のデータで使用されるディスク領域を2回使用する必要があります。ただし、パーティション化して、これらの操作をパーティションごとに実行することにより、必要なディスク領域を減らすことができます。

BasicFiles LOBからSecureFiles LOBへの列の移行

この項では、LOB列の移行の方法について説明します。

SecureFiles LOBへの移行時のREDO領域の生成防止

BasicFiles LOB列の移行処理中にREDO領域が生成されると、パフォーマンスが低下することがあります。移行処理中の表に対するREDOがログに記録されるのは、表にLOGGINGが設定されている場合のみです。

また、BasicFiles LOBからSecureFiles LOBへ変換中の列に対するREDOがログに記録されるのは、SecureFiles LOB列の記憶特性がLOGGINGに指定されている場合のみです。LOB列のロギング設定(LOGGINGまたはNOLOGGING)は、LOBが作成された表領域から継承されます。

移行中のREDO領域の生成を回避するには、NOLOGGING記憶域パラメータを新しいSecureFiles LOB列に指定する必要があります。移行の完了後に、LOGGINGをオンにしてください。

BasicFiles LOBのためのオンライン再定義

BasicFiles LOBからSecureFiles LOBへの移行では、メソッドとしてオンラインの再定義のみをお薦めします。これは表レベルまたはパーティション・レベルで実行できます。

オンライン再定義のメリット

- 表またはパーティションをオフラインにする必要がない。

- パラレルで実行可能。

オンライン再定義のデメリット

- 表またはパーティション全体およびすべてのLOBセグメントに等しい追加の記憶域が必要。

- グローバル索引の再作成が必要。

BasicFiles LOBを含む表の移行時のオンライン再定義の使用

また、オンライン再定義を使用して表を移行できます。オンライン再定義には表をオフラインにする必要がないメリットがありますが、表で使用している領域に等しいか、それよりも大きな追加の空き領域が必要です。例4-27に、オンライン再定義を使用して表を移行する方法を示します。

例4-27 オンライン再定義の例

REM Grant privileges required for online redefinition.
GRANT EXECUTE ON DBMS_REDEFINITION TO pm;
GRANT ALTER ANY TABLE TO pm;
GRANT DROP ANY TABLE TO pm;
GRANT LOCK ANY TABLE TO pm;
GRANT CREATE ANY TABLE TO pm;
GRANT SELECT ANY TABLE TO pm;
REM Privileges required to perform cloning of dependent objects.
GRANT CREATE ANY TRIGGER TO pm;
GRANT CREATE ANY INDEX TO pm;
CONNECT pm
DROP TABLE cust;
CREATE TABLE cust(c_id NUMBER PRIMARY KEY,
c_zip NUMBER,
c_name VARCHAR(30) DEFAULT NULL,
c_lob CLOB
);
INSERT INTO cust VALUES(1, 94065, 'hhh', 'ttt');
-- Creating Interim Table
-- There is no requirement to specify constraints because they are
-- copied over from the original table.
CREATE TABLE cust_int(c_id NUMBER NOT NULL,
c_zip NUMBER,
c_name VARCHAR(30) DEFAULT NULL,
c_lob CLOB
) LOB(c_lob) STORE AS SECUREFILE (NOCACHE FILESYSTEM_LIKE_LOGGING);
DECLARE
col_mapping VARCHAR2(1000);
BEGIN
-- map all the columns in the interim table to the original table
col_mapping :=
'c_id c_id , '||
'c_zip c_zip , '||
'c_name c_name, '||
'c_lob c_lob';
DBMS_REDEFINITION.START_REDEF_TABLE('pm', 'cust', 'cust_int', col_mapping);
END;
/
DECLARE
error_count pls_integer := 0;
BEGIN
DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS('pm', 'cust', 'cust_int',
1, TRUE,TRUE,TRUE,FALSE, error_count);
DBMS_OUTPUT.PUT_LINE('errors := ' || TO_CHAR(error_count));
END;
/
EXEC DBMS_REDEFINITION.FINISH_REDEF_TABLE('pm', 'cust', 'cust_int');
-- Drop the interim table
DROP TABLE cust_int;
DESC cust;
-- The following insert statement fails. This illustrates
-- that the primary key constraint on the c_id column is
-- preserved after migration.
INSERT INTO cust VALUES(1, 94065, 'hhh', 'ttt');
SELECT * FROM cust;

パラレル・オンライン再定義

パラレル実行に十分なリソースがあるシステムでは、BasicFiles LOB列のSecureFiles LOB列への再定義は、次の条件下でパラレルに実行できます。

- 挿入先の表がパーティション化されていない場合:
挿入先の表にLOB列を格納するために使用されるセグメントが、自動セグメント領域管理(ASSM)が使用可能になっている(現在のデフォルトおよびSecureFiles LOBの要件)ローカル管理表領域に属している。

1つのLOB列から1つのLOB列への単純なマッピングが存在し、挿入先の表には1つのLOB列のみがある。

- 挿入先の表がパーティション化されている場合:
パーティション化に通常使用されるパラレル実行方法が適用されます。挿入先の表がパーティション化されている場合、オンライン再定義がパラレルに実行されます。

オンライン再定義をパラレル実行するには、前の項の例4-27「オンライン再定義の例」の接続文の後に次の文を追加してください。

ALTER SESSION FORCE PARALLEL DML;

SecureFiles LOBおよびDBFS用のPL/SQLパッケージ

この項では、SecureFiles LOBで使用されるPL/SQLパッケージについて説明します。

この項の内容は次のとおりです。

- DBMS_LOBパッケージ

- DBMS_SPACEパッケージ

DBMS_LOBパッケージ

LOBは重複除外、暗号化および圧縮に関するLOB列設定を継承し、LOBロケータAPIを使用して特定のLOBインスタンスに構成することもできます。LOB設定の構成にLONG APIが使用できないことに注意してください。次の項は、これらの機能に対応するためPL/SQL DBMS_LOBパッケージに行われた追加および変更を説明します。詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』のDBMS_LOBパッケージに関する項を参照してください。

表4-3に示すCONSTANT PLS_INTEGER型の定数では、DBFSリンクのインタフェースをサポートしています。PL/SQL DBMS_LOBパッケージで使用される定数の詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

表4-3 一部のDBMS_LOB定数

定数

説明

DBFS_LINK_NEVER

DBFSリンクの状態値

DBFS_LINK_YES

DBFSリンクの状態値

DBFS_LINK_NO

DBFSリンクの状態値

DBFS_LINK_CACHE

COPY_DBFS_LINK()およびMOVE_DBFS_LINK()で使用されるフラグ。

DBFS_LINK_NOCACHE

COPY_DBFS_LINK()およびMOVE_DBFS_LINK()で使用されるフラグ。

DBFS_LINK_PATH_MAX_SIZE

DBFSパラメータの最大長(1024)。

CONTENTTYPE_MAX_SIZE

コンテンツ・タイプの最大1バイトのASCII文字(128)。

表4-4は、PL/SQLパッケージDBMS_LOBのメソッドに加えられた変更をまとめたものです。SecureFiles LOBパラダイムをサポートできるように、既存のメソッドの多くが強化されており、複数の新しいメソッドが追加されています。

Oracle Database 11gR2より前から存在している一部のDBMS_LOB操作では、LOBがDBFSリンクの場合に例外が発生することに注意してください。アプリケーションでは、これらをコールする前にCOPY_FROM_LINK()をコールして、DBFSリンクをLOBで置き換える必要があります。完了したら、MOVE_TO_DBFS_LINK()を使用して、更新済のLOBを必要に応じてDBFSに戻すことができます。Oracle Database 11gR2より前から存在しているその他のDBMS_LOB操作は、ストリーミングをサポートするファイルシステムにDBFSリンクが存在する場合に、透過的に動作します。ストリーミングがサポートされていないか無効の場合、これらの操作は失敗することに注意してください。

表4-4 DBMS_LOBメソッド

メソッド

説明

GETOPTIONS()

特定のLOBの設定済のオプションを取得します。

SETOPTIONS()

特定のLOBで新しいオプションを設定します。

ISSECUREFILE()

LOBがSecureFiles LOBかどうかを判別します。

MOVE_TO_DBFS_LINK()

指定したLOBデータをデータベースからDBFS HSMストアに移動します。

COPY_FROM_DBFS_LINK()

指定したLOBデータをDBFS HSMストアからデータベースにコピーします。

COPY_DBFS_LINK()

既存のDBFSを新しいLOBにコピーします。

GET_DBFS_LINK()

LOBのDBFSパス名を戻します。

SET_DBFS_LINK()

LOBとDBFSパス名を関連付けます。

GET_DBFS_LINK_STATE()

LOBのリンクの状態を戻します。

DBFS_LINK_GENERATE_PATHNAME()

DBFSリンクを作成するための一意のファイル・パス名を戻します。

SETCONTENTTYPE()

LOBデータのコンテンツ・タイプ文字列を戻します。

GETCONTENTTYPE()

LOBデータのコンテンツ・タイプ文字列を取得します。

APPEND()

ソースLOBのコンテンツを宛先LOBに追加します。

COMPARE()

2つのLOBの全体または一部を比較します。

CONVERTTOBLOB()

CLOBまたはNCLOBの文字データを指定したキャラクタ・セットに変換し、バイナリ形式で宛先BLOBに書き込みます。

CONVERTTOCLOB()

BLOBのバイナリ・データを指定したキャラクタ・セットに変換し、文字形式で宛先CLOBまたはNCLOBに書き込みます。

COPY()

ソースLOBの全体または一部を宛先LOBにコピーします。

ERASE()

LOBの全体または一部を消去します。

FRAGMENT_DELETE()

LOBの指定したフラグメントを削除します。

FRAGMENT_INSERT()

データのフラグメントをLOBに挿入します。

FRAGMENT_MOVE()

LOBのフラグメントをLOB内の場所間で移動します。

FRAGMENT_REPLACE()

LOBのフラグメントを新しいデータで置き換えます。

LOADBLOBFROMFILE()

BFILEデータをBLOBにロードします。

LOADCLOBFROMFILE()

BFILEデータをCLOBにロードします。

LOADFROMFILE()

BFILEデータをLOBにロードします。

READ()

LOBからデータを読み取ります。

SUBSTR()

LOBのフラグメントを戻します。

TRIM()

指定した長さまでLOBを切り捨てます。

WRITE()

LOBにデータを書き込みます。

WRITEAPPEND()

データをLOBの終わりに追加します。

GETOPTIONS()

この関数では、各SecureFiles LOBの圧縮、重複除外および暗号化の設定を取得します。オプションの型に基づいて事前定義された定数に対応する整数が戻されます。

これらの機能が無効になっているSecureFiles LOB列全体では、圧縮または重複除外をオンまたはオフに切り替えることはできません。

この関数の詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。対応するOCI LOB関数OCILobGetContentType()の詳細は、『Oracle Call Interfaceプログラマーズ・ガイド』を参照してください。

SETOPTIONS()

このプロシージャは圧縮、重複除外および暗号化機能を設定します。各LOBベースの機能の設定を可能にし、デフォルトLOB設定を上書きします。このコールでは、変更を永続化させる際にサーバーへのラウンド・トリップが発生します。

これらの機能が有効になっていないSecureFiles LOB列では、圧縮または重複除外をオンまたはオフに切り替えることができません。GETOPTIONS() およびSETOPTIONS()は、個々のSecureFiles LOBに対して動作します。特定のSecureFiles LOBで機能をオフに切り替えたり、SETOPTIONS()によってすでにオフにされた機能をオンに切り替えはできますが、表の作成時にSecureFiles LOBに指定されていないオプションをオンに切り替えることはできません。

この関数の詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。対応するOCI LOB関数OCILobSetContentType()の詳細は、『Oracle Call Interfaceプログラマーズ・ガイド』を参照してください。

ISSECUREFILE()

このファンクションは、渡されるLOBロケータがSecurefiles LOB用の場合にTRUEを戻します。そうでなければ、FALSEを戻します。

この関数の詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

MOVE_TO_DBFS_LINK()

MOVE_TO_DBFS_LINK()では、指定したLOBデータを(データベースから)DBFS HSMストアに配置します。LOBが格納済の場合、MOVE_TO_DBFS_LINK()は移動が正常に終了したかのように暗黙的に返されます。この場合、DBFS_LINK_NOCACHEが指定されるか、デフォルトのflags値が設定されると、LOBデータはデータベースから削除されます。

同じflagsを持つ同じLOBでMOVE_TO_DBFS_LINK()を複数回コールしても効果はありません。格納済のLOBでMOVE_TO_DBFS_LINK()をコールすると、flagsの設定に応じて、LOBはキャッシュ(MOVE_TO_DBFS_LINK_CACHE)されるか、削除(DBFS_LINK_NOCACHE)されます。

詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

COPY_FROM_DBFS_LINK()

COPY_FROM_DBFS_LINK()では、指定したLOBデータをDBFS HSMストアからデータベースに取得します。

LOBが正常に取得されると、COPY_FROM_DBFS_LINKでは暗黙的に成功が返されます。

詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

COPY_DBFS_LINK()

COPY_DBFS_LINK()では、取得を中断することなく宛先LOBがソースLOBと同じDBFSパス名を参照します。オプションのフラグ・パラメータにより、LOBが宛先に読み取られます。

詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

GET_DBFS_LINK()

GET_DBFS_LINK()では、指定されたLOBのDBFSパス名を戻します。

詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

SET_DBFS_LINK()

SET_DBFS_LINK: 指定されたLOBを指定されたDBFSパス名にリンクします。

GET_DBFS_LINK_STATE()

GET_DBFS_LINK_STATEは、指定されたLOBに対する現行のリンクの状態を取得します。

指定されたLOBの現行のリンクの状態を戻します。LOBがリンクされていない場合、状態はDBFS_LINK_NEVERに設定されます。LOBがリンクされている場合、状態はDBFS_LINK_YESに設定されます。LOBがDBFS HSMストアから取得されている場合、状態はDBFS_LINK_NOに設定されます。LOBがリンク済だがデータがデータベースに残っている場合、cachedはTRUEに設定されます。データがリンクの作成後に削除された場合、cachedはFALSEに設定され、状態がDBFS_LINK_NEVERの場合はNULLに設定されます。pathname引数は、DBFS HSMストアでLOBの識別に使用されるDBFSパス名に設定されます。

詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

DBFS_LINK_GENERATE_PATHNAME()

DBFS_LINK_GENERATE_PATHNAME()では、DBFSリンクを作成するための一意のファイル・パス名を戻します。

アーカイブに使用できるグローバルに一意なファイル・パス名を戻します。これは、このファンクションの各種LOBまたはLOBの各バージョンを対象としたすべてのコールで、グローバルに一意であることが保証されています。同一のLOBおよびバージョンでは、常に同じ名前になります。

SETCONTENTTYPE()

SETCONTENTTYPE()では、LOB内のデータに対するコンテンツ・タイプ文字列を設定します。

SecureFiles LOBに関連付けられた既存のcontenttypeをクリアするには、contenttypeを空の文字列に設定してSETCONTENTTYPE()を呼び出します。

詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

GETCONTENTTYPE()

GETCONTENTTYPE()は、LOB内のデータに対するコンテンツ・タイプ文字列が設定されている場合に取得します。

SecureFiles LOBにcontenttypeが関連付けられていない場合、GETCONTENTTYPE()はNULLを戻します。

詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

APPEND()

リンクされたSecureFiles LOBでAPPEND()がコールされると、例外が発生します。

詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

COMPARE()

DBFSリンクであるLOBでCOMPARE()がコールされると、リンクされたLOBは、可能な場合はDBFSからストリーミングされ、可能でない場合は例外が発生します。

詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

CONVERTTOBLOB()

CONVERTTOBLOBがコールされ、ソースLOBがリンク済の場合、例外が発生します。

詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

CONVERTTOCLOB()

CONVERTTOCLOBがコールされ、ソースLOBがリンク済の場合、例外が発生します。

詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

COPY()

ソースLOBがリンクされると、データは、可能な場合はDBFSからストリーミングされ、可能でない場合は例外が発生します。宛先LOBがリンクされると、例外が発生します。

詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

ERASE()

削除するLOBがリンクされると、例外が発生します。

詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

FRAGMENT_DELETE()

LOBがリンクされると、例外が発生します。

詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

FRAGMENT_INSERT()

LOBがリンクされると、例外が発生します。

詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

FRAGMENT_MOVE()

LOBがリンクされると、例外が発生します。

詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

FRAGMENT_REPLACE()

LOBがリンクされると、例外が発生します。

詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

LOADBLOBFROMFILE()

BLOBがリンクされると、例外が発生します。

詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

LOADCLOBFROMFILE()

CLOBがリンクされると、例外が発生します。

詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

LOADFROMFILE()

LOBがリンクされると、例外が発生します。

詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

READ()

LOBがリンクされると、データは、可能な場合はDBFSからストリーミングされ、可能でない場合は例外が発生します。

詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

SUBSTR()

LOBがリンクされると、データは、可能な場合はDBFSからストリーミングされ、可能でない場合は例外が発生します。

詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

TRIM()

LOBがリンクされると、例外が発生します。

詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

WRITE()

LOBがリンクされると、例外が発生します。

詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

WRITEAPPEND()

LOBがリンクされると、例外が発生します。

詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

DBMS_SPACEパッケージ

DBMS_SPACE PL/SQLパッケージでは、セグメントの増加および領域の要件を分析できます。

SPACE_USAGE()

既存のSPACE_USAGEプロシージャがオーバーロードされ、LOB領域使用量に関する情報が戻されます。これは、LOBセグメント内のすべてのLOBによって使用されている、ブロック内のディスク領域容量を戻します。このプロシージャは、自動セグメント領域管理で作成された表領域でのみ使用できます。詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

5 Oracle Database File Systemの概要

この章の内容は次のとおりです。

- データベース・ファイルシステムを使用する理由

- Oracle Database File System(DBFS)の概要

データベース・ファイルシステムを使用する理由

Oracle Databaseは一般的に、CAD、医療イメージ、請求書イメージ、文書などを含むデータベース・アプリケーションと密接に関係するファイルの格納に使用されてきました。アプリケーションはSQL標準データ型BLOB(およびCLOB)を使用して、ファイルをデータベースに格納します。Oracle Databaseは、従来のファイルシステムより優れたセキュリティ、可用性、堅牢性、トランザクションおよびスケーラビリティを提供します。データベースにファイルが格納される場合、バックアップされ、Data Guardを使用して障害時リカバリ・サイトと同期され、データベースのリレーショナル・データとともにリカバリされます。これにより、データベースにファイルを格納することが多くのアプリケーションにとって魅力あるオプションとなりました。

Oracle Database 11gでは、Oracle SecureFiles LOBが導入されました。SecureFiles LOBでは、従来のファイルシステムのパフォーマンスに匹敵する高いパフォーマンスのファイル・ストレージが可能です。また、SecureFiles LOBを使用すると、ファイルの圧縮、重複除外および暗号化の拡張機能がサポートされます。SecureFiles LOBでは、BLOB(およびCLOB)への下位互換性が維持され、BLOBに対して記述されたアプリケーションは、前述の機能を含めてSecureFiles LOBに対しても透過的に動作します。

データベース・ファイルシステム(DBFS)は、ファイルを格納するデータベースの利点と、リレーショナル・データを効率的に管理するデータベースの強度を活用して、データベースに格納されたファイルに対する標準のファイルシステム・インタフェースを実装します。このインタフェースを使用すると、BLOBおよびCLOBプログラム・インタフェースを使用するよう特に記述されたプログラムに制限されずに、データベースにファイルを格納できるようになります。これで、ファイルに対して動作する任意のオペレーティング・システム(OS)プログラムを使用して、データベース内のファイルに透過的にアクセスできるようになります。たとえば、ETL(抽出、変換およびロード)ツールは、ステージング・ファイルを透過的にデータベースに格納します。

Oracle Database File System(DBFS)の概要

Oracle Database File System(DBFS)により、データベース表に格納されるファイルおよびディレクトリの上部に、標準ファイルシステム・インタフェースが作成されます。DBFSは、ローカル・ファイルシステムに類似した共有ネットワーク・ファイルシステムを提供する点で、NFSに似ています。NFSと同様、サーバー・コンポーネントおよびクライアント・コンポーネントがあります。

DBFSでは、サーバーはOracle Databaseです。ファイルは、SecureFiles LOBとしてデータベース表に格納されます。PL/SQLプロシージャのセットにより、作成、オープン、読取り、書込みおよびリスト・ディレクトリなどのファイルシステム・アクセスのプリミティブが実装されます。データベース内のファイルシステムの実装は、DBFSコンテンツ・ストアと呼ばれます。DBFSコンテンツ・ストアにより、すべてのデータベース・ユーザーは、クライアントによってマウント可能な1つ以上のファイルシステムを作成できます。それぞれのファイルシステムには、ファイルシステム・コンテンツを保持する専用の表があります。

関連項目:
コンテンツ・ストアの詳細は、第7章「DBFSコンテンツAPI」を参照してください。

図5-1 Oracle Database File System(DBFS)

DBFSコンテンツAPIは、DBFSのコアに位置するOracle RDBMSのPL/SQLインタフェースです。ユーザー定義記憶域を含む異なるタイプの記憶域をサポートできるプログラム・インタフェースを含みます。

DBFS SecureFilesストアは、ファイルシステム・データを格納するためのSecureFiles LOB列を含む表を利用するDBFSコンテンツ・ストアです。POSIXに類似した機能を実装します。

DBFS階層ストアは、Oracle Recovery Manager(RMAN)でサポートされている任意のテープ・ストレージ単位やクラウド・ストレージ・システムへのファイルの書込みが可能なDBFSコンテンツ・ストアです。現在のところ、サポートされているクラウド・ストレージ・システムはAmazon S3のみです。

DBFSには、dbfs_clientと呼ばれる各ファイルシステム・クライアント・マシンで実行されるクライアント・コンポーネントがあります。dbfs_clientは、コマンド・インタフェースを提供し、ネットワーク上の任意のホストからデータベースとの間で簡単にファイルをコピーできます。これは、シェル・ユーティリティlsおよびrcpと類似する方法で、リストやコピーなどの簡単なファイルシステム・コマンドを実装します。コマンド・インタフェースにより、DBFSのOSマウントを必要とせずにデータベースへの直接接続が確立されます。

Linuxの場合、dbfs_clientには、データベースに格納されたファイルへの透過的なアクセスを使用してファイルシステムのマウント・ポイントを実装するFUSE(Filesystem in User Space)カーネル・モジュールを利用するマウント・インタフェースがあり、Linuxカーネルの変更を必要としません。FUSEカーネル・モジュールからの標準のファイルシステム・コールを受信し、それをDBFSコンテンツ・ストア内のPL/SQLプロシージャに対するOCIコールに変換します。

また、DBFSストア内のファイルは、PL/SQLインタフェースを介して直接データベース・アプリケーションでアクセスできます。PL/SQLインタフェースにより、データベース・トランザクションと読取り一貫性が、リレーショナルおよびファイル・データをまたいで可能になります。

DBFSでは、DBFSリンクを使用して既存の表から他のストレージにSecureFilesを移行できます。SecureFiles LOB DBFSリンクの詳細は、「SecureFiles LOBおよびDBFS用のPL/SQLパッケージ」を参照してください。

6 DBFSファイルシステム・クライアント

この章では、DBFSファイルシステムの実装、アクセスおよび管理について説明します。

注意:
Solaris 11 SRU7におけるOracle Databaseリリース11.2.0.3以降から、dbfs_clientをマウント・モードで実行できます。LinuxプロセスおよびSolarisプロセス間固有の差異を理解するには、「Solaris 11 SRU7におけるOracle Databaseリリース11.2.0.3」を参照してください。

この章の内容は次のとおりです。

- DBFSのインストール

- DBFSマウント・インタフェース

- DBFSコマンド・インタフェースの使用

- DBFS管理

DBFSのインストール

この項では、DBFSのインストールに必要な手順について説明します。

この項の内容は次のとおりです。

- DBFSの前提条件

- FUSEのインストール(Linuxのみ)

- DBFSインストール・ホーム

- ファイルシステムの作成

- ファイルシステムの削除

DBFSの前提条件

- dbfs_clientは、DBFSコマンド・インタフェースを使用して、直接のRDBMSクライアントとしてLinux、Linux.X64、Solaris、Solaris64、AIX、HPUXおよびWindowsプラットフォームでのみ使用できます。

- dbfs_clientホストに、Oracleクライアント・ライブラリがインストールされている必要があります。

- Oracle Databaseリリース11.2.0.1以降、およびSolaris 11 SRU7上ではOracle Database 11.2.0.3以降で、dbfs_clientプログラムを使用してLinuxおよびLinux X64プラットフォームのDBFSファイル・システムをマウントできます。Solaris互換性に関する詳細は、「Solaris 11 SRU7におけるOracle Databaseリリース11.2.0.3」を参照してください。
Linuxでは、次も必須です。

- dbfs_clientホストには、FUSEを構成および作成するためにkernel-develパッケージをインストールする必要があります。

- dbfs_clientホストに、FUSE Linuxパッケージをインストールする必要があります。

- fuseという名前のグループを作成し、dbfs_clientを実行しているユーザー名をfuseグループのメンバーにする必要があります。

Solaris 11 SRU7の違いおよび追加要件については、「Solaris 11 SRU7におけるOracle Databaseリリース11.2.0.3」を参照してください。

FUSEのインストール(Linuxのみ)

- 使用するLinuxのリリースに一致するkernel-develパッケージをLinuxディストリビュータからダウンロードします。

- FUSE 2.7.4パッケージを、http://fuse.sourceforge.net/からダウンロードします。

- kernel-develパッケージをインストールします。次に例を示します。

# rpm -i kernel-devel-2.6.18-8.el5.i686.rpm

- カーネル・ディレクトリを指定します。通常、カーネル・ディレクトリは、/usr/src/kernels/`uname -r`-`uname -p`です。

- FUSEをインストールします。

$ tar -xzvf fuse-2.7.4.tar.gz
$ cd [fuse_src_dir]
$ ./configure --prefix=/usr --with-kernel=[your kernel dir]
$ make
$ sudo su
# make install
# /sbin/depmod
# /sbin/modprobe fuse
# chmod 666 /dev/fuse
# echo "/sbin/modprobe fuse" >> /etc/rc.modules

DBFSインストール・ホーム

DBFSインストール・ホームには、コンテンツ・ストアのSQLスクリプト(.plb拡張子)およびdbfs_client実行可能ファイルが含まれます。

ファイルシステムの作成

ファイルシステムを作成するには、データベース・ユーザーにGRANT CONNECT、CREATE SESSION、RESOURCE、CREATE TABLE、CREATE PROCEDUREおよびDBFS_ROLEの権限が少なくとも必要です。

DBFS_ROLE権限を持つユーザーとしてログインし、dbfs_create_filesystem.sqlを実行してファイルシステムを作成します。

$ sqlplus @$ORACLE_HOME/rdbms/admin/dbfs_create_filesystem.sql tablespace_name
file_system_name

次の例では、表領域dbfs_tbspcにstaging_areaというファイルシステムを作成します。表領域は事前に作成しておく必要があります。

$ sqlplus @$ORACLE_HOME/rdbms/admin/dbfs_create_filesystem.sql dbfs_tbspc
staging_area

DBFSファイルシステムを作成するために、dbfs_create_filesystem_advanced.sqlも使用できます。このスクリプトにより、ユーザーはファイルシステムに使用される圧縮、暗号化、重複除外などの記憶域オプションをさらに制御できるようになります。

注意:
Oracle Databaseリリース11.2.0.3以降、DBFSはデフォルトでファイルシステムを非パーティションとして作成します。

ファイルシステムの削除

dbfs_drop_filesystem.sqlを実行して、ファイルシステムを削除します。

$ sqlplus @$ORACLE_HOME/rdbms/admin/dbfs_drop_filesystem.sql  file system name

DBFSマウント・インタフェース

この項では、DBFSファイル・システムをマウントする方法について説明します。この内容は、「Solaris 11 SRU7におけるOracle Databaseリリース11.2.0.3」で説明されるSolaris 11 SRU7との相違とともに、LinuxおよびSolarisに適用されます。

この項の内容は次のとおりです。

- DBFSストアのマウント

- Linuxでのファイルシステムのアンマウント

- マウントされたファイルシステムの制限事項

- Linuxでのfstabユーティリティを使用したDBFSのマウント

- Solaris 11 SRU7におけるOracle Databaseリリース11.2.0.3

DBFSストアのマウント

dbfs_clientプログラムを実行して、DBFSストアをマウントします。Oracleクライアント・ライブラリへのパスがLD_LIBRARY_PATHに正しく指定されていることを確認してから、このプログラムをコールする必要があります。ファイルシステムがアンマウントされるまで、dbfs_clientプログラムは戻されません。

パスワードを安全に指定する方法の詳細は、「DBFSクライアントでのOracle Walletの使用」を参照してください。

dbfs_clientコマンドの構文は次のとおりです。

dbfs_client db_user@db_server [-o option_1 -o option_2 ...] mount_point

必須のパラメータは次のとおりです。

- db_userは、DBFSコンテンツ・ストア・ファイルシステムを所有するデータベース・ユーザーの名前です。

- db_serverは、Oracle Databaseサーバーの有効な接続文字列(hrdb_host:1521/hrserviceなど)です。

- mount_pointは、データベース・ファイルシステムがマウントされるパスです。データベース・ユーザーによって所有されるすべてのファイルシステムはマウント・ポイントで表示されることに注意してください。

オプションは次のとおりです。

- direct_ioはLinuxページ・キャッシュを使用しないため、大きいファイルの場合にパフォーマンスが向上します。このオプションでは、ファイルシステムのプログラムを実行できません。DBFSがETLステージング領域として使用される場合は、このオプションをお薦めします。

- walletは、DBFSクライアントをバックグラウンドで実行します。証明書を取得できるようにウォレットを設定する必要があります。

- failoverは、データを損失せずに残存のデータベース・インスタンスにDBFSクライアントをフェイルオーバーします。小さいファイルでは特に、書込みでパフォーマンスのコストが予想されます。

- allow_rootでは、rootユーザーによるファイルシステムへのアクセスを許可します。このオプションでは、/etc/fuse.conf構成ファイルにuser_allow_otherパラメータを設定する必要があります。

- allow_otherでは、他のユーザーによるファイルシステムへのアクセスを許可します。このオプションでは、/etc/fuse.conf構成ファイルにuser_allow_otherパラメータを設定する必要があります。

- rwは、読取り/書込みとしてファイルシステムをマウントします(デフォルト設定)。

- roは、読取り専用としてファイルシステムをマウントします。ファイルを変更することはできません。

- trace_level=nでは、トレース・レベルを設します。トレース・レベルは次のとおりです。

1. DEBUG

2. INFO

3. WARNING

4. ERROR

5. CRITICAL(デフォルト設定)

- trace_file file_name |'syslog'では、トレース・ログ・ファイルを指定します。

ファイルシステムをマウントする前に、Oracle Walletを作成し、該当のDBFSデータベース・ユーザーに証明書を割り当てる必要があります。詳細は、「DBFSクライアントでのOracle Walletの使用」を参照してください。

例6-1 ファイルシステムのマウント

1. rootユーザーとしてログインします。

2. 新しいライブラリ・パスを追加します。

# echo "/usr/local/lib" >> /etc/ld.so.conf.d/usr_local_lib.conf

3. ディレクトリをlibに変更し、libclntsh.so.11.1およびlibnnz11.soライブラリに対して次のシンボリック・リンクを作成します。

# cd /usr/local/lib
# ln -s $ORACLE_HOME/lib/libclntsh.so.11.1
# ln -s $ORACLE_HOME/lib/libnnz11.so

4. libfuse.soを検索し、このライブラリのシンボリック・リンクを作成します。

# locate libfuse.so
determined_path/libfuse.so
# ln –s determined_path/libfuse.so

5. ldconfigを実行し、新しいシンボリック・リンクのリンクおよびキャッシュを作成します。

# ldconfig

6. dbfs_clientのシンボリックリンクをmount.dbfsとして/sbinに作成します。

# ln -s $ORACLE_HOME/bin/dbfs_client /sbin/mount.dbfs

7. 管理ユーザーとしてログインします。(次の手順はrootユーザーとして実行しないことをお薦めします。)

8. DBFSストアをマウントします。

% dbfs_client @/dbfsdb -o wallet,rw,user,direct_io /mnt/dbfs

9. (オプション)前述の手順が成功したかどうかをテストするには、dbfsディレクトリを表示します。

# ls /mnt/dbfs

例6-2 コマンド・プロンプトでパスワードを使用したファイルシステムのマウント

コマンド・プロンプトにパスワードを入力し、dbfs_clientを使用してファイルシステムをマウントするには、次のようにします。

$ dbfs_client ETLUser@DBConnectString /mnt/dbfs
password: xxxxxxx

例6-3 ファイルから読み込まれたパスワードを使用したファイルシステムのマウント

次の例では、ファイルシステムをマウントし、ターミナルを解放します。ここでは、パスワードをファイルから読み取ります。

$ nohup dbfs_client ETLUser@DBConnectString /mnt/dbfs < passwordfile.f &
$ ls -l /mnt/dbfs
drwxrwxrwx 10 root root 0 Feb  9 17:28 staging_area

Linuxでのファイルシステムのアンマウント

ファイルシステムをアンマウントするには、fusermountを実行します。

$ fusermount -u <mount point>

マウントされたファイルシステムの制限事項

DBFSでは、ioctl、ロック、libaioによる非同期IO、O_DIRECTファイル・オープン、ハード・リンク、パイプ、およびその他の特定のファイル・モードを除く、ほとんどのファイルシステム操作がサポートされます。メモリー・マップ・ファイルは、共有書込み可能モードを除いてサポートされます。パフォーマンス上の理由から、DBFSでは、ファイル・データまたはその属性の読取りのたびにファイル・アクセス時間を更新することはありません。

direct_ioオプションが指定されている場合、DBFSマウント・ファイルからプログラムを実行することはできません。

NFSまたはSambaを使用してDBFSファイルシステムをエクスポートできません。

Linuxでのfstabユーティリティを使用したDBFSのマウント

Linuxでは一般に、ファイルシステムは、fstabユーティリティを使用して構成されます。/etc/fstabでDBFSをマウントするには、Oracle Walletを認証に使用する必要があります。次の操作をrootユーザーとして実行します。

LinuxでのfstabでDBFSをマウントする手順:

1. rootユーザーとしてログインします。

2. ユーザーをユーザーrootに変更し、dbfs_clientのグループをグループfuseに変更します。

# chown root.fuse $ORACLE_HOME/bin/dbfs_client

3. dbfs_clientでsetuidビットを設定し、このユーザーとグループのみにexecute権限を制限します。

# chmod u+rwxs,g+rx-w,o-rwx dbfs_client

4. dbfs_clientのシンボリックリンクをmount.dbfsとして/sbinに作成します。

$ ln -s $ORACLE_HOME/bin/dbfs_client /sbin/mount.dbfs

5. fuseという名前の新しいLinuxグループを作成します。

6. DBFSクライアントを実行しているLinuxユーザーをfuseグループに追加します。

7. 次の行を/etc/fstabに追加します。

/sbin/mount.dbfs#db_user@db_server mount_point fuse rw,user,noauto 0 0

次に例を示します。

/sbin/mount.dbfs#/@DBConnectString /mnt/dbfs fuse rw,user,noauto 0 0

8. Linuxユーザーは、Linuxの標準のmountコマンドを使用して、DBFSファイルシステムをマウントできます。次に例を示します。

$ mount /mnt/dbfs

現在、FUSEはautomountをサポートしていません。

Solaris 11 SRU7におけるOracle Databaseリリース11.2.0.3

Solaris 11 SRU7におけるOracle Databaseリリース11.2.0.3以降から、Solaris上にlibfuseをインストールしてdbfs_clientをマウント・モードで実行できます。この項では「DBFSのインストール」の項および「DBFSマウント・インタフェース」の項に説明されているLinuxプロシージャとは別に実行が必要な項目を説明します。

Solaris 11 SRU7以降でのFUSEのインストール

dbfs_clientをSolaris 11 SRU7以降のマウント・クライアントとして使用するには、プロンプトでpkg info libfuseを実行してlibfuseパッケージがインストールされていることを確認してください。行またはエラーが戻されなければ、次の手順を実行しlibfuseをインストールしてください。

rootとしてinstallコマンドを実行します。

# pkg install libfuse

verifyコマンドを実行し、libfuseが正常にインストールされていることを確認します。成功した場合は出力がありません。

# pkg verify libfuse

DBFSのアンマウント

SolarisでDBFSファイルシステムをアンマウントするには、標準のumountシステム・コマンドを使用します。

DBFSストアのマウント: Solaris固有の権限

Solarisの場合、DBFSファイルシステムでマウントおよびアンマウント操作を実行するには、Solarisの権限PRIV_SYS_MOUNTが必要です。

/etc/user_attrを編集し、次のように、ユーザー・エントリ(ユーザーがOracleであることが前提)を追加または変更します。

oracle::::type=normal;project=group.dba;defaultpriv=basic,priv_sys_mount;;auth s=solaris.smf.*

Solaris用のvfstabユーティリティを使用したDBFSのマウント

Solarisでは一般に、ファイルシステムは、vfstabユーティリティを使用して構成されます。

vfstabを使用したDBFSのマウントの手順:

1. dbfs_clientを起動するために使用するマウント・シェル・スクリプトmount_dbfs.shを作成します。Oracle Databaseに必要な環境変数をすべてエクスポートする必要があります。これらの環境変数には、TNS_ADMIN、ORACLE_HOMEおよびLD_LIBRARY_PATHが含まれます。次に例を示します。

#!/bin/ksh
export TNS_ADMIN=/export/home/oracle/dbfs/tnsadmin
export ORACLE_HOME=/export/home/oracle/11.2.0/dbhome_1
export DBFS_USER=dbfs_user
export DBFS_PASSWD=/tmp/passwd.f
export DBFS_DB_CONN=dbfs_db
export O=$ORACLE_HOME
export LD_LIBRARY_PATH=$O/lib:$O/rdbms/lib:/usr/lib:/lib:$LD_LIBRARY_PATH
export NOHUP_LOG=/tmp/dbfs.nohup

(nohup $ORACLE_HOME/bin/dbfs_client $DBFS_USER@$DBFS_DB_CONN < $DBFS_PASSWD
2>&1 & ) &

2. DBFSのエントリを/etc/vfstabに追加します。device_to_mountに対してmount_dbfs.shスクリプトを指定します。FS_typeに対してuvfsを指定します。formount_at_bootは指定しません。必要に応じて、マウント・オプションを指定します。次に例を示します。

/usr/local/bin/mount_dbfs.sh - /mnt/dbfs uvfs - no rw,allow_other

3. ユーザーは標準のSolarisマウント・コマンドを使用して、DBFSファイルシステムをマウントできます。次に例を示します。

$ mount /mnt/dbfs

4. ユーザーは標準のSolarisのumountコマンドを使用して、DBFSファイルシステムをアンマウントできます。次に例を示します。

$ umount /mnt/dbfs

DBFSコマンド・インタフェースの使用

DBFSコマンド・インタフェースにより、ネットワーク上の任意のホストからDBFSファイルシステムとの間でファイルを簡単にコピーできます。コマンド・インタフェースでは、ファイルシステムのマウントを必要とせず、ユーザー・モード・ファイルシステム・オーバーヘッドをバイパスするため、マウント・インタフェースよりパフォーマンスが多少向上します。ただし、アプリケーションに透過的ではありません。

DBFSの使用

すべてのDBFSコンテンツ・ストア・パスの前には、dbfs:を付ける必要があります。たとえば、dbfs:/staging_area/file1などです。指定するすべてのデータベース・パス名は、絶対パスである必要があります。DBFSコマンドを実行するには、DBFSクライアントに対して--commandを指定します。

dbfs_client db_user@db_server --command command [switches] [arguments]

条件:

- commandは、ls、cp、mkdir、rmなどの実行可能なコマンドです。

- switchesは、コマンドごとに固有です。

- argumentsは、ファイル名またはディレクトリ名で、コマンドごとに固有です。

dbfs_clientは、失敗するとゼロ以外の値を戻します。

この項の内容は次のとおりです。

- ディレクトリの作成

- ディレクトリのリスト

- ファイルおよびディレクトリのコピー

- ファイルおよびディレクトリの削除

ディレクトリの作成

mkdirコマンドは、新しいディレクトリを作成します。

dbfs_client db_user@db_server --command mkdir directory_name

directory_nameは、作成されたディレクトリの名前です。次に例を示します。

$ dbfs_client ETLUser@DBConnectString --command mkdir dbfs:/staging_area/dir1

ディレクトリのリスト

lsコマンドは、ディレクトリのコンテンツをリストします。

dbfs_client db_user@db_server --command ls [switches] target

targetはリストされたディレクトリで、switchesは、次の組合せのいずれかになります。

- -aは、すべてのファイル('.'や'..'を含む)を示します。

- -lは、長いリスト形式(各ファイルの名前、ファイル・タイプ、権限およびサイズ)を示します。

- -Rは、サブディレクトリを再帰的にリストします。

次に例を示します。

$ dbfs_client ETLUser@DBConnectString --command  ls dbfs:/staging_area/dir1

$ dbfs_client ETLUser@DBConnectString --command  ls -l -a -R dbfs:/staging_area/dir1

ファイルおよびディレクトリのコピー

cpコマンドは、ファイルまたはディレクトリをソースの場所から宛先の場所にコピーします。ディレクトリの再帰的コピーもサポートしています。

dbfs_client db_user@db_server --command cp [switches] source destination

sourceはソースの場所、destinationは宛先の場所、switchesは-Rまたは-rのいずれかで、すべてのソース・コンテンツを宛先のディレクトリに再帰的にコピーするためのオプションです。

次の例では、ローカル・ディレクトリ01-01-10-dumpのコンテンツをDBFS内のディレクトリに再帰的にコピーします。

$ dbfs_client ETLUser@DBConnectString --command cp -R  01-01-10-dump dbfs:/staging_area/

次の例では、ファイルhello.txtをDBFSからローカル・ファイルHi.txtにコピーします。

$ dbfs_client ETLUser@DBConnectString --command cp dbfs:/staging_area/hello.txt Hi.txt

ファイルおよびディレクトリの削除

コマンドrmはファイルまたはディレクトリを削除します。ディレクトリの再帰的削除もサポートしています。

dbfs_client db_user@db_server --command rm [switches] target

targetはリストされたディレクトリ、switchesは-Rまたは-rのいずれかで、すべてのコンテンツを再帰的に削除するためのオプションです。次に例を示します。

$ dbfs_client ETLUser@DBConnectString --command rm  dbfs:/staging_area/srcdir/hello.txt

$ dbfs_client ETLUser@DBConnectString --command rm -R  dbfs:/staging_area/dir1

DBFS管理

この項では、DBFS管理ツールについて説明します。

この項の内容は次のとおりです。

- DBFSクライアントでのOracle Walletの使用

- ファイルシステム・セキュリティ・モデル

- DBFS診断の実行

- DBFSクライアント・フェイルオーバーの管理

- DBFSの共有およびキャッシュ

- DBFSのバックアップ

- DBFSの小さいファイルのパフォーマンスの向上

- DBFSの高度なSecureFiles LOBの有効化

DBFSクライアントでのOracle Walletの使用

Oracle Walletを使用すると、ユーザーがパスワードを入力することなく、DBFSクライアントでDBFSストアをマウントできます。ウォレットの作成および管理の詳細は、『Oracle Database Advanced Security管理者ガイド』を参照してください。"/@"構文は、ウォレットを使用することを意味します。

Oracle Walletの作成手順:

1. ウォレットのディレクトリを作成します。次に例を示します。

mkdir $ORACLE_HOME/oracle/wallet

2. 自動ログイン・ウォレットを作成します。

mkstore -wrl $ORACLE_HOME/oracle/wallet -create

3. クライアントのsqlnet.oraファイルに、ウォレットの場所を追加します。

vi $TNS_ADMIN/sqlnet.ora
WALLET_LOCATION = (SOURCE = (METHOD = FILE) (METHOD_DATA = (DIRECTORY =
$ORACLE_HOME/oracle/wallet) ) )

4. クライアントのsqlnet.oraファイル内に、次のパラメータを追加します。

vi $TNS_ADMIN/sqlnet.ora
SQLNET.WALLET_OVERRIDE = TRUE

5. 次のようにして、資格証明を作成します。

mkstore -wrl wallet_location -createCredential db_connect_string username password

次に例を示します。

mkstore -wrl $ORACLE_HOME/oracle/wallet -createCredential DBConnectString scott tiger

6. 使用するtnsnames.oraファイルに、接続の別名を追加します。

7. これで、dbfs_clientをOracle Walletで使用できるようになります。
次に例を示します。

$ dbfs_client -o wallet /@DBConnectString /mnt/dbfs

ファイルシステム・セキュリティ・モデル

データベースは、オペレーティング・システムのセキュリティ・モデルではなくDBFS内のセキュリティを管理します。データベース・ファイルシステムにアクセスするには、ファイルシステムの基礎となる表の権限を持つデータベース・ユーザーでデータベースにログインする必要があります。データベース管理者はファイルシステムへのアクセスをユーザーに付与でき、これにより別々のデータベース・ユーザーがファイルシステムに対して、データベース管理者が決定する別々のREADまたはUPDATE権限を持つことができます。当然、データベース管理者は、DBFSファイルシステムに格納されているすべてのファイルにアクセスできます。

クライアント・マシンでは、DBFSマウント・ポイントへのアクセスは、ファイルシステムをマウントするオペレーティング・システム・ユーザーに制限されています。ただし、多数のユーザーが同一のDBFSファイルシステムを別々にマウントできるため、これによってDBFSにアクセス可能なユーザーの数が制限されることはありません。

Linuxでは、DBFSがファイルシステムがマウントされた場合に、オペレーティング・システムのファイル・レベルの権限チェックが実行されます。コマンド・インタフェースを使用した場合、またはPL/SQLインタフェースを直接使用した場合は、DBFSでこのチェックは実行されません。かわりに、データベースの権限チェックのみが実行されます。

DBFSは、ユーザーによって作成されたすべてのファイルシステムが、デフォルトでそのユーザー固有になるセキュリティ・モデルで機能します。このモデルを変更しないことをお薦めします。オペレーティング・システム・ユーザーとRDBMSユーザーは異なるため、複数のオペレーティング・ユーザーを単一のDBFSファイルシステムにマウントすることはできません。これらのマウントは、マウント・ポイントおよび権限が異なる場合があります。たとえば、user1はREAD ONLYとしてDBFSをマウントできますが、user2はREAD WRITEとしてマウントできます。ただし、どちらのユーザーも同じRDBMSユーザーとしてファイルシステムにアクセスするため、RDBMSでは、両方のユーザーを同じ権限を持つユーザーとして認識します。

この項の内容は次のとおりです。

- 共有ルート・アクセスの有効化

- 複数のRDBMSユーザー間のDBFSアクセスの有効化

共有ルート・アクセスの有効化

ファイルシステムをマウントしているオペレーティング・システム・ユーザーは、allow_rootオプションを指定することで、ファイルシステムへのrootアクセスを許可できます。このオプションでは、例6-4に示すように、/etc/fuse.confファイルにuser_allow_otherフィールドを含める必要があります。

例6-4 他のユーザーのルート・アクセスの有効化

# Allow users to specify the 'allow_root' mount option.
user_allow_other

複数のRDBMSユーザー間のDBFSアクセスの有効化

複数のRDBMSユーザーが同じファイルシステムにアクセスする必要がある状況が生じる場合があります。たとえば、ファイルシステムを所有するRDBMSユーザーが権限を付与されたユーザーで、そのユーザーの証明書を共有すると、セキュリティのリスクにさらされる危険があるとします。これを回避するために、DBFSでは、複数のRDBMSユーザーがファイルシステムの状態のサブセットを共有できるようになっています。

DBFSコンテンツAPIによるDBFSの登録およびマウントは各ユーザー固有ですが、各ユーザーが利用する基礎となるファイルシステムおよび表はユーザー間で共有できます。これにより、個々のファイルシステムを個別にマウントできるようになり、SQL/PLSQLまたはdbfs_client APIのいずれかを使用して、異なるRDBMSユーザーで使用できます。

次の例では、ユーザーuser1はファイルシステムを変更できますが、user2はこれらの変更を参照することしかできません。user1は、ファイルシステムを作成するRDBMSユーザーで、user2は、最終的にdbfs_clientを使用してファイルシステムのマウントとアクセスを行うRDBMSユーザーです。user1とuser2は、どちらもDBFS_ROLE権限を持ちます。

複数のRDBMSユーザー間でDBFSアクセス共有を確立する手順:

1. ファイルシステムを作成するユーザーとして接続します。

sys@tank as sysdba> connect user1
Connected.

2. ファイルシステムuser1_FSを作成してストアを登録し、user1_mtとしてマウントします。

user1@tank> exec dbms_dbfs_sfs.createFilesystem('user1_FS');
user1@tank> exec dbms_dbfs_content.registerStore('user1_FS', 'posix', 'DBMS_DBFS_SFS');
user1@tank> exec dbms_dbfs_content.mountStore('user1_FS', 'user1_mnt');
user1@tank> commit;

3. (オプション)すべてのマウントを表示することにより、前述の手順が正常に実行されたかどうかを確認できます。

user1@tank> select * from table(dbms_dbfs_content.listMounts);

STORE_NAME           |   STORE_ID|PROVIDER_NAME
---------------------|- ---------|------------------------------------------
PROVIDER_PKG         |PROVIDER_ID|PROVIDER_VERSION     |STORE_FEATURES
---------------------|-----------|---------------------|--------------------
STORE_GUID
----------
STORE_MOUNT
----------------------------------------------------------------------------
CREATED
----------------------------------------------------------------------------
MOUNT_PROPERTIES(PROPNAME, PROPVALUE, TYPECODE)
----------------------------------------------------------------------------
user1_FS             | 1362968596|posix
"DBMS_DBFS_SFS"      | 3350646887|0.5.0                | 12714135  141867344
user1_mnt
01-FEB-10 09.44.25.357858 PM
DBMS_DBFS_CONTENT_PROPERTIES_T(
DBMS_DBFS_CONTENT_PROPERTY_T('principal', (null), 9),
DBMS_DBFS_CONTENT_PROPERTY_T('owner', (null), 9),
DBMS_DBFS_CONTENT_PROPERTY_T('acl', (null), 9),
DBMS_DBFS_CONTENT_PROPERTY_T('asof', (null), 187),
DBMS_DBFS_CONTENT_PROPERTY_T('read_only', '0', 2))

4. (オプション)dbfs_clientを使用するユーザーとして接続します。

user1@tank> connect user2
Connected.

5. (オプション) user2にはマウントがないため、user1のDBFSの状態を確認できません。

user2@tank> select * from table(dbms_dbfs_content.listMounts);

6. user1として接続している間に、DBFS_ROLE権限を持つユーザーがアクセスできるように、ファイルシステムuser1_FSをエクスポートします。

user1@tank> exec dbms_dbfs_sfs.exportFilesystem('user1_FS');
user1@tank> commit;

7. dbfs_clientを使用するユーザーとして接続します。

user1@tank> connect user2
Connected.

8. user2として、使用可能なすべての表を確認します。

user2@tank> select * from table(dbms_dbfs_sfs.listTables);

SCHEMA_NAME                |TABLE_NAME                 |PTABLE_NAME
---------------------------|---------------------------|-------------------
VERSION#
--------------------------------CREATED
---------------------------------------------------------------------------
FORMATTED
---------------------------------------------------------------------------
PROPERTIES(PROPNAME, PROPVALUE, TYPECODE)
---------------------------------------------------------------------------
user1                        |SFS$_FST_11                |SFS$_FSTP_11
0.5.0
01-FEB-10 09.43.53.497856 PM
01-FEB-10 09.43.53.497856 PM
(null)

9. user2として、ストアを登録およびマウントします。ただし、user1_FSファイルシステムは作成しないでください。

user2@tank> exec dbms_dbfs_sfs.registerFilesystem(
'user2_FS', 'user1', 'SFS$_FST_11');
user2@tank> exec dbms_dbfs_content.registerStore(
'user2_FS', 'posix', 'DBMS_DBFS_SFS');
user2@tank> exec dbms_dbfs_content.mountStore(
'user2_FS', 'user2_mnt');
user2@tank> commit;

10. (オプション)すべてのマウントを表示することにより、user2として、前述の手順が正常に実行されたかどうかを確認できます。

user2@tank> select * from table(dbms_dbfs_content.listMounts);

STORE_NAME           |   STORE_ID|PROVIDER_NAME
---------------------|- ---------|------------------------------------------
PROVIDER_PKG         |PROVIDER_ID|PROVIDER_VERSION     |STORE_FEATURES
---------------------|-----------|---------------------|--------------------
STORE_GUID
----------
STORE_MOUNT
----------------------------------------------------------------------------
CREATED
----------------------------------------------------------------------------
MOUNT_PROPERTIES(PROPNAME, PROPVALUE, TYPECODE)
----------------------------------------------------------------------------
user2_FS             | 1362968596|posix
"DBMS_DBFS_SFS"      | 3350646887|0.5.0                | 12714135  141867344
user1_mnt
01-FEB-10 09.46.16.013046 PM
DBMS_DBFS_CONTENT_PROPERTIES_T(
DBMS_DBFS_CONTENT_PROPERTY_T('principal', (null), 9),
DBMS_DBFS_CONTENT_PROPERTY_T('owner', (null), 9),
DBMS_DBFS_CONTENT_PROPERTY_T('acl', (null), 9),
DBMS_DBFS_CONTENT_PROPERTY_T('asof', (null), 187),
DBMS_DBFS_CONTENT_PROPERTY_T('read_only', '0', 2))

11. (オプション)user2およびuser1のパス名をリストします。ストアuser2_FS用の別のマウントであるuser2_mnt,は、user2で使用できます。ただし、基礎となるファイルシステム・データは、user2とuser1で同じです。

user2@tank> select pathname from dbfs_content;

PATHNAME
-------------------------------------------------------------------------------
/user2_mnt
/user2_mnt/.sfs/tools
/user2_mnt/.sfs/snapshots
/user2_mnt/.sfs/content
/user2_mnt/.sfs/attributes
/user2_mnt/.sfs/RECYCLE
/user2_mnt/.sfs

user2@tank> connect user1
Connected.

user1@tank> select pathname from dbfs_content;

PATHNAME
---------------------
/user1_mnt
/user1_mnt/.sfs/tools
/user1_mnt/.sfs/snapshots
/user1_mnt/.sfs/content
/user1_mnt/.sfs/attributes
/user1_mnt/.sfs/RECYCLE
/user1_mnt/.sfs

12. ファイルシステムuser1_FSでは、user1がファイルxxxを作成します。

user1@tank> var ret number;
user1@tank> var data blob;
user1@tank> exec :ret := dbms_fuse.fs_create('/user1_mnt/xxx', content => :data);
user1@tank> select :ret from dual;
:RET
----------
0

13. (オプション)前述の手順で作成したファイルxxxに書き込みます。

user1@tank> var buf varchar2(100);
user1@tank> exec :buf := 'hello world';
user1@tank> exec dbms_lob.writeappend(:data, length(:buf), utl_raw.cast_to_raw(:buf));
user1@tank> commit;

14. (オプション)xxxファイルが存在し、追加されたデータが含まれていることを表示します。

user1@tank> select pathname, utl_raw.cast_to_varchar2(filedata)
from dbfs_content where filedata is not null;

PATHNAME
-------------------------------------------------------------------------------
UTL_RAW.CAST_TO_VARCHAR2(FILEDATA)
-------------------------------------------------------------------------------
/user1_mnt/xxx
hello world

15. ユーザーuser2には、自身のDBFS固有のパス名およびマウントの接頭辞に同じファイルが表示されます。

user1@tank> connect user2
Connected.

user2@tank> select pathname, utl_raw.cast_to_varchar2(filedata) from
dbfs_content where filedata is not null;

PATHNAME
-------------------------------------------------------------------------------
UTL_RAW.CAST_TO_VARCHAR2(FILEDATA)
-------------------------------------------------------------------------------
/user2_mnt/xxx
hello world

エクスポートと登録の組合せが完了した後、基礎となる表の使用に関しては両ユーザーは対等に動作します。exportFilesystem()プロシージャは、スキーマ間で共有される同じデータへのアクセスに必要な権限の付与を管理します。user1がexportFilesystem()をコールした後、DBFS_ROLE権限を持つ任意のユーザーにファイルシステムのアクセス権を付与できます。別のロールを指定することもできます。

続いて、dbms_dbfs_sfs.registerFilesystem()、dbms_dbfs_sfs.registerStore()およびdmbs_dbfs_sfs.mountStore()プロシージャ・コールを呼び出すことにより、基礎となる同じ記憶域を共有する新しいDBFSファイルシステムをuser2がuser1_FSファイルシステムとして作成できます。

複数のRDBMSユーザーがファイルシステムを共有している場合は、所有者(ここではuser1)がファイルシステムを削除する前に、すべてのRDBMSユーザーがそのファイルシステムに関連する各自の項目の登録を解除している必要があります。

rootユーザーがDBFSを実行することは推奨されません。

DBFS診断の実行

dbfs_clientは、問題の診断を支援するために複数のトレース・レベルをサポートしています。dbfs_clientは、Linuxでsyslogデーモンを使用してトレースをファイルまたは/var/log/messagesに出力できます。ファイルに対してトレースする場合、ディスク上で2つのトレース・ファイルが保持されます。dbfs_clientは、トレース・ファイルを自動的にローテーションし、ディスク使用量を20MBに制限します。

デフォルトでは、/var/log/messagesに常にロギングされるクリティカルなメッセージを除き、トレーシングは無効になっています。

dbfs_clientでOracle Databaseに接続できない場合、trace_levelおよびtrace_fileオプションを使用してトレースを有効にします。トレースを使用すると、追加メッセージがログ・ファイルに出力されて、デバッグが容易になります。

DBFSでは、Oracle Databaseを使用して、ファイルが格納されます。Oracleサーバーの問題は、dbfs_clientにエラーとして伝播される場合があります。dbfs_clientエラーが発生した場合、Oracleサーバー・ログを参照して、そのエラーが根本原因であるかを確認してください。

DBFSクライアント・フェイルオーバーの管理

Oracle RACクラスタの1つのデータベース・インスタンスが失敗した場合、dbfs_clientを、その他の既存のデータベース・インスタンスの1つにフェイルオーバーできます。dbfs_clientフェイルオーバーが正常に動作するには、例6-5に示すように、Oracleデータベース・サービスを変更して、フェイルオーバー・パラメータを指定する必要があります。

例6-5 DBFSクライアント・フェイルオーバー・イベントの有効化

exec DBMS_SERVICE.MODIFY_SERVICE(service_name => 'service_name',
aq_ha_notifications => true,
failover_method => 'BASIC',
failover_type => 'SELECT',
failover_retries => 180,
failover_delay => 1);

バックエンドのOracleデータベース・インスタンスが失敗した後で、DBFS接続のフェイルオーバーの際にデータが損失しないようにするには、例6-6に示すように、-o failoverマウント・オプションを指定します。この場合、クライアントが終了するとキャッシュされた書込みは失われる可能性があります。ただし、他のOracle RACインスタンスまたはスタンバイ・データベースに対するバックエンド・フェイルオーバーでは、書込みが失われることはありません。

例6-6 フェイルオーバー・イベント中のデータ損失の防止

$ dbfs_client database_user@database_server -o failover /mnt/dbfs

DBFSの共有およびキャッシュ

同一の共有ファイルシステムにアクセスするdbfs_clientの複数コピーを保持することが可能です。共有およびキャッシュ・セマンティクスは、NFSと同様です。NFSと同様に、デフォルト・モードでは、クライアント上に書込みをキャッシュし、タイムアウト後またはユーザーがファイルを閉じた時点で、その書込みをフラッシュします。また、NFSと同様に、ファイルへの書込みは、ライターがファイルをクローズした後にファイルをオープンするクライアントにのみ参照されます。この動作は一般に、close-to-openキャッシュ一貫性と呼ばれます。

クライアント側の書込みキャッシュを省略するには、ファイルのオープン時にO_SYNCを指定します。キャッシュへの書込みは、fsyncをコールすることで、強制的にディスクに書き込まれます。

DBFSのバックアップ

DBFSのバックアップには2つの方法があります。1つ目は、ファイルシステムの基礎となる表をデータベース・レベルでバックアップする方法です。2つ目は、マウント・ポイントからOracle Secure Backupなどのファイルシステムのバックアップ・ユーティリティを使用する方法です。

この項の内容は次のとおりです。

- データベース・レベルでのDBFSのバックアップ

- ファイルシステム・ユーティリティによるDBFSのバックアップ

データベース・レベルでのDBFSのバックアップ

データベース・レベルで表をバックアップすると、ファイルシステム内のファイルとデータベース内のリレーショナル・データの一貫性を常に保つことができる利点があります。また、データベースの完全なリストアおよびリカバリにより、データを損失せずにファイルシステムを完全にリストアおよびリカバリできます。データベースのpoint-in-timeリカバリの実行中に、ファイルは指定した時間にリカバリされます。通常のデータベース・バックアップのように、バックアップ中に発生した変更はリストアの一貫性に影響しません。リストアされたファイルシステム全体は、指定したタイム・スタンプにおいて常に一貫性があります。

ファイルシステム・ユーティリティによるDBFSのバックアップ

ファイルシステム・バックアップ・ユーティリティを使用してファイルシステムをバックアップすると、個々のファイルをバックアップから容易にリストアできる利点があります。リストアされたファイルに最後のバックアップ以降に加えられた変更は失われます。

Oracle Secure Backup管理サーバーを使用してバックアップがスケジュールされる場合、allow_rootマウント・オプションを指定する必要があります。

DBFSの小さいファイルのパフォーマンスの向上

すべての共有ファイルシステムと同様に、小さいファイルに対するDBFSのパフォーマンスは、ローカル・ファイルシステムのパフォーマンスより遅れます。DBFS内の各ファイルのデータまたはメタデータの操作は、FUSEユーザー・モード・ファイルシステムによって処理され、ネットワークを介してデータベースに転送される必要があります。このため、クライアントでキャッシュされていない操作は、DBFS内での実行に数ミリ秒かかります。

ディスクへの入力/出力(IO)を伴う操作では、ディスクIOの待機によって時間遅延のオーバーヘッドがマスクされます。大きいIOのオーバーヘッドは、小さいIOの場合よりも当然低いパーセンテージになります。ネットワーク・オーバーヘッドは、ディスクIOを発行しない操作でより顕著です。

ローカル・ファイルシステムを使用する数の少ない小さいファイル上で動作する操作では、オーバーヘッドは目立ちませんが、数千の小さいファイル上に影響を与える操作では、オーバーヘッドは大きくなります。たとえば、単一ディレクトリをリストする場合や単一ファイルを参照する場合、ほぼ即時にレスポンスが得られますが、数千のファイルを含むディレクトリ・ツリー内を検索する場合、オーバーヘッドは相対的に大きくなります。

DBFSの高度なSecureFiles LOBの有効化

DBFSでは、圧縮、重複除外、暗号化、パーティション化など、SecureFiles LOBで使用可能な拡張機能を利用できます。たとえば、パーティション化を使用して、DBFSを圧縮ファイルシステムとして構成できます。ファイルシステムの作成時に、ファイルシステムで使用可能にする機能のセットを指定する必要があります。SecureFiles LOBの機能については、第4章「Oracle SecureFiles LOBの使用」を参照してください。

例6-7 DBFSの高度なセキュア・ファイルLOBの有効化

$ sqlplus @dbfs_create_filesystem_advanced tablespace_name file_systemname
[compress-high | compress-medium | compress-low | nocompress]
[deduplicate | nodeduplicate]
[encrypt | noencrypt]
[partition | non-partition]

7 DBFSコンテンツAPI

この章の内容は次のとおりです。

- DBFSコンテンツAPIの概要

- ストアおよびパッケージDBMS_DBFS_CONTENT

DBFSコンテンツAPIの概要

DBFSコンテンツAPIは、ファイルシステムに類似した抽象化を提供するメソッドの集合です。これは、1つ以上のDBFSストア・プロバイダによって支えられます。DBFSコンテンツAPIの「コンテンツ」は、メタデータ付きのファイルで、表のSecureFiles BLOB(および他の列)にマップするかデータベース内で実行されるJavaまたはPL/SQLのユーザーが記述したプラグインで動的に作成するかのいずれかが可能です。後者の形式は「プロバイダ」と呼ばれます。

DBFSコンテンツAPIは、SecureFilesベースのストア・プロバイダ実装(DBMS_DBFS_SFS)に付属し、SecureFiles LOBベースのファイルシステムを作成できます。さらに、標準DBFSコンテンツAPIインタフェースを介して、別の(サード・パーティの)ストアに格納されたコンテンツをアプリケーションで読取りおよび書込みできます。

プロバイダの例を次に示します。

- コンテンツDBに類似したコンテンツ・アプリケーション。

- ファイルによってデータを覆うパッケージ・アプリケーション。

- ファイルシステム・インタフェースを利用するカスタム・アプリケーション。医療イメージを格納するアプリケーションなどがあります。

ストアおよびパッケージDBMS_DBFS_CONTENT

ストアは、ドキュメントのコレクションです。各ドキュメントは、/として表された一意の絶対パス名の後ろに1つ以上のコンポーネント名が/で区切られた状態で並ぶ形式によって識別されます。一部のストアではフラットなネームスペースのみが実装されますが、他のストアではディレクトリまたはフォルダが暗黙的に実装され、さらに他のストアではファイルシステムに類似したエンティティのコレクションが包括的に実装される場合があります。これらには、階層ディレクトリ、ファイル、シンボリック・リンク、ハード・リンク、参照などが含まれる場合があります。多くの場合、これらには、ドキュメントに関連付けられた一連の豊富なメタデータや、セキュリティ、アクセス制御、ロック、バージョニング、コンテンツ・アドレッシング、保存制御などに関する一連の豊富な動作が含まれます。

一般に、ストアは別個に設計および展開されるため、特定のストアを使用するアプリケーションは、ストアの開発者によって記述またはパッケージされているか、またはユーザーがストア固有のAPIを使用することが必要です。ストア自体の実装に使用するデータ表のスキーマの詳細な知識が必要になる場合もあります。

DBFSコンテンツAPIはクライアント側プログラムAPIパッケージDBMS_DBFS_CONTENTであり、各種ストアの共通の機能を、ポータブル・クライアント・アプリケーションの作成に使用できる簡単かつ最小のインタフェースに抽象化します。これは、ストア固有のライブラリおよび実装から切り離して行われます。

DBFSコンテンツAPIは、曖昧さをなくすためにパス名の最初のコンポーネントを使用して1つ以上のストアのパス・ネームスペースを単一のネームスペースに統合し、このネームスペースをクライアント・アプリケーションに示します。これによりクライアントは、単一文字列で表された完全な絶対パス名(/store_name/store_specific_path_name)、またはタプル文字列で表されたストアで修飾されたパス名(store_name、/store_specific_path_name)のいずれかを使用して、基礎となるドキュメントにアクセスできます。

次に、DBFSコンテンツAPIは、パス名に対する各種操作を適切なストアに正しくディスパッチし、結果をクライアントで必要なネームスペースに統合します。

ストア・プロバイダは、パッケージDBMS_DBFS_CONTENT_SPIによる宣言のとおり、サービス・プロバイダ・インタフェース(SPI)に準拠する必要があります。SPIはクライアント側APIではなく、DBFSコンテンツAPIとそれらのAPIに接続する必要がある各種ストアの間のプライベート契約の役割を持ちます。

DBFSコンテンツAPIにより、クライアントで表示可能な各種ストアの操作の標準および例外的な動作が定義され、選択に応じて豊富な機能を異なるストアで実装できます。APIにより、ストアは機能を自己記述でき、インテリジェント・クライアント・アプリケーションは、名前または実装で識別されるストア固有のハードコード・ロジックではなく、これらの機能に基づいて動作のチューニングが可能です。

DBMS_DBFS_CONTENTパッケージの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

DBMS_DBFS_CONTENTパッケージの開始

DBMS_DBFS_CONTENTは、Oracle Database 11gリリース2以降に付属しており、インストールは必要ありません。

詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

DBFSコンテンツAPIのロール

コンテンツの操作および管理API(パッケージ、タイプ、表など)には、dbfs_roleを使用してアクセスできます。このロールは、必要に応じてすべてのユーザーに付与されます。

パス名の定数およびタイプ

PATH_MAXは、クライアントで表示可能な絶対パス名の最大長です。NAME_MAXは、クライアントで表示可能な絶対パス名の個別のコンポーネントの最大長です。これらの定数は、SecureFiles LOBストアの一方に基づいて作成されます。

PL/SQLタイプpath_tおよびname_tは、パス名およびコンポーネント名を表す文字列のポータブルな別名です。

コンテンツ・プロパティ

ストア内のすべてのパス名は、プロパティのセットに関連付けられています。簡易性と汎用性のために、各プロパティは文字列名で識別され、文字列値(未設定または特定のストア実装で未定義もしくは非サポートの場合はnullの可能性あり)および値タイプコード(値文字列で保持される実際の値のタイプに対する数値判別)を持ちます。

プロパティ値を文字列へ強制変換すると、各種インタフェースを統一して簡潔にできる利点があり、基礎となるストアの実装の簡素化も可能です。ただし、文字列間の変換中に情報が損失する危険性があります。

- クライアントおよびストアは、これらの変換に明確に定義されたデータベース表記規則を使用し、必要に応じてtypecodeフィールドを使用することが前提です。

- PROPNAME_MAXはプロパティ名の最大長で、PROPVAL_MAXはプロパティの文字列値の最大長です。

- PL/SQLタイプpropname_tおよびpropval_tは、プロパティ名および値を表す文字列のポータブルな別名です。タイプコードは、数値(dbms_typesで定義される各種定数を参照)で、文字列強制変換されたプロパティ値の本当のタイプを表します。dbms_typesで定義されるすべてのタイプコードが、ストアで等しくサポート可能である必要はありません。単純なスカラー・タイプ(数値、日付、タイムスタンプなど)はクライアントで依存可能であり、ストアで実装される必要があります。

標準RDBMSタイプコードは正の整数であるため、DBFSコンテンツAPIでは、負のタイプコードによるクライアント定義タイプを負の整数で示すことができます。これらのタイプコードは標準タイプコードと競合せず、永続的になって、必要に応じてクライアントに戻されますが、DBFSコンテンツAPIやいずれか特定のストアで解析される必要はありません。ポータブル・クライアント・アプリケーションでは、特定のストアに情報を渡すバックドアの方法としてユーザー定義のタイプコードを使用しないでください。

- dbms_dbfs_content_property_tオブジェクト・タイプは、単一の(名前、値、タイプコード)プロパティ・タプルを記述します。すべてのプロパティ(標準、オプションおよびユーザー定義)は、このタプルを介して記述されます。

- dbms_dbfs_content_properties_tは、可変サイズのプロパティ・タプルの配列です。これら2つのタイプは、クライアント向けのAPI、およびDBFSコンテンツAPI用のストア・プロバイダの両方で使用されます。

DBMS_DBFS_CONTENT定数およびプロパティの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』、DBMS_DBFS_CONTENT_PROPERTY_Tパッケージの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

パス名タイプ

ストアでは、4つのタイプのエンティティへのアクセスを格納および提供します。

- type_fileは、BLOBとしてアクセスするバイトの論理的な線形順序としてコンテンツを格納する標準ファイルです。

- type_directoryは、ファイル・タイプを含むその他のパス名タイプのコンテナです。

- type_linkは、シンボリック・リンク、つまりパス名に関連付けられた未解析の文字列値です。シンボリック・リンクは、所定のストア(またはDBFSコンテンツAPIで管理されるストアの集合全体)の範囲外にあるパス名を表す場合、またはパス名を表さない場合もあるため、クライアントではシンボリック・リンクの作成に注意が必要であり、ストアではこれらのリンクの内部的な解決を試行する際に注意が必要です。

- type_referenceは、コンテンツに対するハード・リンク(必ず有効なパス名の別名)です。

すべてのストアで、すべてのディレクトリ、リンクまたは参照を実装する必要はありません。DBMS_DBFS_CONTENT定数およびパス名のタイプの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』の「ストア機能」を参照してください。

ストア機能

共通のプログラム・インタフェースを、可能なかぎり多くの異なるタイプのストアに提供するために、DBFSコンテンツAPIでは、個別のストア・プロバイダが各種操作の動作の一部を定義および実装できます。ただし、クライアント側プログラマに、ポータブル・アプリケーションで役立つ豊富なAPIを提供することも重要です。

DBFSコンテンツAPIでは、これを実現するために、異なるストア・プロバイダ(および異なるストア)が機能セット(サポートする機能およびサポートしない機能を示すビット・マスク)を使用して、自ら記述することを可能にしています。

追加のロジックをクライアント側に実装し、複雑な操作をサポート可能なストアに委ねることで、特定のストアの機能の不足を補正するクライアント・アプリケーションにとって、機能セットの使用は可能ではあっても容易ではありません。

- feature_foldersは、ストアで階層パス名の一部としてフォルダ(またはディレクトリ)をサポートする場合に設定されます。

- feature_foiatは、(クライアントがリクエストする操作の一部として実行される)ストア内の暗黙的フォルダ操作を、自律型トランザクションの内部で実行する場合に設定されます。一般に、自律型トランザクションの使用は、同時実行性の大幅な削減による、実装の簡略化およびすべての操作に向けたクライアント制御トランザクション範囲(feature_foiatを設定しない)と、同時実行性の大幅な増加による、複雑な実装および狭いクライアント制御トランザクション範囲(feature_foiatを設定)の2つのバランスの上に成り立ちます。。
読取り専用(主に読取り)ストアへのアクセスは、この機能の影響を大きく受けることがないようにしてください。

- feature_aclsは、ストアでアクセス制御リスト(ACL)およびこれらのACLに基づく内部認可ならびにチェックをサポートする場合に設定されます。ACLは標準プロパティですが、ストアはACLのいかなる解析も行わず、格納および取得のみを実行します。

- feature_linksまたはfeature_link_derefは、ストアでシンボリック・リンクをサポートし、特定のタイプのシンボリック・リンク(特に絶対パス名ではない場合など)をストア自体により内部的に解決する場合に設定されます。

- feature_referencesは、ストアでハード・リンクをサポートする場合に設定されます。

- feature_lockingは、ストアの各種アイテムに適用可能なユーザー・レベルのロック(読取り専用、書込み専用、読取り/書込み)をストアでサポートし、ロックされたアイテムへの各種タイプのアクセスをそれらのロック設定を使用して制御する場合に設定されます。ユーザー・レベルのロックはトランザクション・ロックに対して直交で、特定のトランザクション、セッションまたは接続の範囲を超えて存続します。これは、ロックのダングリングの後にストア自体でクリーンアップできず、クライアント・アプリケーションでガベージ・コレクションを実行する必要があることを意味します。

- feature_lock_hierarchyは、ストアで、ロックされたパス名下のサブツリー全体へのアクセスをユーザー・ロックが制御できるようにする場合に設定されます。単純なロック・モデルでは、ロック・セマンティクスは特定のパス名にのみ適用され、親または子に対するロックに依存します(リクエストされた操作でこれらの親または子を暗黙的に変更しない場合)。

- feature_lock_convertは、ストアで、あるモードから別のモードへのロックのアップグレードまたはダウングレードをサポートする場合に設定されます。

- feature_versioningは、ストアで少なくとも線形バージョニングおよびバージョン管理をサポートする場合に設定されます。同じパス名の異なるバージョンは、単調なバージョン番号と、最新バージョンを示すバージョン非修飾パス名で識別されます。

- feature_version_pathは、ストアでパス名の異なるバージョンの階層ネームスペースをサポートする場合に設定されます。

- feature_soft_deletesは、ストアでソフト削除、つまりパス名を削除して通常の操作で非表示にするが、後でパス名をリストア(新しい作成操作で上書きされない場合)できるようにする機能をサポートする場合に設定されます。ストアでは、ソフト削除されたパス名のパージ(完全な削除)およびソフト削除されたアイテムを表示するナビゲーション・モードもサポートされます。

- feature_hashingは、ストアで、パス名(一般にtype_fileパス)のコンテンツに対するセキュアなハッシュの一部のタイプを自動的に計算し保持する場合に設定されます。

- feature_hash_lookupは、ストアでコンテンツ・ベース・アドレッシング、つまりパス名ではなくコンテンツ・ハッシュに基づいてコンテンツ・アイテムを検索する機能を使用できるようにする場合に設定されます。

- feature_filteringは、ストアで、指定のストア・アイテムが選択述語を満たしているかどうかを示す論理ブール値を戻すフィルタ関数(特定の関数シグネチャに準拠するPL/SQL関数)をクライアントが渡せるようにする場合に設定されます。フィルタリングをサポートするストアでは、実装内にフィルタリング・ロジックを埋め込むことで、アイテムのリスト、ディレクトリのナビゲーションおよび削除をより効率的に実行できます。フィルタリングがサポートされない場合、効率は落ちますが、クライアントでは必要以上のアイテムを取得して、自身でフィルタリング・チェックを実行できます。
フィルタ述語は、次のシグネチャを持つ関数です。

function filterFunction(
path        in      varchar2,
store_name  in      varchar2,
opcode      in      integer,
item_type   in      integer,
properties  in      dbms_dbfs_content_properties_t,
content     in      blob)
return  integer;

このシグネチャに準拠する任意のPL/SQL関数を使用すると、ストア・アイテムのコンテンツおよびプロパティを調べ、アイテムが現在の操作の選択基準を満たしているかを判別できます。戻り値true(非ゼロ)では、DBFSコンテンツAPIでアイテムは現在の操作の一部として処理され、戻り値false(ゼロまたはnull)では、アイテムは処理から完全にスキップされます。

- feature_searchingは、ストアで、クライアントがテキスト検索フィルタ問合せを渡し、そのコンテンツに基いてtype_fileパス名を検索できるようにする場合に設定されます。検索をサポートするストアでは、索引を使用することで検索が強化されますが、使用しない場合、クライアントでは独自の索引を作成するか、または可能性のあるアイテムの大きいセットを検索して、現在の検索の対象を特定します。

- feature_asofは、ストアで、クライアントが問合せ操作(非変異getPath()、リスト、検索)でフラッシュバック・タイムスタンプを使用できるようにする場合に設定されます。

- feature_provider_propsは、ストアで、(個々のアイテムに関連付けられたプロパティとは異なり、現在の操作に対するストアの動作を制御する)操作ごとのプロパティを使用できるようにする場合に設定されます。

DBMS_DBFS_CONTENT定数-ストア機能の詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

ロック・タイプ

ロックをサポートするストアでは、lock_read_only、lock_write_only、lock_read_writeの3タイプのロックの実装が必要です。

ユーザー・ロック(3タイプの1つ)は、ユーザー指定のlock_dataに関連付けが可能です。これはストアにより解析されませんが、クライアント・アプリケーションで独自の目的(たとえば、クライアント・アプリケーションで、ガベージ・コレクションの失効ロックや明示的なロック解除などのアクションを制御するために後からこの情報を使用すると想定して、ユーザー・データによりロックが行われた時刻を示すことができるなど)のために使用できます。

単純なロック・モデルでは、lock_read_onlyにより、パス名に対するすべての明示的な変更ができなく(ただし暗黙的変更および親/子パス名の変更は可能)なります。lock_write_onlyにより、パス名に対するすべての明示的な読取りができなく(ただし暗黙的読取りおよび親/子パス名の読取りは可能)になります。lock_read_writeでは、両方が可能です。

すべてのロックは、ロック操作を実行するプリンシパルに関連付けられます。ロックをサポートするストアではこの情報を保持し、読取り/書込みロック・チェックの実行に使用する必要があります(opt_lockerを参照)。

より複雑なロック・モデルでは、複数の読取りロック、パス名階層間のロックの範囲指定、ロック変換、グループ・ロックなどが可能ですが、現在、DBFSコンテンツAPIでは定義されていません。

DBMS_DBFS_CONTENT定数およびロック・タイプの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

標準プロパティ

標準プロパティは、すべてのストアで(DBFSコンテンツAPIで記述されている方法で)サポートされる必要があるすべてのコンテンツ・パス名に関連付けられた、正しく定義された必須プロパティで、いくつかの特権(たとえば、読取り専用ストアでは、modification_timeまたはcreation_timeの実装が不要であること、固定スキーマのある表に対して作成されたストアでは、これらのプロパティの必要なだけ多くに対して適切なデフォルトを選択できることなど)があります。

すべての標準プロパティでは、非公式に、std:ネームスペースが使用されます。クライアントおよびストアで、独自のプロパティの定義にこのネームスペースを使用すると、将来競合が発生する原因となるため、このネームスペースの使用は避ける必要があります。

次の標準プロパティのメニューは、長期にわたって一定である必要があります。

- std_access_time(UTCのTYPECODE_TIMESTAMP)
パス名のコンテンツが最後にアクセスされた時間。

- std_acl(TYPECODE_VARCHAR2)
パス名に関連付けられたアクセス制御リスト(標準ACL構文)。

- std_canonical_path(TYPECODE_VARCHAR2)
適切にクリーンアップされた(最初と最後が/で閉じられた、切り捨てられたなど)、アイテムのストア固有の正規パス名。

- std_change_time(UTCのTYPECODE_TIMESTAMP)
パス名のメタデータが最後に変更された時間。

- std_children(TYPECODE_NUMBER)
ディレクトリ/フォルダ・パスにある子ディレクトリ/フォルダの数(このプロパティは、feature_foldersをサポートするプロバイダで使用できる必要があります)。

- std_content_type(TYPECODE_VARCHAR2)
パス名(通常type_file)を記述する、クライアントで提供されるMIMEタイプ(標準RFC構文)。コンテンツ・タイプは、ストアにより必ず解析されるとはかぎりません。

- std_creation_time(UTCのTYPECODE_TIMESTAMP)
アイテムが作成された時間(1回設定されると、この値はパス名の存続期間を通して変更されません)。

- std_deleted(booleanのTYPECODE_NUMBER)
パス名がソフト削除(この機能については前述を参照)されたがパージされていない場合、ゼロ以外の数字に設定します。

- std_guid(TYPECODE_NUMBER)
パス名に対するストア固有の一意の識別子。クライアントは、異なるストア間で一意であるGUIDに依存できませんが、指定された(store-name、store-specific-pathname)には、その存続期間を通して一定かつ一意のGUIDがあります。

- std_length(TYPECODE_NUMBER)
type_fileまたはtype_referenceパスのコンテンツの長さ(BLOB)、またはtype_linkシンボリック・リンクの対象の長さ。ディレクトリの長さは正しく定義されていないため、ストアでは、このプロパティをゼロ、nullまたはその他の任意の値に設定できます。

- std_modification_time(UTCのTYPECODE_TIMESTAMP)
パス名に関連付けられたデータが最後に変更された時間。type_fileまたはtype_referenceパスのコンテンツの変更、type_linkパスの対象の変更、およびtype_directoryパスの直接の子の追加/削除により、すべての構成データが変更されます。

- std_owner(TYPECODE_VARCHAR2)
パス名に対する、クライアントが提供する(暗黙的な)所有者名。所有者名は、ACLまたはロック(あるいはその両方)をサポートするストアによるチェックへのアクセスで(現在のプリンシパルとともに)使用されます。

- std_parent_guid(TYPECODE_NUMBER)
パス名の親に対するストア固有の一意の識別子です。クライアントは、異なるストア間で一意であるGUIDに依存できませんが、指定された(store-name、store-specific-pathname)には、その存続期間を通して一定かつ一意のGUIDがあります。

- std_parent_guid (pathname == std_guid(parent(pathname))):

- std_referent(TYPECODE_VARCHAR2)
type_linkパスのシンボリック・リンクのコンテンツ、それ以外の場合はnull。前述のとおり、std_referentは任意の文字列になることができ、必ずしもクライアントでパス名として解釈される必要はありません(このような解釈を行う場合は十分な注意が必要です)。

DBMS_DBFS_CONTENT定数および標準プロパティの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

オプション・プロパティ

オプション・プロパティは、正しく定義されているが、すべてのストアで自由に(しかしDBFSコンテンツAPIで記述されている方法でのみ)サポートされるすべてのコンテンツ・パス名に関連付けられた必須ではないプロパティです。オプション・プロパティをまったくサポートしないストアに対応できるように、クライアントを準備する必要があります。

すべてのオプション・プロパティでは、非公式に、opt:ネームスペースが使用されます。クライアントおよびストアで、独自のプロパティの定義にこのネームスペースを使用すると、将来競合が発生する原因となるため、このネームスペースの使用は避ける必要があります。

次のオプション・プロパティのメニューは、長期にわたって拡張される必要があります。

- opt_hash_type(TYPECODE_NUMBER)
opt_hash_valueプロパティ内で指定されるハッシュのタイプ。使用可能なオプションはdbms_cryptoを参照してください。

- opt_hash_value(TYPECODE_RAW)
パス名のコンテンツを説明するタイプopt_hash_valueのハッシュ値。

- opt_lock_count(TYPECODE_NUMBER)
パス名に対して行われた(互換)ロックの数。パスに対して異なるプリンシパルで互換(読取り)ロックを行うことが可能な場合、opt_lockerで(ロック件数が正しく保持されように繰り返して)すべてのロッカーを指定する必要があります。

- opt_lock_data(TYPECODE_VARCHAR2)
ストアで解析されない、クライアントが指定したユーザー・ロックに関連付けられたユーザー・データ。

- opt_locker(TYPECODE_VARCHAR2)
パス名に対してユーザー・ロックを適用する、暗黙的またはクライアントが指定したプリンシパル。

- opt_lock_status(TYPECODE_NUMBER)
現在パス名に対して適用されているロックのタイプを説明する値(lock_read_only、lock_write_only、lock_read_write)のいずれか1つ。

- opt_version(TYPECODE_NUMBER)
パス名の線形バージョニングの順序番号。

- opt_version_path(TYPECODE_VARCHAR2)
パス名の階層バージョニングのバージョン・パス名。

DBMS_DBFS_CONTENT定数およびオプション・プロパティの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

プロパティ・アクセス・フラグ

プロパティを取得および設定するDBFSコンテンツAPIメソッドでは、プロパティ・アクセス・フラグを組み合せて使用して、単一APIコール内の異なるネームスペースからプロパティをフェッチできます。

- prop_none
クライアントがいずれのプロパティも必要としないが、別の理由(パス名の存在/ロック可能性の検証、データ・アクセスなど)によりコンテンツ・アクセス・メソッドを呼び出している場合に使用します。

- prop_std
クライアントが標準プロパティを必要とする場合に使用します。このフラグが指定されると、すべての標準プロパティが取得されます。

- prop_opt
クライアントがオプション・プロパティを必要とする場合に使用します。このフラグが指定されると、すべてのオプション・プロパティが取得されます。

- prop_usr
クライアントがユーザー定義プロパティを必要とする場合に使用します。このフラグが指定されると、すべてのユーザー定義プロパティが取得されます。

- prop_all
すべての標準、オプションおよびユーザー定義プロパティの組合せの別名です。

- prop_data
クライアントがデータ・アクセスのみを必要とし、プロパティを必要としない場合に使用します。

- prop_spc
クライアントで各種プロパティ・ネームスペースの異なるサブセットの組合せが必要とされ、フェッチする特定のプロパティの名前がDBFSコンテンツAPIメソッド・コールに引数として渡され、これらのプロパティ値のみがフェッチされてクライアントに戻される場合に使用します。これは、アクセス可能なプロパティが多数あるが、クライアントが必要とするプロパティはその内の少数である(そして事前にそれらのプロパティ名がわかっている)場合に役立ちます。

prop_spcは、各種のgetPath()操作にのみ適用可能です。プロパティを指定するその他の操作では、prop_spc指定は単純に無視されます。

DBMS_DBFS_CONTENT定数およびプロパティ・アクセス・フラグの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

例外

DBFSコンテンツAPI操作では、次のいずれかのトップレベルの例外が発生します。

クライアントでは、基礎となるエラー・シグナリング・コードの特定のストア実装を気にすることなく、エラー・ハンドラでこれらの特定の例外に対するプログラミングが可能です。

ストア・サービス・プロバイダは、必要に応じて内部例外を次の例外タイプのいずれかにトラップおよびラップするよう最大限を行う必要があります。

DBMS_DBFS_CONTENT定数およびオプション・コードの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

プロパティ・バンドル

- property_tレコード・タイプは、単一(値、タイプコード)プロパティ値タプルを説明し、プロパティ名は暗黙的です(次のコード・スニペットのproperties_tを参照)。

- properties_tは、名前で索引付けされたプロパティ・タプルのハッシュ表です。索引と値の間の暗黙的なハッシュ表の関連付けにより、クライアントでproperties_tの完全なdbms_dbfs_content_property_tタプルを作成できます。

dbms_dbfs_content_property_tとproperty_tはほぼ対応するものです。前者は完全プロパティ・タプルを説明するSQLオブジェクト・タイプであり、後者はプロパティ値コンポーネントのみを説明するPL/SQLレコード・タイプです。

dbms_dbfs_content_properties_tとproperties_t.はほぼ対応するものです。前者はSQLネスト表タイプであり、後者はPL/SQLハッシュ表タイプです。

動的SQLコール規則ではSQLタイプの使用を強制しますが、ハッシュ表タイプの点では、PL/SQLコードはより簡単に実装されます。

DBFSコンテンツAPIにより、dbms_dbfs_content_properties_tとproperties_t間の変換に便利なユーティリティ関数が提供されます(次のコード・スニペットを参照)。

PROPERTY_Tレコード・タイプの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

ストア記述子

- store_tは、DBFSコンテンツAPIに登録され、これらのAPIで管理されるストアを説明するレコードです(次の項の管理APIを参照)。

- mount_tは、ストア・マウント・ポイントおよびそのプロパティを説明するレコードです。

クライアントは、使用可能なストアのリストをDBFSコンテンツAPIに問合せ、指定のパス名へのアクセスを処理するストアを判別し、ストアの機能セットを判別できます。

STORE_Tレコード・タイプの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

管理および問合せAPI

管理クライアントおよびコンテンツ・プロバイダは、コンテンツ・ストアをDBFSコンテンツAPIに登録する必要があります。また、管理クライアントは、選択したトップレベルのネームスペースにストアをマウントする必要があります。

同じストアを複数回、別々のマウント・ポイントにマウントすることが可能であるため(これはクライアント制御下で行われる)、ストアの登録および登録解除は、ストアのマウントおよびアンマウントとは分離されます。

DBMS_DBFS_CONTENT内の管理メソッドは、DBMS_DBFS_CONTENT_ADMIN内の一致するメソッドに委任する単なるラッパーです。クライアントでは、いずれかのパッケージのメソッドを使用して、管理操作を実行できます。

DBMS_DBFS_CONTENTパッケージ・メソッドの概要は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

コンテンツ・ストアの登録

REGISTERSTORE()プロシージャでは、ストア・サービス・プロバイダとしてprovider_packageを使用するプロバイダによりバックアップされる新規のストアが登録されます(DBMS_DBFS_CONTENT_SPIパッケージ・シグネチャに準拠)。

このメソッドは、新規ストアの作成後にサービス・プロバイダで使用されるように設計されています。ストア名は、一意にする必要があります。

REGISTERSTORE()メソッドの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

コンテンツ・ストアの登録解除

プロシージャUNREGISTERSTORE()により、(関連付けられたすべてのマウント・ポイントを無効にすることで)以前に登録されたストアが登録解除されます。登録を解除すると、ストア(およびそのマウント・ポイント)へのすべてのアクセスの動作は保証されなくなります(読取り一貫性により一時的にアクセスが継続する場合があります)。

ignore_unknown引数がtrueの場合、不明なストアを登録解除しても例外は発生しません。

UNREGISTERSTORE()メソッドの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

登録されたストアのマウント

プロシージャMOUNTSTORE()により、登録済ストアがマウントされてマウント・ポイントにバインドされます。

マウントされると、/store_mount/xyzの形式のパス名へのアクセスは、store_nameおよびそのコンテンツ・プロバイダにリダイレクトされます。

ストア・マウント・ポイントは一意であり、構文的に有効なパス名コンポーネントである必要があります(つまり/が埋め込まれていないname_t)。

マウント・ポイントが指定されていない場合(つまりnull)、DBFSコンテンツAPIでは、ストア名自体をマウント・ポイント名として使用します(一意性および構文的な制約の対象)。

空の特別なマウント・ポイントは単一ストアで使用可能です。つまり、DBFSコンテンツAPIが単一バックエンド・ストアを管理するシナリオです。そのような場合、これらのアクセスのリダイレクト方法は明確であるため、クライアントは/xyzの形式の完全パス名を直接処理できます。

単一マウント・ポイントは、singletonブール引数で示され、store_mount引数は無視されます。

同一のストアを別々のマウント・ポイントで複数回マウントできます。

マウント・プロパティを使用して、DBFSコンテンツAPI実行環境、つまり特定のマウント・ポイントのプリンシパル、所有者、ACLおよびasofのデフォルト値を指定できます。また、マウント・プロパティを使用して、読取り専用ストアも指定できます。

MOUNTSTORE()メソッドの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

以前にマウントされたストアのアンマウント

プロシージャUNMOUNTSTORE()により、名前またはマウント・ポイントのいずれかで以前にマウントされたストアがアンマウントされます。単一のストアは、マウント・ポイントがないため、ストア名によってのみアンマウントできます。名前によりストアをアンマウントしようとすると、そのストアに関連付けられているすべてのマウント・ポイントがアンマウントされます。

アンマウントすると、ストア(またはマウント・ポイント)へのすべてのアクセスの動作は保証されなくなります(読取り一貫性により一時的にアクセスが継続する場合があります)。ignore_unknown引数がtrueの場合、不明なストア/マウントを登録解除しても例外は発生しません。

UNMOUNTSTOREメソッドの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

使用可能なすべてのストアおよびその機能のリスト

LISTSTORE()関数により、使用可能なすべてのストアがリストされます。マウント・ポイントがストア自体から分離されているため、戻されたレコードのstore_mountフィールドは、nullに設定されます。

LISTSTORES関数の詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

使用可能なすべてのマウント・ポイントのリスト

LISTMOUNTS()関数により、使用可能なすべてのマウント・ポイント、そのバックアップ・ストアおよびストア機能がリストされます。単一マウントの結果、store_mountフィールドがnullに設定された単一行が戻されます。

LISTMOUNTS()メソッドの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

ルックアップ固有のストアおよびその機能

GETSTOREBYXXX()関数およびGETFEATUREBYXXX()関数により、パス名、ストア名またはマウント・ポイントが参照されます。

DBMS_DBFS_CONTENTメソッドの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

DBFSコンテンツAPIの領域使用量

クライアントではSPACEUSAGE()メソッドを使用して、ファイルシステムの領域使用量統計を問合せできます。プロバイダは、ストアに対してこのメソッドをサポートし、特にストアが複数の表、索引、LOBなどで構成される場合は、領域使用量をできるかぎり特定する必要があります。

- blksizeは、ストアを保持する通常の表領域ブロック・サイズであり、ブロック・サイズが異なる複数の表領域が使用されている場合、任意の有効なブロック・サイズが許容されます。

- tbytesは、ストアの合計サイズ(バイト単位)であり、fbytesはストアの空き/未使用サイズ(バイト単位)です。これらの値は、ストアを構成するすべてのセグメントから計算されます。

- nfile、ndir、nlinkおよびnrefにより、ストア内で現在使用可能なファイル、ディレクトリ、リンクおよび参照の数がカウントされます。

データベース・オブジェクトは動的に増加するため、空き領域と使用済領域の区分を測定するのは容易ではありません。

トップレベルのルート・ディレクトリで領域使用量を問い合せると、その下にある使用可能なすべての個別のストアの領域使用量を合計したサマリーが戻されます(同じストアが複数回マウントされていても、1回としてカウントされます)。

SPACEUSAGE()メソッドの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

DBFSコンテンツAPIのセッション・デフォルト

DBFSコンテンツAPIへの通常のクライアント・アクセスは、次で構成される暗黙的コンテキストで実行されます。

- 現在の操作を呼び出すprincipal。

- 現在の操作により(暗黙的または明示的に)作成されたすべての新規要素のowner。

- 現在の操作により(暗黙的または明示的に)作成されたすべての新規要素のACL。

- 基礎となる読取り専用操作(またはその読取り専用サブコンポーネント)が実行されるASOFタイムスタンプ。

このすべての情報は、引数によって各種のDBFSコンテンツAPIメソッド・コールに明示的に渡され、クライアントによって個別の操作のファイングレイン制御が可能になります。

また、DBFSコンテンツAPIによりクライアントは、デフォルトが明示的にオーバーライドされないすべての操作で自動的に継承されるコンテキストで、セッション期間のデフォルトを設定できます。

コンテキストのすべてのデフォルトはnullとして開始され、これらをnullに設定することでクリアできます。

DBMS_DBFS_CONTENTメソッドの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

DBFSコンテンツAPIのインタフェース・バージョニング

DBFSコンテンツAPI自体の進化を可能にするために、パブリックAPIが変更されるたびに内部的な数値APIバージョンが大きくなります。

GETVERSION()メソッドの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

パス名に対するDBFSコンテンツAPIの注意点

DBFSコンテンツAPIのクライアントでは、絶対パス名を介してストア・アイテムが参照されます。これらのパス名は、完全パス名(/mount_point/pathname形式の単一文字列)、またはストアで修飾されたパス名(store_name、pathnameの形式のタプルで、パス名のルートがストア・ネームスペース内にある)になります。

クライアントはそれぞれに適したネーミング・スキームのいずれかを使用し、プログラム内では両方のネーミング・メソッドを使用できます。

DBFSコンテンツAPIコールによってパス名が戻されると、戻される正確な値は、クライアントがコールで使用するネーミング・スキームに依存します。たとえば、完全修飾ディレクトリ名に対するリストまたは検索の場合、完全修飾パス名でアイテムが戻され、ストア修飾ディレクトリ名のリストまたは検索の場合は、ストア固有の(つまりストア修飾を意味する)パス名でアイテムが戻されます。

DBFSコンテンツAPIの実装では、これらの2つのネーミング・スキームの間の正規化および内部変換が内部的に管理されます。

DBFSコンテンツAPIの作成操作

DBFSコンテンツAPIにより、クライアントでディレクトリ、ファイル、リンクおよび参照要素(ストア機能のサポート対象)を作成できます。

すべての作成メソッドでは、有効なパス名が必要であり、パス名が作成されるときにプロパティがパス名と関連付けられるようオプションとして指定できます。std_creation_timeなど、自動的に生成されたプロパティがただちにクライアントに使用可能になるように、作成完了後にクライアントが項目のプロパティをフェッチ・バックすることも可能です。フェッチ・バックされる正確なプロパティのセットは、prop_flagsにある様々なprop_xxxビット・マスクによって制御されます。

リンクおよび参照には、プライマリ・パス名と関連付けるための追加パス名が必要です。ファイル・パス名では、オプションでBLOB値を指定して、基礎となるファイルのコンテンツを最初に移入するために使用できます(指定されるBLOBは、一時LOBまたは永続LOBの任意の有効なLOBです)。prop_flagsでprop_dataが指定されている場合は、作成時に基礎となるLOBがクライアントに戻されます。

ディレクトリ以外のパス名では、親ディレクトリを最初に作成する必要があります。ディレクトリ・パス名自体を再帰的に作成できます。つまり、ディレクトリまでつながるパス名階層を1回のコールで作成できます。

既存のパスを作成しようとするとエラーが発生します。例外はソフト削除されたパス名です。この場合、ソフト削除されたアイテムは暗黙的にパージされ、新しいアイテムの作成が試行されます。

DBMS_DBFS_CONTENT()メソッドの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

DBFSコンテンツAPIの削除操作

DBFSコンテンツAPIにより、クライアントでディレクトリ、ファイル、リンクおよび参照要素(ストア機能のサポート対象)を削除できます。

デフォルトでは、削除は永続的で、トランザクション・コミットで正常に削除されたアイテムを削除します。ただし、リポジトリではソフト削除の機能もサポートされます。クライアントのリクエストがあれば、ソフト削除されたアイテムはストアで保持されます。ただし、通常のリストや検索では表示されません。ソフト削除されたアイテムは、リストアまたは明示的なパージが可能です。

ディレクトリ・パス名は再帰的に削除できます(つまり、ディレクトリの下のパス名階層を1回のコールで削除できます)。再帰的でない削除は、空のディレクトリでのみ実行できます。再帰的なソフト削除では、削除されるすべてのアイテムにソフト削除が適用されます。

個別のパス名(またはディレクトリ下のソフト削除されたすべてのパス名)は、RESTOREXXX()メソッドおよびPURGEXXX()メソッドを使用してリストアまたはパージできます。

フィルタリングをサポートするプロバイダでは、プロバイダ・フィルタを使用して削除するアイテムのサブセットを識別できます。これにより、deleteDirectory()、RESTOREALL()、PURGEALL()などの一括操作が可能になりますが、削除に関連するすべての操作でフィルタ引数を受け入れることになります。

DBMS_DBFS_CONTENTメソッドの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

DBFSコンテンツAPIパスのgetおよびput操作

既存のパス・アイテムは、単純なGETXXX()メソッドおよびPUTXXX()メソッドにより、問合せまたは更新用にアクセスして変更が可能です。

すべてのパス名で、メタデータの読取りおよび変更が可能です。コールが完了したら、クライアントは特定のプロパティがprop_flagsでフェッチされるようリクエストできます。

ファイル・パス名では、データの読取りおよび変更が可能です。コールが完了したら、クライアントは、prop_flags内のprop_dataビット・マスクを使用して、データ・アクセスの続行に使用できる新しいBLOBロケータをリクエストできます。

また、BLOBロケータを使用せずに、明示的に論理オフセット、バッファ量および適切にサイズ設定されたバッファを指定することで、ファイルを読取りおよび書込みすることも可能です。

更新アクセスでは、forUpdateフラグを指定する必要があります。リンク・パス名へのアクセスは、derefフラグが指定されている場合、暗黙的および内部的にストアによる参照を解除できます(機能サポート対象)。シンボリック・リンクを解決できるとはかぎらないため、この操作は推奨されません。

forUpdateがfalseに設定された読取りメソッドGETPATH()では、有効なasofタイムスタンプ・パラメータを受け入れます。このパラメータをストアで使用して、フラッシュバック・スタイル問合せを実装できます。

GETPATH()およびPUTPATH()メソッドのバージョンの変異では、操作のasofモードはサポートされません。

DBFSコンテンツAPIでは、GETPATH()の後にCREATEXXX()を組み合せ、コールを介した適切なデータまたはメタデータの転送によりコピーを簡単に実装できるため、明示的なCOPY()操作はありません。これにより、ストア間でのコピーが可能ですが、内部化されたコピー操作ではこの機能は提供されません。

DBMS_DBFS_CONTENTメソッドの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

DBFSコンテンツAPIの名前変更および移動操作

パス名は、ディレクトリ階層およびマウント・ポイントを超えることはできますが、同一のストア内のみで名前変更または移動が可能です。

前にoldPathを介してアクセス可能だったディレクトリ以外のパス名は、newPathが存在しないと想定して、引き続きnewPathを介してアクセス可能な単一アイテムとして名前変更されます。

newPathが存在し、ディレクトリではない場合、名前変更によって、oldPathの名前が変更される前に、暗黙的に既存のアイテムが削除されます。newPathが存在するディレクトリである場合は、oldPathはターゲット・ディレクトリに移動されます。

前にoldPathを介してアクセス可能だったディレクトリ・パス名は、ディレクトリとそのすべての子をnewPathに移動(存在しない場合)することで、またはnewPathの子として移動(存在する場合)することで、名前が変更されます。

存在しないか存在するか、ディレクトリ・ターゲットでないかディレクトリ・ターゲットであるかに関する名前変更と移動操作のセマンティクスは複雑なため、クライアントは、より単純な移動やコピーのシーケンスとして、複雑な名前変更および移動操作を実装することを選択できます。

DBMS_DBFS_CONTENT.RENAMEPATH()メソッドの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

ディレクトリ・リスト

- list_item_tは(パス名、コンポーネント名、タイプ)のタプルで、ディレクトリ・リスト内の単一の要素を表します。

- path_item_tは、コンテンツ・ストア内の(ストア、マウント)修飾パスを説明するタプルで、すべての標準およびオプション・プロパティがこれに関連付けられます。

- prop_item_tは、コンテンツ・ストア内の(ストア、マウント)修飾パスを説明するタプルで、すべてのユーザー定義プロパティがこれに関連付けられ、個別の(名前、値、タイプ)のタプルに拡張されます。

データ構造の詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

DBFSコンテンツAPIのディレクトリ・ナビゲーションおよび検索

DBFSコンテンツAPIのクライアントでは、ディレクトリ・パス名をリストまたは検索可能できます。またオプションで、サブディレクトリへの再帰、ソフト削除されたアイテムの表示、指定されたタイムスタンプのasofフラッシュバックの使用、リストまたは検索述語に基づくストア内のアイテムのフィルタ・インとフィルタ・アウトが可能です。

DBFSコンテンツAPIでは、現在、リスト・アイテムのみが戻されます。クライアントはgetPath()メソッドのいずれかを明示的に使用して、アイテムに関連付けられたプロパティまたはコンテンツに適切にアクセスする必要があります。

DBMS_DBFS_CONTENTメソッドの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

DBFSコンテンツAPIのロック操作

DBFSコンテンツAPIのクライアントでは、ユーザー・レベルのロックを任意の有効なパス名に適用し(ストア機能のサポート対象)、ロックをユーザー・データに関連付けて、後でこれらのパス名のロックを解除できます。ロックされたアイテムのステータスは、各種オプション・プロパティを介して使用可能です。

ロックおよびロック解除操作を整合性のある方法で実行することは、ストアの責任です(ユーザー定義のロック・チェックをサポートすることが前提)。

DBMS_DBFS_CONTENTメソッドの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

DBFSコンテンツAPIの抽象化操作

DBFSコンテンツAPIのすべての操作は、抽象opcodesとして表されます。クライアントでは、これらのopcodesを使用して、直接および明示的にCHECKACCESS()メソッドを呼び出し、特定の操作が特定のパス名に対する指定のプリンシパルによって起動されるかどうかを確認します。

op_acl()は、std_aclプロパティを指定するop_create()コールまたはop_put()コールの際に起動される暗黙的操作です。の操作では、プリンシパルでストア・アイテムのACLを設定または変更可能かどうかがテストされます。

ソフト削除、パージおよびリストア操作はすべてop_delete()で表されます。

名前変更または移動操作のソースおよび宛先となる操作は分離されますが、ストアではこれらのopcodeを自由に統合できます。また、名前の変更を、削除と作成の組合せとして処理することもできます。

op_storeは、その他の操作APIのいずれにもあてはまらない様々なストア操作のcatch-allカテゴリです。

DBMS_DBFS_CONTENT定数-操作コードの詳細は、「DBFSコンテンツAPIのアクセス・チェック」および『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

DBFSコンテンツAPIのアクセス・チェック

関数CHECKACCESS()は、指定のパス名(path、pathtype、store_name)が、principalによる操作(各種op_xxx opcodeを参照)で操作可能かどうかをチェックします。

これはクライアントにとって便利な関数です。アクセス制御をサポートするストアであっても、これらのチェックが内部的に実行されて、セキュリティが保証されます。

DBMS_DBFS_CONTENTメソッドの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

DBFSコンテンツAPIのパスの正規化

関数NORMALIZEPATH()では、次の手順を実行します。

1. パス名が/で始まる絶対パスであることを確認します。

2. 複数の連続する/を1つの/に縮小します。

3. 末尾の/を外します。

4. ストア固有の正規化されたパス名を、親パス名と末尾のコンポーネント名の2つのコンポーネントに分割します。

5. 正規化された完全修飾パス名を、ストア名、親パス名、末尾のコンポーネント名の3つのコンポーネントに分割します。

ルート・パス/は特殊です。その親のパス名も/であり、そのコンポーネント名はnullです。完全修飾モードでは、名前に正しいストア名が戻される単一マウントが作成されていないかぎり、ストア名はnullです。

戻り値は、常に完全に正規化されたストア固有のパス名であるか、完全修飾のパス名です。

DBMS_DBFS_CONTENT.RENAMEPATH()メソッドの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

DBFSコンテンツAPIの統計サポート

DBFSコンテンツAPI統計は、永続的な収集および維持にコストがかかります。DBFSでは、メモリー内のバッファ統計が最大flush_timeのセンチ秒、または最大flush_countの操作(先に到達したいずれかの制限)だけサポートされ、その時点でバッファは暗黙的にディスクにフラッシュされます。

クライアントは、flushStatsを使用して明示的にフラッシュを起動することもできます。暗黙的フラッシュは、統計収集が無効の場合にも発生します。

setStatsを使用すると、統計の収集を有効および無効にでき、クライアントはオプションで、時間およびカウント・パラメータにnull以外の値を指定して、フラッシュ設定を制御できます。

DBMS_DBFS_CONTENTメソッドの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

DBFSコンテンツAPIのトレース・サポート

DBFSコンテンツAPIは汎用トレース機能で、すべてのDBFSコンテンツAPIユーザー(クライアントおよびプロバイダの両方)で使用可能です。DBFSコンテンツAPIディスパッチャ自体で、トレース機能が使用されます。

トレース情報は、トレース・レベル/引数で指定された様々な詳細レベルで、フォアグラウンド・トレース・ファイルに書き込まれます。グローバル・トレース・レベルには、severityおよびdetailの2つのコンポーネントがあります。これらは付加ビット・マスクと考えることができます。

severityでは、他のコンポーネントの低レベルのトレースと比較して、高レベルを分離することが可能で、トレースの量を必要に応じて増やすことができます。個々のレベルに関連付けられたセマンティクスはないため、ユーザーは任意の重大度を選択してトレース・レベルを設定できますが、一般的には、高レベルのAPI入出力トレースでは重大度1を使用し、内部操作では重大度2を、非常に低レベルのトレースでは重大度3以上を使用します。

detailにより、それぞれのトレース・レコードとともにトレースでレポートされるタイムスタンプ、ショートスタックなどの追加情報の量が制御されます。例7-1は、DBFSコンテンツAPIを使用してトレースを有効にする方法を示しています。

例7-1 DBFSコンテンツのトレース

function    getTrace
return  integer;
procedure   setTrace(
trclvl      in              integer);
function    traceEnabled(
sev         in              integer)
return  integer;
procedure   trace(
sev         in              integer,
msg0        in              varchar2,
msg1        in              varchar     default '',
msg2        in              varchar     default '',
msg3        in              varchar     default '',
msg4        in              varchar     default '',
msg5        in              varchar     default '',
msg6        in              varchar     default '',
msg7        in              varchar     default '',
msg8        in              varchar     default '',
msg9        in              varchar     default '',
msg10       in              varchar     default '');

DBMS_DBFS_CONTENTメソッドの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

リソースおよびプロパティ・ビュー

次のビューでは、コンテンツAPIの構造およびプロパティについて説明します。

- DBFS_CONTENTビューについては、『Oracle Databaseリファレンス』を参照してください。

- DBFS_CONTENT_PROPERTIESビューについては、『Oracle Databaseリファレンス』を参照してください。

8 DBFS SecureFilesストア

この項の内容は次のとおりです。

- DBFS SecureFilesストア・パッケージ(DBMS_DBFS_SFS)

- DBFS SecureFilesストア・ファイルシステムの使用

DBFS SecureFilesストア・パッケージ(DBMS_DBFS_SFS)

このパッケージは、DBFSコンテンツAPIのストア・プロバイダで、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』に記載されているDBMS_DBFS_CONTENT_SPIで定義されるプロバイダSPIに準拠します。

詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

新しいSecureFilesストアの作成および登録

プロシージャCREATEFILESYSTEM()では、新しいSecureFilesストア・ファイルシステム・ストアstore_nameを、スキーマschema_name(デフォルトで現在のスキーマに設定)に表tbl_nameとして作成します。この表は、表領域tbl_tbs(デフォルトでスキーマのデフォルト表領域に設定)内の表(および内部索引)と、表領域lob_tbs(デフォルトでtbl_tbsに設定)内のLOB列を使用します。

use_bfがtrueの場合、BasicFiles LOBが使用され、それ以外の場合、SecureFiles LOBが使用されます。

propsは、ストア・プロパティの構成で使用される(名前、値、タイプコード)のタプルの表です。現在、このようなプロパティは定義または使用されていませんが、参照実装の将来のバージョンのためにプレースホルダが存在します。

create_only引数がtrueの場合、ファイルシステムは作成されますが、現行ユーザーに登録されないため、DBMS_DBFS_SFS_ADMIN.registerFilesystemを個別に(同じユーザーまたは別のユーザーが)コールして、ファイルシステムをプロバイダ操作で表示できるようにすることが必要です。

プロシージャの実行は、DDLに類似しています(実行の前後に自動コミット)。メソッドcreateStore()はcreateFilesystem()のラッパーです。

DBMS_DBFS_SFSの使用の詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

SecureFilesストアの初期化または再初期化

プロシージャINITFS()は、SecureFilesストアstore_nameに関連付けられた表を切り捨てて、再初期化します。プロシージャの実行は、DDLに類似しています(実行の前後に自動コミット)。

DBMS_DBFS_SFSメソッドの詳細は、Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

SecureFilesストア・ファイルシステム・ストアの登録解除および削除

ファイルシステムを参照するすべてのストアは、メタデータ表から削除され、基礎となるファイルシステム表自体が削除されます。プロシージャの実行は、DDLに類似しています(実行の前後に自動コミット)。

DBMS_DBFS_SFSメソッドの詳細は、Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

SecureFilesストア・ファイルシステムの使用

この項では、SecureFilesストア・ファイルシステムの作成方法について説明します。

権限の管理

権限の管理手順:

1. DBFSコンテンツAPIターゲット・ユーザーを作成または選択します。
たとえば、DBFSコンテンツAPIを、データベース・ユーザー/パスワードuser1/password1、user2/password2およびsfs_demo/password3として使用するとします。これらのデータベース・ユーザーには、少なくともCREATE SESSION、RESOURCEおよびCREATE VIEWの権限が必要です。

操作のためのコンテンツAPIおよびストアへのアクセスでは、常に標準のデータベース・ユーザーを使用します。DBFSコンテンツAPIの操作にSYSやSYSTEMユーザー、あるいはSYSDBA / SYSOPERロールは使用しないでください。

2. dbfs_roleロールを、これらのユーザーにそれぞれ付与します。dbfs_roleにより、DBFSコンテンツAPIの使用が許可されるユーザーが制御され、間接的に追加の権限がターゲット・ユーザーに付与されます。
このロールがないと、データベース・ユーザーはDBFSコンテンツAPIを使用できません。適切な管理権限(SYSDBA)を持つユーザーが、必要に応じて追加のユーザーにロールを付与できます。

connect / as sysdba
grant dbfs_role to user1;
grant dbfs_role to user2;
grant dbfs_role to sfs_demo;

これにより、dbfs_roleを持つデータベース・ユーザー用にDBFSコンテンツAPIが設定されます。

データベースでのロール、アクセス制御および定義者/実行者権限の相互作用に応じて、DBFSコンテンツAPIタイプ(DBMS_DBFS_CONTENT_接頭辞を持つSQLタイプ)およびパッケージ(通常はDBMS_DBFS_CONTENTおよびDBMS_DBFS_SFSのみ)の各種の権限(ほとんど常に実行権限)を、本来dbfs_roleを持つユーザーに明示的に付与することが必要な場合があります。

これらの明示的および直接的な付与は、一般的な必要とされる処理であり、必要またはリクエストに応じて行われます。

SecureFilesファイルシステム・ストアの作成

SecureFilesファイルシステム・ストアの作成手順:

1. DBFS CAPIを使用して、アクセスで必要なストアを次のように作成します。

declare
begin
dbms_dbfs_sfs.createFilesystem(
store_name => 'FS1',
tbl_name => 'T1',
tbl_tbs => null,
use_bf => false
);
commit;
end;
/

条件:

- store_nameは、任意のユーザー固有の名前です。

- tbl_nameは、現在のスキーマで作成された有効な表名です。

- tbl_tbsは、索引、LOB、ネストした表などのストア表および依存セグメントに使用される有効な表領域の名前です。デフォルトはNULLで、現在のスキーマの表領域を指定します。

2. これらのファイルシステムを、SecureFilesストアで管理される新規ストアとしてDBFS CAPIに登録します。

connect sfs_demo/******
declare
begin
dbms_dbfs_content.registerStore(
store_name    => 'FS1',
provider_name => 'anything',
provider_package => 'dbms_dbfs_sfs'
);
commit;
end;
/

この操作では、SecureFilesストアFS1とdbms_dbfs_sfsプロバイダが関連付けられます。

条件:

- store_nameは、表SFS_DEMO.T1を使用するSecureFilesストアFS1です。

- provider_nameは無視されます。

- provider_packageはdbms_dbfs_sfsで、SecureFilesストアの参照プロバイダ用です。

3. ストアを適切なマウント・ポイントにマウントします。

connect sfs_demo/******
declare
begin
dbms_dbfs_content.mountStore(
store_name    => 'FS1',
store_mount   => 'mnt1'
);
commit;
end;
/

条件:

- store_nameは、表SFS_DEMO.T1を使用するSecureFilesストアFS1です。

- store_mountはマウント・ポイントです。

4. (オプション)前述の手順の結果を確認するには、次の文のいずれかを使用します。

- SecureFilesストア表およびファイルシステムを確認する場合

select * from table(dbms_dbfs_sfs.listTables);
select * from table(dbms_dbfs_sfs.listFilesystems);

- ContentAPIストアおよびマウントを確認する場合

select * from table(dbms_dbfs_content.listStores);
select * from table(dbms_dbfs_content.listMounts);

- SecureFilesストア機能を確認する場合

var fs1f number;
exec :fs1f := dbms_dbfs_content.getFeaturesByName('FS1');
select * from table(dbms_dbfs_content.decodeFeatures(:fs1f));

- リソースおよびプロパティ・ビューを確認する場合

select * from dbfs_content;
select * from dbfs_content_properties;

DBMS_DBFS_SFSパッケージ・メソッドを使用する場合でも、SecureFilesストア・ファイルシステムのデータを保持する表には直接アクセスしないでください。ファイルシステムにアクセスする正しい方法は、手続き型操作の場合はDBFSコンテンツAPI(DBMS_DBFS_CONTENTメソッド)を、SQL操作の場合はリソース/プロパティ・ビュー(dbfs_contentおよびdbfs_content_properties)を使用する方法です。

SecureFiles LOBとBasicFiles LOBの比較

SecureFiles LOBは、Oracle Database 11gリリース1以上でのみ使用できます。それより前のリリースでは使用できません。

SecureFiles LOBを使用するには、11.1.0.0以上の互換性が必要です。

SecureFiles LOBを使用するには、DBMS_DBFS_SFS.CREATEFILESYSTEMでuse_bf => falseを指定します。

BasicFiles LOBを使用するには、DBMS_DBFS_SFS.CREATEFILESYSTEMでuse_bf => trueを指定します。

SecureFilesストア・ファイルシステムの初期化

SecureFilesストア・ファイルシステム・ストアを初期化および再初期化します。次の例では、ファイルシステムFS1および表"SFS_DEMO"."T1"を使用します。

connect sfs_demo/******;
exec dbms_dbfs_content.initFS(store_name => 'FS1');

SecureFilesストア・ファイルシステムの削除

SecureFilesストア・ファイルシステムの削除手順:

1. ストアをアンマウントします。

connect sfs_demo/******;
declare
begin
dbms_dbfs_content.unmountStore(
store_name    => 'FS1',
store_mount   => &#8216;mnt1&#8217;
);
commit;
end;
/

条件:

- store_nameは、表SFS_DEMO.T1を使用するSecureFilesストアFS1です。

- store_mountはマウント・ポイントです。

2. ストアを登録解除します。

connect sfs_demo/******;
exec dbms_dbfs_content.unregisterStore(store_name => 'FS1');
commit;

store_nameは、表SFS_DEMO.T1を使用するSecureFilesストアFS1です。

3. ファイルシステムを削除します。

connect sfs_demo/******;
exec dbms_dbfs_sfs.dropFilesystem(store_name => 'FS1');
commit;

store_nameは、表SFS_DEMO.T1を使用するSecureFilesストアFS1です。

DBFSコンテンツAPIの操作

前述の手順を実行してDBFSコンテンツAPIを設定し、少なくとも1つのSecureFilesストア参照ファイルシステムをマウント・ポイント/mnt1の下に作成しマウントすると、例8-1のようにして新しいファイルおよびディレクトリ要素を作成できます。

例8-1 DBFSコンテンツAPIの操作

connect foo/******

declare
ret integer;
b   blob;
str varchar2(1000)  := '' || chr(10) ||

'#include <stdio.h>' || chr(10) ||
'' || chr(10) ||
'int main(int argc, char** argv)' || chr(10) ||
'{' || chr(10) ||
'    (void) printf("hello world\n");' || chr(10) ||
'    return 0;' || chr(10) ||
'}' || chr(10) ||
'';

begin
ret := dbms_fuse.fs_mkdir('/mnt1/src');
ret := dbms_fuse.fs_creat('/mnt1/src/hello.c', content => b);
dbms_lob.writeappend(b, length(str), utl_raw.cast_to_raw(str));
commit;
end;
/
show errors;

-- verify newly created directory and file
select pathname, pathtype, length(filedata),
utl_raw.cast_to_varchar2(filedata)
from dbfs_content
where pathname like '/mnt1/src%'
order by pathname;

ファイルシステムは、DBMS_DBFS_CONTENTを使用してPL/SQLから移入およびアクセスできます。ファイルシステムは、dbfs_contentおよびdbfs_content_propertiesビューを使用してSQLから読取り専用でアクセスできます。

ファイルシステムは、通常のファイルシステムAPIおよびUNIXユーティリティでFUSEを使用して、またはスタンドアロンのdbfs_clientツール(FUSEが使用不可または設定されていない環境)によって、移入およびアクセスできます。

9 DBFS階層ストア

この項では、階層ストアのウォレット管理およびRDMS_DBFS_HS PL/SQLパッケージの詳細について説明します。

この項の内容は次のとおりです。

- ウォレット管理

- DBMS_DBFS_HSを使用したストレージの管理

- DBMS_DBFS_HSパッケージのメソッド

- DBFS階層ストアのユーザー・ビュー

- DBMS_DBFS_HSの使用例

ウォレット管理

コマンドライン・ユーティリティmkstoreでは、ウォレットの作成およびシークレット・ストアの別名の追加を行います。次のコマンドを使用して、ウォレットを作成および管理します。

次のようにしてウォレットを作成します。

mkstore -wrl wallet_location -create

次のようにしてKEY別名を追加します。access_keyおよびsecret_keyを一重引用符で囲んで指定します。

mkstore -wrl wallet_location -createCredential alias 'access_key' 'secret_key'

次に例を示します。

mkstore -wrl /home/user1/mywallet -createCredential mykey 'abc' 'xyz'

次のようにしてKEY別名を削除します。

mkstore -wrl wallet_location -deleteCredential alias

次に例を示します。

mkstore -wrl /home/user1/mywallet -deleteCredential mykey

関連項目:

- ウォレットの作成および管理の詳細は、『Oracle Database Advanced Security管理者ガイド』を参照してください。

DBMS_DBFS_HSを使用したストレージの管理

Oracle Databaseファイルシステム階層ストア・パッケージ(DBMS_DBFS_HS)は、DBMSコンテンツの階層ストレージをサポートするDBMS_DBFS_CONTENTのストア・プロバイダです。DBFS階層ストア(DBFS HS)パッケージには、テープやAmazonS3 Webサービスのような外部ストレージ・デバイスのコンテンツ、およびデータベース内の関連するメタデータ(またはプロパティ)が格納されます。DBFS HSは、データベース表で頻繁にアクセスされるコンテンツをキャッシュして、パフォーマンスを向上させます。

DBMS_DBFS_HSパッケージをDBMS_DBFS_CONTENTパッケージと組み合せて使用すると、DBFSリンクを利用するSecureFiles LOBのための階層ストレージ管理を実装できます。このパッケージを使用して、使用頻度の低いデータをテープのような費用の小さい外部デバイスに移行できるため、より高価なデータベース・ディスクを頻繁にアクセスされるデータに使用して、ストレージの費用を大幅に削減できます。DBMS_DBFS_HSパッケージをストア・プロバイダとしてDBMS_DBFS_CONTENTパッケージにプラグインし、関連付けられた外部ストレージ・デバイスがテープの場合はテープ・ファイルシステムを、また関連付けられた外部ストレージ・デバイスがAmazon S3ストレージ・デバイスの場合はクラウド・ファイルシステムを実装できます。

DBMS_DBFS_HSパッケージにより、データベースの表やコンテンツの情報ライフサイクル管理(ILM)の際、テープをストレージ層として使用できるようになります。パッケージでは、Amazon S3のようなWebサービスを含む他の形式のストレージ・ターゲットもサポートされています。このサービスにより、ユーザーはテープまたはこれまでOracleでサポートされていなかったその他の形式のストレージにデータベースのデータを格納できます。テープまたはAmazon S3のデータはOracle Databaseの一部であり、すべての標準APIでアクセスできますが、データベースを介してのみアクセスできます。

DBMS_DBFS_HSは、情報ライフサイクル管理ソリューションのプリミティブを提供します。DBMS_DBFS_CONTENT_SPIインタフェースで定義されるCREATE、PUT、GETおよびDELETEなどのすべての重要なプリミティブは、DBMS_DBFS_HSパッケージで実装されます。

DBMS_DBFS_HSは、DBMS_DBFS_CONTENT_SPIで定義される方法を実装します。各ストアに関連付けられた外部ストレージ・デバイスおよびキャッシュを管理するために必要な追加インタフェースも用意されています。

関連項目:
DBMS_DBFS_HSパッケージの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

DBMS_DBFS_HSパッケージの定数

DBMS_DBFS_HSパッケージ PL/SQLの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

DBMS_DBFS_HSパッケージのメソッド

表9-1は、DBMS_DBFS_HS PL/SQL パッケージのメソッドをまとめています。

表9-1 DBMS_DBFS_HS Pl/SQLパッケージのメソッド

メソッド

説明

CREATESTORE()

DBFS HSストアを作成します。

DROPSTORE()

以前に作成したDBFS HSストアを削除します。

RECONFIGCACHE()

ストアで使用されているデータベース・キャッシュのパラメータを再構成します。

SETSTOREPROPERTY()

名前/値プロパティと登録済の階層ストアを関連付けます。

GETSTOREPROPERTY()

データベース内のストアのプロパティの値を取り出します。

CREATEBUCKET()

STORETYPE_AMAZON3ストアで使用するAWSバケットを作成します。

STOREPUSH()

ローカルにキャッシュ済のデータをアーカイブ・ストアにプッシュします。

CLEANUPUNUSEDBACKUPFILES()

コンテンツがない外部ストレージ・デバイスで作成されたファイルを削除します。

REGISTERSTORECOMMAND()

ストアに対するコマンド(メッセージ)を登録し、外部ストレージ・デバイスのメディア・マネージャに送信します。

DEREGSTORECOMMAND()

ストアに関連付けられたコマンド(メッセージ)を削除します。

SENDCOMMAND()

外部ストレージ・デバイスのメディア・マネージャにコマンド(メッセージ)を送信します。

CREATESTORE()

このメソッドを使用すると、store_nameという名前でタイプstore_type(STORETYPE_TAPEまたはSTORETYPE_AMAZONS3)の新しいDBFS HSストアをスキーマschema_name(デフォルトで現在のスキーマに設定)に作成できます。これは、表領域tbs_spaceの呼出し側のセッションuser.tbl_nameの所有権の下に作成され、database.cache_sizeの領域量でストア・エントリを保持して、コンテンツのキャッシュに使用されます。

ストア名は、所有者に対して一意である必要があります。ただし、異なる所有者が所有する別のストアで、同じストア名を使用することはできます。

現在、CREATESTORE()では、ストアの特定のプロパティがデフォルト値に設定されています。ユーザーは、メソッドSETSTOREPROPERTY()およびRECONFIGCACHE()を使用して、プロパティ値を適切に変更したり、ストアのその他のプロパティを設定できます。

詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

DROPSTORE()

このメソッドを使用すると、以前にstore_nameという名前で作成され、呼出し元のsession_userにより所有されているDBFS HSストアが削除されます。

このメソッドは、DBFSコンテンツAPI(DBMS_DBFS_CONTENTパッケージ)からストアの登録を解除します。指定されたストアのすべてのファイルは、ストア(テープまたはAmazon S3 Webサービス)から削除されます。データベース内のストアのエントリを保持するデータベース表もまた、このメソッドにより削除されます。

このメソッドの実行は、DDLに類似しています(実行の前後に自動コミットされる)。

詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

RECONFIGCACHE()

このプロシージャでは、ストアで使用されているデータベース・キャッシュのパラメータが再構成されます。

階層ストアでは、レベル1キャッシュおよびレベル2キャッシュが使用されます。レベル1キャッシュにはほとんどの作業セットが含まれ、レベル2キャッシュはバックエンド・デバイスへの一括書込みに使用されます。

DBMS_DBFS_HSパッケージは、同時実行性を促進するために、レベル2キャッシュに対して複数のtarballに相当するサイズをオプティミスティックに割り当てようとしますが、レベル2キャッシュには少なくとも1つのtarballのサイズが必要です。

累積キャッシュ・サイズおよびLOBキャッシュ割当て制限の値により、2つのキャッシュ領域の割当てが決まります。値が指定されていない場合、INSUFFICIENT CACHE例外が発生する可能性があります。そのような場合、作業ストアを使用できるよう、キャッシュ・パラメータを修正することをお薦めします。

このサブプログラムが正常に実行されると、その動作はユーザーによりロールバックできません。そのような場合は、新規または変更済のパラメータを使用して、RECONFIGCACHEを再度コールする必要があります。

詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

SETSTOREPROPERTY()

このメソッドを使用すると、階層ストアに登録されたストアにプロパティが関連付けられます。各プロパティは、名前/値ペアです。

このメソッドの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』、このメソッドで使用されるDBMS_DBFS_HS定数の詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

DBFS階層ストアはファイルを圧縮形式で格納する機能があります。圧縮は、プロパティPROPNAME_COMPRESSLVLを使用して有効にできます。このプロパティはファイルの圧縮に使用する圧縮レベルを指定します。次の4つの許可された値のいずれかにできます: PROPVAL_COMPLVL_NONEは圧縮なしを示し、PROPVAL_COMPLVL_LOWはLOW圧縮を示し、PROPVAL_COMPLVL_MEDIUMはMEDIUM圧縮を示し、PROPVAL_COMPLVL_HIGHはHIGH圧縮を示します。

通常、圧縮レベルLOWを使用すると、適切な圧縮率と同時に最適なパフォーマンスを得ることが期待できます。圧縮レベルMEDIUMおよび圧縮レベルHIGHでは、圧縮率が大きく向上することが期待されますが、それに対応して圧縮時間が長くなることがあります。DBFS HSストア内のファイルが頻繁に更新される場合など、書込みのパフォーマンスが重要である場合は、NONEまたはLOWを使用することをお薦めします。領域が重要であるためにできるかぎり高い圧縮率が求められる場合は、MEDIUMまたはHIGHを使用してください。

ファイルはキャッシュからステージング領域へページ・アウトされて(バックエンドのテープやS3ストレージに順番にプッシュバックされる前に)圧縮されることに注意してください。したがって、圧縮によりステージング領域内に小さいファイルを格納でき、またステージング領域の使用可能な容量を効果的に増加させることができます。

PROPNAME_ENABLECLEANUPONDELETE動作については、DBMS_DBFS_HSにより各ストアに対してジョブが作成され、未使用のファイルが外部ストレージから削除されます。デフォルトでは、ジョブはSTORETYPE_AMAZONS3では使用可能、STORETYPE_TAPEでは使用不可に設定されます。ENABLECLEANUPONDELETEプロパティがTRUEに設定されると、ジョブは使用可能、FALSEに設定されると使用不可になります。ジョブが使用可能な場合、デフォルトではジョブは1時間間隔で実行されます。DBMS_SCHEDULERパッケージを使用して、スケジュールを変更できます。ジョブの名前は、prop_name = 'DELJOB_NAME'でUSER_DBFS_HS_FIXED_PROPERTIESを問い合せることで取得できます。

GETSTOREPROPERTY()

このメソッドにより、PropertyNameで識別されるデータベース内のストアのプロパティ値が取得されます。

詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

CREATEBUCKET()

タイプSTORETYPE_AMAZONS3のストアに関連付けられたS3バケットは、DBFS HSがコンテンツをそのバケットに移動する際に存在している必要があります。

S3バケットを作成する1つの方法として、DBMS_DBFS_HS.CREATEBUCKETメソッドを使用する方法があります。このメソッドをコールする前に、ストアのPROPNAME_BUCKETプロパティを設定する必要があります。

詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

STOREPUSH()

ローカルにキャッシュ済のデータをstorenameで識別されるアーカイブ・ストアにプッシュします。

詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

CLEANUPUNUSEDBACKUPFILES()

このメソッドにより、現在使用されているデータ(コンテンツ)がない外部ストレージ・デバイスで作成されたファイルが削除されます。このメソッドを周期的に(1週間に1回程度)実行して、外部ストレージ・デバイスの領域をクリアできます。外部ストレージ・デバイスから非同期にコンテンツを削除するのは、OLTPパフォーマンスに対する影響が最小であるため有用です。周期的スケジュールは、DBMS_SCHEDULERパッケージを使用して実行できます。

詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

REGISTERSTORECOMMAND()

クライアントはこのメソッドを使用して、ストアに対するコマンド(メッセージ)をDBFS HSに登録し、ストアに関連付けられた外部ストレージ・デバイスのメディア・マネージャに送信します。これらのコマンドは、次回のコンテンツの読取り/書込みの前に送信されます。DBFS HSは、ストレージ・デバイスにデータを送信またはストレージ・デバイスからデータを受信する場合、APIセッションを開始してデバイスと対話します。セッションの開始後、データの書込みまたは取得の前に、そのデバイスに対して登録されたすべてのコマンドをデバイスに送信します。

詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

DEREGSTORECOMMAND()

このメソッドを使用すると、REGISTERSTORECOMMANDを使用して以前にストアに関連付けられたコマンド(メッセージ)が削除されます。

詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

SENDCOMMAND()

これは、外部ストレージ・デバイスのメディア・マネージャで実行されるコマンド(メッセージ)を送信します。

詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

DBFS階層ストアのユーザー・ビュー

DBFS階層ストアの次のビューを使用できます。

USER_DBFS_HS_FILES

このビューでは、ユーザーによりアーカイブ済のファイル、およびバックエンド・デバイス上のそれらの場所が示されます。

関連項目:
『Oracle Databaseリファレンス』のUSER_DBFS_HS_FILESビュー

DBMS_DBFS_HSの使用例

パッケージDBMS_DBFS_HSを使用するには、DBAによりdbfs_roleが付与されている必要があります。

ストアの設定

ストアの設定手順:

1. createStoreをコールします。

DBMS_DBFS_HS.createStore( store_name, store_type, tbl_name, tbs_name, cache_size, lob_cache_quota, optimal_tarball_size, schema_name);

2. 必須およびオプションのプロパティを次のインタフェースを使用して設定します。

DBMS_DBFS_HS.setStoreProperty(StoreName, PropertyName, PropertyValue);

store_type = STORETYPE_TAPEの必須プロパティは次のとおりです。

PROPNAME_DEVICELIBRARY, PROPNAME_MEDIAPOOL, PROPNAME_CACHESIZE.

PROPNAME_CACHESIZE is already set by createStore.

setStorePropertyを使用して、PROPNAME_CACHESIZEの値を変更できます。

オプションのプロパティは次のとおりです。

PROPNAME_OPTTARBALLSIZE, PROPNAME_READCHUNKSIZE, PROPNAME_WRITECHUNKSIZE, PROPNAME_STREAMABLE.

store_type = STORETYPE_AMAZONS3の必須プロパティは次のとおりです。

PROPNAME_DEVICELIBRARY, PROPNAME_CACHESIZE, PROPNAME_S3HOST,PROPNAME_BUCKET, PROPNAME_LICENSEID, PROPNAME_WALLET.

PROPNAME_CACHESIZEは、createStoreにより設定済です。setStorePropertyを使用して、PROPNAME_CACHESIZEの値を変更できます。

オプションのプロパティは次のとおりです。

PROPNAME_OPTTARBALLSIZE, PROPNAME_READCHUNKSIZE, PROPNAME_WRITECHUNKSIZE, PROPNAME_STREAMABLE, PROPNAME_HTTPPROXY.

3. 次を使用して、ストアをDBFSコンテンツAPIに登録します。

DBMS_DBFS_CONTENT.registerStore(store_name, provider_name, provider_package);

4. 次を使用して、アクセスのためにストアをマウントします。

DBMS_DBFS_CONTENT.mountStore(store_name, store_mount, singleton,principal,   owner, acl, asof, read_only);

階層ストアの使用

階層ストアを、独立したファイルシステムまたはSecureFiles LOBのアーカイブ・ソリューションとして使用できます。

ファイルシステムとしての階層ストアの使用

DBMS_DBFS_CONTENTパッケージを使用して、ストア内のファイルシステム・エントリを作成、更新、読取りおよび削除します。

詳細は、DBMS_DBFS_CONTENTのドキュメントを参照してください。

SecureFiles LOBのアーカイブ・ソリューションとしての階層ストアの使用

DBMS_LOBパッケージを使用して、テープまたはS3ストア内のSecureFiles LOBをアーカイブします。

詳細は、DBMS_LOBのドキュメントを参照してください。

キャッシュ内の領域を解放、またはキャッシュ常駐コンテンツを外部ストレージ・デバイスに強制的に書き込むには、次をコールします。

DBMS_DBFS_HS.storePush(store_name);

階層ストアの削除

次をコールします。

DBMS_DBFS_HS.dropStore(store_name, opt_flags);

例: Amazon S3の使用

Amazon S3ストアを構成および使用するプログラムの例を次に示します。

<...>で示される場所を有効な値に置き換えて、プログラムを正しく実行する必要があります。

メソッドおよびそのパラメータの詳細は、DBMS_DBFS_HSのドキュメントを参照してください。

Rem Example to configure and use an Amazon S3 store.
Rem
Rem hsuser should be a valid database user who has been granted
Rem the role dbfs_role.

connect hsuser/hsuser

Rem The following block sets up a STORETYPE_AMAZONS3 store with
Rem DBMS_DBFS_HS acting as the store provider.

declare
storename varchar2(32) ;
tblname varchar2(30) ;
tbsname varchar2(30) ;
lob_cache_quota number := 0.8 ;
cachesz number ;
ots number ;
begin
cachesz := 50 * 1048576 ;
ots := 1048576 ;
storename := 's3store10' ;
tblname := 's3tbl10' ;
tbsname := '<TBS_3>' ; -- Substitute a valid tablespace name

-- Create the store.
-- Here tbsname is the tablespace used for the store,
-- tblname is the table holding all the store entities,
-- cachesz is the space used by the store to cache content
--   in the tablespace,
-- lob_cache_quota is the fraction of cachesz allocated
--   to level-1 cache and
-- ots is minimum amount of content that is accumulated
--   in level-2 cache before being stored in AmazonS3
dbms_dbfs_hs.createStore(
storename,
dbms_dbfs_hs.STORETYPE_AMAZONS3,
tblname, tbsname, cachesz,
lob_cache_quota, ots) ;

dbms_dbfs_hs.setstoreproperty(storename,
dbms_dbfs_hs.PROPNAME_SBTLIBRARY,
'<ORACLE_HOME/work/libosbws11.so>');
-- Substitute your ORACLE_HOME path

dbms_dbfs_hs.setstoreproperty(
storename,
dbms_dbfs_hs.PROPNAME_S3HOST,
's3.amazonaws.com') ;

dbms_dbfs_hs.setstoreproperty(
storename,
dbms_dbfs_hs.PROPNAME_BUCKET,
'oras3bucket10') ;

dbms_dbfs_hs.setstoreproperty(
storename,
dbms_dbfs_hs.PROPNAME_WALLET,
'LOCATION=file:<ORACLE_HOME>/work/wlt CREDENTIAL_ALIAS=a_key') ;
-- Substitute your ORACLE_HOME path

dbms_dbfs_hs.setstoreproperty(
storename,
dbms_dbfs_hs.PROPNAME_LICENSEID,
'<xxxxxxxxxxxxxxxx>') ; -- Substitute a valid SBT license id

dbms_dbfs_hs.setstoreproperty(
storename,
dbms_dbfs_hs.PROPNAME_HTTPPROXY,
'<http://www-proxy.mycompany.com:80/>') ;
-- Substitute valid value. If a proxy is not used,
-- then this property need not be set.

dbms_dbfs_hs.setstoreproperty(
storename,
dbms_dbfs_hs.PROPNAME_COMPRESSLEVEL,
'NONE') ;

dbms_dbfs_hs.createbucket(storename) ;

-- Please refer to DBMS_DBFS_CONTENT documentation
-- for details about this method
dbms_dbfs_content.registerstore(
storename,
's3prvder10',
'dbms_dbfs_hs') ;

-- Please refer to DBMS_DBFS_CONTENT documentation
-- for details about this method
dbms_dbfs_content.mountstore(
storename,
's3mnt10') ;
end ;
/

Rem The following code block does file operations
Rem using DBMS_DBFS_CONTENT on the store configured
Rem in the previous code block

connect hsuser/hsuser

declare
path varchar2(256) ;
path_pre varchar2(256) ;
mount_point varchar2(32) ;
store_name varchar2(32) ;
prop1 dbms_dbfs_content_properties_t ;
prop2 dbms_dbfs_content_properties_t ;
mycontent blob := empty_blob() ;
buffer varchar2(1050) ;
rawbuf raw(1050) ;
outcontent blob := empty_blob() ;
itemtype integer ;
pflag integer ;
filecnt integer ;
iter integer ;
offset integer ;
rawlen integer ;
begin

mount_point := '/s3mnt10' ;
store_name := 's3store10' ;
path_pre := mount_point ||'/file' ;

-- We create 10 empty files in the following loop
filecnt := 0 ;
loop
exit when filecnt = 10 ;
path := path_pre || to_char(filecnt) ;
mycontent := empty_blob() ;
prop1 := null ;

-- Please refer to DBMS_DBFS_CONTENT documentation
-- for details about this method
dbms_dbfs_content.createFile(
path, prop1, mycontent) ; -- Create the file

commit ;
filecnt := filecnt + 1 ;
end loop ;

-- We populate the newly created files with content
-- in the following loop
pflag := dbms_dbfs_content.prop_data +
dbms_dbfs_content.prop_std  +
dbms_dbfs_content.prop_opt  ;

buffer := 'Oracle provides an integrated management '  ||
'solution for managing Oracle database with '||
'a unique top-down application management '  ||
'approach. With new self-managing '          ||
'capabilities, Oracle eliminates time-'      ||
'consuming, error-prone administrative '     ||
'tasks, so database administrators can '     ||
'focus on strategic business objectives '    ||
'instead of performance and availability '   ||
'fire drills. Oracle Management Packs for '  ||
'Database provide signifiCant cost and time-'||
'saving capabilities for managing Oracle '   ||
'Databases. Independent studies demonstrate '||
'that Oracle Database is 40 percent easier ' ||
'to manage over DB2 and 38 percent over '    ||
'SQL Server.';

rawbuf := utl_raw.cast_to_raw(buffer) ;
rawlen := utl_raw.length(rawbuf) ;
offset := 1 ;
filecnt := 0 ;
loop
exit when filecnt = 10 ;
path := path_pre || to_char(filecnt) ;
prop1 := null;

-- Append buffer to file
-- Please refer to DBMS_DBFS_CONTENT documentation
-- for details about this method
dbms_dbfs_content.putpath(
path, prop1, rawlen,
offset, rawbuf) ;

commit ;
filecnt := filecnt + 1 ;
end loop ;

-- Clear out level 1 cache
dbms_dbfs_hs.flushCache(store_name) ;
commit ;

-- Do write operation on even-numbered files.
-- Do read operation on odd-numbered files.
filecnt := 0 ;
loop
exit when filecnt = 10;
path := path_pre || to_char(filecnt) ;
if mod(filecnt, 2) = 0 then
-- Get writable file
-- Please refer to DBMS_DBFS_CONTENT documentation
-- for details about this method
dbms_dbfs_content.getPath(
path, prop2, outcontent, itemtype,
pflag, null, true) ;

buffer := 'Agile businesses want to be able to '    ||
'quickly adopt new technologies, whether '||
'operating systems, servers, or '         ||
'software, to help them stay ahead of '   ||
'the competition. However, change often ' ||
'introduces a period of instability into '||
'mission-critical IT systems. Oracle '    ||
'Real Application Testing-with Oracle '   ||
'Database 11g Enterprise Edition-allows ' ||
'businesses to quickly adopt new '        ||
'technologies while eliminating the '     ||
'risks associated with change. Oracle '   ||
'Real Application Testing combines a '    ||
'workload capture and replay feature '    ||
'with an SQL performance analyzer to '    ||
'help you test changes against real-life '||
'workloads, and then helps you fine-tune '||
'the changes before putting them into'    ||
'production. Oracle Real Application '    ||
'Testing supports older versions of '     ||
'Oracle Database, so customers running '  ||
'Oracle Database 9i and Oracle Database ' ||
'10g can use it to accelerate their '     ||
'database upgrades. ';

rawbuf := utl_raw.cast_to_raw(buffer) ;
rawlen := utl_raw.length(rawbuf) ;

-- Modify file content
-- Please refer to DBMS_DBFS_CONTENT documentation
-- for details about this method
dbms_lob.write(outcontent, rawlen, 10, rawbuf);
commit ;
else
-- Read the file
-- Please refer to DBMS_DBFS_CONTENT documentation
-- for details about this method
dbms_dbfs_content.getPath(
path, prop2, outcontent, itemtype, pflag) ;
end if ;
filecnt := filecnt + 1 ;
end loop ;

-- Delete the first 2 files
filecnt := 0;

loop
exit when filecnt = 2 ;
path := path_pre || to_char(filecnt) ;
-- Delete file
-- Please refer to DBMS_DBFS_CONTENT documentation
-- for details about this method
dbms_dbfs_content.deleteFile(path) ;
commit ;
filecnt := filecnt + 1 ;
end loop ;

-- Move content staged in database to Amazon S3 store
dbms_dbfs_hs.storePush(store_name) ;
commit ;

end ;
/

例: テープの使用

テープ・ストアを構成および使用するプログラムの例を次に示します。

<...>で示される場所を有効な値に置き換えて、プログラムを正しく実行する必要があります。

メソッドおよびそのパラメータの詳細は、DBMS_DBFS_HSのドキュメントを参照してください。

Rem Example to configure and use a Tape store.
Rem
Rem hsuser should be a valid database user who has been granted
Rem the role dbfs_role.

connect hsuser/hsuser

Rem The following block sets up a STORETYPE_TAPE store with
Rem DBMS_DBFS_HS acting as the store provider.

declare
storename varchar2(32) ;
tblname varchar2(30) ;
tbsname varchar2(30) ;
lob_cache_quota number := 0.8 ;
cachesz number ;
ots number ;
begin
cachesz := 50 * 1048576 ;
ots := 1048576 ;
storename := 'tapestore10' ;
tblname := 'tapetbl10' ;
tbsname := '<TBS_3>' ; -- Substitute a valid tablespace name

-- Create the store.
-- Here tbsname is the tablespace used for the store,
-- tblname is the table holding all the store entities,
-- cachesz is the space used by the store to cache content
--   in the tablespace,
-- lob_cache_quota is the fraction of cachesz allocated
--   to level-1 cache and
-- ots is minimum amount of content that is accumulated
--   in level-2 cache before being stored in AmazonS3
dbms_dbfs_hs.createStore(
storename,
dbms_dbfs_hs.STORETYPE_TAPE,
tblname, tbsname, cachesz,
lob_cache_quota, ots) ;

dbms_dbfs_hs.setstoreproperty(
storename,
dbms_dbfs_hs.PROPNAME_SBTLIBRARY,
'<ORACLE_HOME/work/libobkuniq.so>') ;
-- Substitute your ORACLE_HOME path

dbms_dbfs_hs.setstoreproperty(
storename,
dbms_dbfs_hs.PROPNAME_MEDIAPOOL,
'<0>') ;  -- Substitute valid value

dbms_dbfs_hs.setstoreproperty(
storename,
dbms_dbfs_hs.PROPNAME_COMPRESSLEVEL,
'NONE') ;

-- Please refer to DBMS_DBFS_CONTENT documentation
-- for details about this method
dbms_dbfs_content.registerstore(
storename,
'tapeprvder10',
'dbms_dbfs_hs') ;

-- Please refer to DBMS_DBFS_CONTENT documentation
-- for details about this method
dbms_dbfs_content.mountstore(storename, 'tapemnt10') ;
end ;
/

Rem The following code block does file operations
Rem using DBMS_DBFS_CONTENT on the store configured
Rem in the previous code block

connect hsuser/hsuser

declare
path varchar2(256) ;
path_pre varchar2(256) ;
mount_point varchar2(32) ;
store_name varchar2(32) ;
prop1 dbms_dbfs_content_properties_t ;
prop2 dbms_dbfs_content_properties_t ;
mycontent blob := empty_blob() ;
buffer varchar2(1050) ;
rawbuf raw(1050) ;
outcontent blob := empty_blob() ;
itemtype integer ;
pflag integer ;
filecnt integer ;
iter integer ;
offset integer ;
rawlen integer ;
begin

mount_point := '/tapemnt10' ;
store_name := 'tapestore10' ;
path_pre := mount_point ||'/file' ;

-- We create 10 empty files in the following loop
filecnt := 0 ;
loop
exit when filecnt = 10 ;
path := path_pre || to_char(filecnt) ;
mycontent := empty_blob() ;
prop1 := null ;

-- Please refer to DBMS_DBFS_CONTENT documentation
-- for details about this method
dbms_dbfs_content.createFile(
path, prop1, mycontent) ; -- Create the file

commit ;
filecnt := filecnt + 1 ;
end loop ;

-- We populate the newly created files with content
-- in the following loop
pflag := dbms_dbfs_content.prop_data +
dbms_dbfs_content.prop_std  +
dbms_dbfs_content.prop_opt  ;

buffer := 'Oracle provides an integrated management '  ||
'solution for managing Oracle database with '||
'a unique top-down application management '  ||
'approach. With new self-managing '          ||
'capabilities, Oracle eliminates time-'      ||
'consuming, error-prone administrative '     ||
'tasks, so database administrators can '     ||
'focus on strategic business objectives '    ||
'instead of performance and availability '   ||
'fire drills. Oracle Management Packs for '  ||
'Database provide signifiCant cost and time-'||
'saving capabilities for managing Oracle '   ||
'Databases. Independent studies demonstrate '||
'that Oracle Database is 40 percent easier ' ||
'to manage over DB2 and 38 percent over '    ||
'SQL Server.';

rawbuf := utl_raw.cast_to_raw(buffer) ;
rawlen := utl_raw.length(rawbuf) ;
offset := 1 ;
filecnt := 0 ;
loop
exit when filecnt = 10 ;
path := path_pre || to_char(filecnt) ;
prop1 := null;

-- Append buffer to file
-- Please refer to DBMS_DBFS_CONTENT documentation
-- for details about this method
dbms_dbfs_content.putpath(
path, prop1, rawlen,
offset, rawbuf) ;

commit ;
filecnt := filecnt + 1 ;
end loop ;

-- Clear out level 1 cache
dbms_dbfs_hs.flushCache(store_name) ;
commit ;

-- Do write operation on even-numbered files.
-- Do read operation on odd-numbered files.
filecnt := 0 ;
loop
exit when filecnt = 10;
path := path_pre || to_char(filecnt) ;
if mod(filecnt, 2) = 0 then
-- Get writable file
-- Please refer to DBMS_DBFS_CONTENT documentation
-- for details about this method
dbms_dbfs_content.getPath(
path, prop2, outcontent, itemtype,
pflag, null, true) ;

buffer := 'Agile businesses want to be able to '    ||
'quickly adopt new technologies, whether '||
'operating systems, servers, or '         ||
'software, to help them stay ahead of '   ||
'the competition. However, change often ' ||
'introduces a period of instability into '||
'mission-critical IT systems. Oracle '    ||
'Real Application Testing-with Oracle '   ||
'Database 11g Enterprise Edition-allows ' ||
'businesses to quickly adopt new '        ||
'technologies while eliminating the '     ||
'risks associated with change. Oracle '   ||
'Real Application Testing combines a '    ||
'workload capture and replay feature '    ||
'with an SQL performance analyzer to '    ||
'help you test changes against real-life '||
'workloads, and then helps you fine-tune '||
'the changes before putting them into'    ||
'production. Oracle Real Application '    ||
'Testing supports older versions of '     ||
'Oracle Database, so customers running '  ||
'Oracle Database 9i and Oracle Database ' ||
'10g can use it to accelerate their '     ||
'database upgrades. ';

rawbuf := utl_raw.cast_to_raw(buffer) ;
rawlen := utl_raw.length(rawbuf) ;

-- Modify file content
-- Please refer to DBMS_DBFS_CONTENT documentation
-- for details about this method
dbms_lob.write(outcontent, rawlen, 10, rawbuf);
commit ;
else
-- Read the file
-- Please refer to DBMS_DBFS_CONTENT documentation
-- for details about this method
dbms_dbfs_content.getPath(
path, prop2, outcontent, itemtype, pflag) ;
end if ;
filecnt := filecnt + 1 ;
end loop ;

-- Delete the first 2 files
filecnt := 0;

loop
exit when filecnt = 2 ;
path := path_pre || to_char(filecnt) ;
-- Delete file
-- Please refer to DBMS_DBFS_CONTENT documentation
-- for details about this method
dbms_dbfs_content.deleteFile(path) ;
commit ;
filecnt := filecnt + 1 ;
end loop ;

-- Move content staged in database to Amazon S3 store
dbms_dbfs_hs.storePush(store_name) ;
commit ;

end ;
/

10 DBFSストアの作成

この章の内容は次のとおりです。

- パッケージDBMS_DBFS_CONTENT_SPI

パッケージDBMS_DBFS_CONTENT_SPI

Oracle Database File System Content Store Provider Interface(DBFSコンテンツSPI)により、DBFSコンテンツAPI(パッケージ本体DBMS_DBFS_CONTENT)と個々のコンテンツ・プロバイダとの間の内部規定が記述されます。

PL/SQLではコンパイル時のパッケージ・シグネチャ間の宣言タイプ適合ができないため、ストア・プロバイダではSPIに非公式に準拠する必要があります。つまり、DBMS_DBFS_CONTENT_SPIで指定されているすべてのメソッドを最低でも含むパッケージを使用して、同じメソッド・シグネチャおよびセマンティクスでSPIを実装する必要があります。これらのプロバイダ・パッケージでその他のメソッドの実装および他のインタフェースの公開が可能ですが、DBFSコンテンツAPI自体ではこれらのインタフェースは使用されません。

プロバイダSPIは、単なる規約仕様にすぎないため、DBMS_DBFS_CONTENT_SPIにはパッケージ本体がなく、実際にこのパッケージを使用してメソッドを呼び出すことはできません。

SPIは、DBFSコンテンツAPI(パッケージDBMS_DBFS_CONTENT)で定義された各種の要素(定数、タイプ、例外)を参照します。

また、DBFSコンテンツAPIによりエクスポートされたクライアントAPIと、DBFSコンテンツAPI自体が動作するコンテンツAPIは、ほとんど1対1で対応しています。

メソッド命名規則の主な相違点は、すべてのパス名参照が常にストア修飾であること、つまり、プロバイダSPIのメソッドを呼び出す前に、DBFSコンテンツAPIによってマウント・ポイントの概念および完全絶対パス名が正規化され、ストア修飾パス名に変換されていることです。

DBFSコンテンツAPIおよびプロバイダSPIは1対多プラガブル・アーキテクチャであるため、DBFSコンテンツAPIでは動的SQLを使用してプロバイダSPIのメソッドが呼び出されます。これにより、ランタイム・エラーが発生することがあります。

DBFSコンテンツAPIで特定のプロバイダSPIがプラグ化またはプラグ解除されるタイミングを示す明示的な初期または最終メソッドはありません。プロバイダSPIは、いずれかのSPIエントリ・ポイントで、自身を自動初期化する必要があります。

関連項目:

- DBMS_DBFS_CONTENT_SPIパッケージの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

- 詳細は、ファイルdbmscapi.sqlを参照してください。

第III部

アプリケーション設計

第III部では、LOBアプリケーションの設計時の考慮事項について説明します。

この部の構成は、次のとおりです。

- 第11章「LOB記憶域」

- 第12章「高度な設計時の考慮事項」

- 第13章「LOB APIの概要」

- 第14章「パフォーマンスのガイドライン」

11 LOB記憶域

この章では、SECUREFILEおよびBASICFILEパラメータの両方を持つLOB列を含む表に特定の問題について説明します。機能が、2種類のLOBのいずれか1つのみに適用される場合は、そのように示されます。

この章の内容は次のとおりです。

- LOBを含む表の作成

- LOB列のデータ型の選択

- LOB記憶域パラメータ

- LOB列に対する索引付け

- パーティション表内のLOBの操作

- 索引構成表内のLOB

- パーティション化された索引構成表内のLOBに対する制限

- ネストした表内のLOBの更新

LOBを含む表の作成

LOBを含む表を作成する場合は、次の項に示すガイドラインを使用してください。

永続LOBをNULLまたは空として初期化

永続LOB(表内のLOB列、またはユーザーが定義したオブジェクト型のLOB属性)を、NULLまたは空に設定できます。

- 永続LOBをNULLに設定: NULLに設定されたLOBにロケータはありません。NULL値はロケータではなく、表内の行に格納されます。これは、他のすべてのデータ型と同じプロセスです。

- 永続LOBを空に設定: 対照的に、表内に格納される空のLOBは、ロケータを持つ、長さがゼロのLOBです。このため、空のLOB列または属性からSELECTする場合、OCIやPL/SQL (DBMS_LOB)などのサポートされているプログラム環境を使用してLOBにデータを移入するために使用できるロケータを取り戻します。サポートされている環境の詳細は、第13章「LOB APIの概要」を参照してください。

ここでは、各オプションについて説明します。

永続LOBをNULLに設定

永続LOBの値をNULLに設定するのは、INSERT時にLOBデータのない行を挿入する場合や、次のようにSELECT文を使用してLOBにNULL値を保持するかどうかを指定する場合です。

SELECT COUNT (*) FROM print_media WHERE ad_graphic IS NOT NULL;

SELECT COUNT (*) FROM print_media WHERE ad_graphic IS NULL;

NULLのLOBに対しては、OCI関数やDBMS_LOBファンクションをコールできません。そのため、LOB列をNULL以外(または空)の値に再設定するには、SQLのUPDATE文を使用する必要があることに注意してください。

この場合、NULLのLOB上でサポートされているプログラム環境からファンクション・コールを行うことはできません。これらのファンクションはロケータでのみ動作し、LOB列がNULLである場合、行内にロケータはありません。

永続LOBを空に設定

永続LOBをNULLではなくEMPTYに初期化できます。これにより、LOBにデータを移入せずにLOBインスタンスのロケータを取得できます。永続LOBをEMPTYに設定するには、INSERT文でSQLのEMPTY_BLOB()ファンクションまたはEMPTY_CLOB()ファンクションを使用します。

INSERT INTO a_table VALUES (EMPTY_BLOB());

または、その後SELECT文をコールするかわりに、RETURNING句を使用して1回の操作でLOBロケータを取得する方法もあります。

DECLARE
Lob_loc  BLOB;
BEGIN
INSERT INTO a_table VALUES (EMPTY_BLOB()) RETURNING blob_col INTO Lob_loc;
/* Now use the locator Lob_loc to populate the BLOB with data */
END;

LOBの初期化

次のINSERT文を使用して、print_mediaの中のLOBを初期化できます。

INSERT INTO print_media VALUES (1001, EMPTY_CLOB(), EMPTY_CLOB(), NULL,
EMPTY_BLOB(), EMPTY_BLOB(), NULL, NULL, NULL, NULL);

これにより、ad_sourcetext、ad_fltextn、ad_compositeおよびad_photoの値が空の値に設定され、ad_graphicがNULLに設定されます。

永続LOB列およびLOB属性を値に初期化

LOB列またはLOB属性は、10.2より前のリリースでの上限値4GBよりも大きいデータを含む値に初期化できます。

関連項目:
第20章「永続LOB用のデータ・インタフェース」

BFILEをNULLまたはファイル名に初期化

BFILEはNULLまたはファイル名に初期化できます。この操作にはBFILENAME()ファンクションを使用できます。

関連項目:
「BFILENAMEと初期化」

LOBセグメントの最初のエクステントの制限

任意のセグメントの最初のエクステントには、少なくとも2ブロックが必要です(FREELIST GROUPSが0であった場合)。つまり、セグメントの初期エクステント・サイズは少なくとも2ブロックである必要があります。LOBセグメントは、最初のエクステントに少なくとも3ブロック必要なため、異なっています。初期サイズが2ブロックである永続ディクショナリ管理の表領域でLOBセグメントを作成しようとしても、この作業は有効です。これは、永続ディクショナリ管理の表領域内のセグメントで表領域のデフォルトの記憶域設定を上書きできるためです。

ただし、均一なローカル管理の一時表領域やディクショナリ管理の一時表領域、またはローカル管理の一時表領域内のエクステント・サイズが2ブロックである場合は、これらの表領域内にLOBセグメントを作成できません。これは、これらのタイプの表領域ではエクステント・サイズが固定され、表領域のデフォルト記憶域設定が無視されることはないためです。

LOB列のデータ型の選択

データ型を選択する場合、次の3項目を考慮します。

LOB型とLONG型およびLONG RAW型との比較

表11-1に、LOB型とLONG型およびLONG RAW型との類似点と相違点を示します。

表11-1 LOBとLONG RAW

LOBデータ型

LONGおよびLONG RAWデータ型

単一の行に複数のLOBを格納できます。

1行当たり1つのLONGまたはLONG RAWのみを格納します。

LOBは、ユーザー定義のデータ型の属性にできます。

LONGとLONG RAWのどちらも、ユーザー定義データ型の属性にはできません。

LOBロケータのみ表の列に格納されます。BLOBデータおよびCLOBデータは、別々の表領域に格納でき、BFILEデータは外部ファイルとして格納されます。

インラインLOBについては、表列の中に約4000バイトまでのデータが格納されます。

LONGまたはLONG RAWの場合、値全体が表の列に格納されます。

LOB列にアクセスすると、ロケータまたはデータのフェッチが選択できます。

LONGまたはLONG RAWにアクセスすると、値全体が戻ります。

LOBのサイズは、ブロック・サイズに応じて128TB以下またはそれ以上です。

LONGまたはLONG RAWインスタンスの最大サイズは2GBです。

ランダムにピース単位でデータを操作する場合は、LOBを使用する方が柔軟性があります。LOBはランダム・オフセットでアクセスできます。

LONGまたはLONG RAWデータは、ランダムな、ピース単位でのデータ操作に対して柔軟性がありません。LONGの場合、目的の位置へは先頭からアクセスする必要があります。

ローカルおよび分散環境の両方でLOBをレプリケートできます。

LONGまたはLONG RAWは、ローカルおよび分散環境のどちらの場合でもレプリケートできません(『Oracle Databaseアドバンスト・レプリケーション』を参照)。

LOBへの可変幅文字データの格納

CLOBデータ型およびNCLOBデータ型の可変幅文字データは、UCS2 Unicodeキャラクタ・セット形式と互換性のある内部形式で格納されます。このため、可変幅形式の文字データの記憶が消失することはありません。また、LOBを使用して可変幅文字データを格納する場合は、次のことに注意してください。

- 可変幅のCHARまたはNCHARデータベース・キャラクタ・セットを使用する場合にも、CLOB列とNCLOB列を含む表を作成できます。

- 可変幅のCHARデータベース・キャラクタ・セットを使用するかどうかに関係なく、CLOB属性を持つデータ型を含む表を作成できます。

LOBでの暗黙的なキャラクタ・セット変換

OCI(Oracle Call Interface)で使用されるCLOBおよびNCLOBインスタンスや、OCI機能にアクセスするプログラム環境の場合、キャラクタ・セットの変換は1つのキャラクタ・セットから別のキャラクタ・セットに翻訳するとき、暗黙的に実行されます。

DBMS_LOB.LOADCLOBFROMFILE APIにより、CLOBまたはNCLOBへのロード時にバイナリ・データから文字データへの暗黙的な変換が実行されます。このDBMS_LOB.LOADCLOBFROMFILEは例外であり、LOB APIではバイナリ・データから文字データへの暗黙的な変換は実行されません。

たとえば、DBMS_LOB.LOADFROMFILE APIを使用してCLOBまたはNCLOBに移入する場合は、BFILEのバイナリ・データをLOBに移入することになります。この場合は、DBMS_LOB.LOADFROMFILEをコールする前に、BFILEデータのキャラクタ・セット変換を実行する必要があります。

関連項目:
キャラクタ・セットの変換の詳細は、『Oracle Databaseグローバリゼーション・サポート・ガイド』

注意:
ユーザー定義された移入済のCLOB列がデータベース表内に存在する場合、データベース・キャラクタ・セットをシングルバイトからマルチバイト・キャラクタに変更することはできません。ユーザー定義された移入済のNCLOB列がデータベース表内に存在する場合、各国語キャラクタ・セットをAL16UTF16とUTF8間で変更することはできません。

LOB記憶域パラメータ

この項では、LOB記憶域を含む表の設計時に考慮する必要のある、LOB記憶域の特性について説明します。次は、SECUREFILEパラメータに関する説明です。

関連項目:

- 「SecureFiles LOBを含んだCREATE TABLEの使用」

- 「SecureFiles LOBを含んだALTER TABLEの使用」

インラインLOB記憶域とアウトラインLOB記憶域

LOB列には、実際のLOB値の位置を参照するロケータが格納されます。表の作成時に指定する列のプロパティとLOBのサイズに応じて、実際のLOB値は表の行(インライン)または表の行の外(アウトライン)に格納されます。

LOB値がアウトラインに格納されるのは、次のいずれかの条件に該当する場合です。

- 表の作成時に、LOBのSTORAGE句にDISABLE STORAGE IN ROWを明示的に指定した場合。

- 列のLOB記憶域プロパティにかかわらず、LOBのサイズが約4000バイト(4000バイトからシステム制御情報を引いたもの)を超える場合。

- アウトラインに格納されているLOBを更新した場合は、更新後のLOBが約4000バイトを下回っていても、そのままアウトラインに格納されます。

LOB値がインラインに格納されるのは、次のいずれかの条件に該当する場合です。

- 指定の行に格納されるLOBのサイズが約4000バイト以下で、表の作成時にLOBのSTORAGE句にENABLE STORAGE IN ROWを明示的に指定する場合、またはこのパラメータを指定しない(デフォルト)場合。

- 列のLOB記憶域プロパティにかかわらず、LOB値がNULLの場合。

デフォルトのLOB記憶域プロパティ(インライン記憶域)を使用する方がデータベースのパフォーマンスが向上し、小さいLOB値のためのアウトライン記憶域の作成と管理に伴うオーバーヘッドを回避できます。データベースに格納されるLOB値のサイズが小さいときが多い場合は、インライン記憶域を使用することをお薦めします。

注意:

- LOBロケータは常に行に格納されます。

- LOB記憶域プロパティやLOB値(NULL、空またはそれ以外)に関係なく、LOBインスタンスには常にLOBロケータがあります。

- LOBがDISABLE STORAGE IN ROWプロパティを指定して作成され、BasicFiles LOBにデータが保持される場合は、LOBのサイズがCHUNKのサイズより小さくても、アウトライン記憶域の1つ以上のCHUNKが使用されます。

- LOB列がEMPTY_CLOB()またはEMPTY_BLOB()で初期化された場合、LOB値はNULLでさえ存在しません。行にはLOBロケータのみが保持されます。追加のLOB記憶域は使用されません。

- LOB記憶域プロパティは、BFILE列には影響しません。BFILEデータは、常にデータベース外のOSファイルに格納されます。

永続LOBに対する表領域および記憶特性の定義

表内のLOBを定義する場合、各永続LOB列の表領域および記憶特性を明示的に指定できます。

BasicFiles LOBを作成するには、BASICFILEキーワードはオプションですが、次の例に示すように、明確になるように使用することをお薦めします。

CREATE TABLE ContainsLOB_tab (n NUMBER, c CLOB)
lob (c) STORE AS BASICFILE segname (TABLESPACE lobtbs1 CHUNK 4096
PCTVERSION 5
NOCACHE LOGGING
STORAGE (MAXEXTENTS 5)
);

SecureFilesの場合、次の例に示すように(TABLESPACE lobtbs1がASSMであることを想定)、SECUREFILEキーワードが必要です。

CREATE TABLE ContainsLOB_tab1 (n NUMBER, c CLOB)
lob (c) STORE AS SECUREFILE sfsegname (TABLESPACE lobtbs1
RETENTION AUTO
CACHE LOGGING
STORAGE (MAXEXTENTS 5)
);

注意:
外部LOB (BFILE)に対して指定できる表領域または記憶特性はありません。これらはデータベースには格納されません。

既存のLOB列のLOB記憶域パラメータを変更する必要がある場合は、ALTER TABLE ... MOVE文を使用します。変更できるのは、RETENTION、PCTVERSION、CACHE、NOCACHE LOGGING、NOLOGGINGまたはSTORAGEの設定です。またALTER TABLE ...MOVE文を使用してTABLESPACEを変更できます。

LOBデータ・セグメント名の割当て

前述の例に示すように、LOBデータ・セグメントに名前を指定すると、作業環境がより明確になります。USER_LOBS、ALL_LOBS、DBA_LOBSのLOBデータ・ディクショナリ・ビューを問い合せた際(『Oracle Databaseリファレンス』を参照)、システムが生成した名前ではなく、選択したLOBデータ・セグメント名が表示されます。

LOB列またはLOB属性のLOB記憶特性

LOB列またはLOB属性に対して指定できるLOB記憶特性は次のとおりです。

- TABLESPACE

- PCTVERSIONまたはRETENTION
指定できるのは、BasicFiles LOBのPCTVERSIONまたはRETENTIONのどちらか一方のみであることに注意してください。SecureFilesの場合は、RETENTIONパラメータのみを指定できます。

- CACHE/NOCACHE/CACHE READS

- LOGGING / NOLOGGING

- CHUNK

- ENABLE/DISABLE STORAGE IN ROW

- STORAGE

ほとんどのユーザーには、これらの記憶特性のデフォルトで十分です。LOB記憶域をチューニングする場合は、次のガイドラインを考慮してください。

関連項目:
『Oracle Database SQL言語リファレンス』のSTORAGE句に関する項およびRETENTIONパラメータに関する項

TABLESPACEおよびLOB索引

LOBに対するパフォーマンスを最適化するには、LOBの記憶域を、そのLOBを含む表に使用されるものとは別の表領域に指定します。多くのLOBが頻繁にアクセスされる場合は、デバイスの競合を避けるために、LOB列またはLOB属性ごとに個別の表領域を指定することも効果的です。

LOB索引は、LOB記憶域に密接に対応付けられている内部構造体です。したがって、ユーザーがLOB索引を削除または再構築することはできません。

注意:
LOB索引は変更できません。

システムは、LOB STORAGE句内のユーザー指定に従って、LOBデータおよびLOB索引に使用する表領域を決定します。

- LOBデータ用の表領域を指定しない場合は、その表の表領域がLOBデータおよびLOB索引に使用されます。

- LOBデータ用の表領域を指定した場合は、指定した表領域がLOBデータとLOB索引の両方に使用されます。

非パーティション表のLOB索引に対する表領域

表の作成時に非パーティション表のLOB索引用の表領域を指定すると、表領域指定は無視され、LOB索引はLOBデータと同じ位置に格納されます。パーティション化されたLOBに、LOB索引構文は含まれません。

LOB記憶域セグメントには別の表領域を指定すると、表の表領域での競合を削減できます。

PCTVERSION

BasicFiles LOBが変更されると、新しいバージョンのBasicFiles LOBページが作成され、前のバージョンのBasicFiles LOB値の読取り一貫性がサポートされます。

PCTVERSIONは、使用中のBasicFiles LOBデータ領域全体のうち、旧バージョンのBasicFiles LOBデータ・ページが占めることのできる割合です。旧バージョンのBasicFiles LOBデータ・ページの占める割合が使用中のBasicFiles LOB領域に対してPCTVERSION量を超え始めると、すぐにOracle Databaseにより旧バージョンの部分が解放され再利用されます。つまり、PCTVERSIONは、使用中のBasicFiles LOBデータ・ブロックのうち古いBasicFiles LOBデータのバージョニングに使用できる割合と言い換えることができます。

PCTVERSIONのデフォルトは、10(%)で、最小値は0(%)、最大値は100(%)です。

PCTVERSIONに設定する値を決定するには、次のことを考慮します。

- BasicFiles LOBの更新頻度

- 更新されたBasicFiles LOBを読み取る頻度

表11-2「推奨されるPCTVERSION設定」に、適切なPCTVERSION値を決定するためのガイドラインを示します。

表11-2 推奨されるPCTVERSION設定

BasicFiles LOB更新パターン

BasicFiles LOB読取りパターン

PCTVERSION

X%のLOBデータを更新する

更新されたLOBを読み取る

X%

X%のLOBデータを更新する

LOBを読み取るが更新されたLOBは読み取らない

0%

X%のLOBデータを更新する

更新されたLOBおよび更新されていないLOBの両方を読み取る

2X%

LOBを更新しない

LOBを読み取る

0%

アプリケーションで大量のBasicFiles LOB列を読み取ると同時に複数のBasicFiles LOBを更新する必要がある場合は、PCTVERSIONの値を20%などに大きくすることを考慮してください。

PCTVERSIONをデフォルトの2倍の値に設定すると、旧バージョンのデータ・ページに使用できる空きページが増えます。大量の問合せを行う場合、BasicFiles LOB列の読取り一貫性が必要となるため、旧バージョンのBasicFiles LOBページを保持しておく必要があります。この場合、データベースは空きページを積極的には再利用しないため、BasicFiles LOB記憶域は大きくなります。

アプリケーションで永続BasicFiles LOBインスタンスが作成されて1回のみ書き込まれ、その後は主に読取り専用となる場合、更新頻度は低くなります。この場合は、PCTVERSIONに5%以下などの小さい値を使用することを考慮してください。

BasicFiles LOBの更新をほとんど行わず、更新する部分が非常に少ない場合は、旧バージョンのBasicFiles LOBデータ用に必要とする領域も少なくなります。既存のBasicFiles LOBが読取り専用とわかっている場合は、旧バージョンのデータにはページが必要ないため、PCTVERSIONを0%に設定しても問題ありません。

BasicFiles LOB用のRETENTIONパラメータ

PCTVERSIONパラメータを指定するかわりに、CREATE TABLE文またはALTER TABLE文のLOB STORAGE句にRETENTIONパラメータを指定できます。その場合は、表領域の割合を使用するかわりに、LOB列にLOBデータの旧バージョンを格納する期間を設定します。次に例を示します。

CREATE TABLE ContainsLOB_tab (n NUMBER, c CLOB)
lob (c) STORE AS BASICFILE segname (TABLESPACE lobtbs1 CHUNK 4096
RETENTION
NOCACHE LOGGING
STORAGE (MAXEXTENTS 5)
);

RETENTIONパラメータは、フラッシュバック・バージョン問合せなど、データベースのUNDO機能と併用するように設計されています。LOB列にRETENTIONプロパティが設定されている場合、LOBデータの旧バージョンはUNDO_RETENTIONパラメータで指定した期間のみ保持されます。

RETENTIONパラメータには、次の注意事項があります。

- 他のデータ型と同様、LOB列にはUNDO SQLを使用できません。LOBデータにUndo SQLを使用するには、LOB列にRETENTIONプロパティを設定する必要があります。

- RETENTIONパラメータの値は明示的に設定できません。LOBバージョンの保存期間はUNDO_RETENTIONパラメータにより決定されます。

- RETENTIONパラメータの使用がサポートされるのは、自動UNDO管理モードの場合のみです。LOB列にRETENTIONを設定する前に、自動UNDO管理に使用する表を構成する必要があります。LOB RETENTIONをBasicFiles LOBで有効にするには、ASSMが必要です。BasicFiles LOBがMSSM表領域にある場合、SQLのRETENTIONパラメータ(STORE AS文)は暗黙的に無視されます。

- LOB STORAGE句で指定できるのは、RETENTIONまたはPCTVERSIONのどちらか一方のみです。

関連項目:

- データベースのフラッシュバック機能の使用方法の詳細は、『Oracle Databaseアドバンスト・アプリケーション開発者ガイド』を参照してください。

- LOB STORAGE句の構文の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

SecureFiles LOB用のRETENTIONパラメータ

SecureFilesにRETENTIONパラメータを指定すると、データベースで、データベースのUNDOモードなどの要素を考慮に入れて、SecureFiles記憶域の読取り一貫性のあるデータが動的に管理されます。

- データベースがFLASHBACKモードの場合、LOB UNDOの保存サイズのバイト数を制限するには、MAXを指定します。MAXを指定する場合は、storage_clauseのMAXSIZE句も指定する必要があります。

- 読取り一貫性の目的に十分なUNDOを維持する場合は、AUTOを指定します。これはデフォルトです。

- 読取り一貫性またはフラッシュバックのいずれの目的でもUNDOが必要とされない場合は、NONEを指定します。

SecureFilesのデフォルトのRETENTIONは、AUTOです。

CACHE/NOCACHE/CACHE READS

LOBを含む表を作成する場合は、表11-3「CACHE、NOCACHEおよびCACHE READSの使用時期」のガイドラインに従ってキャッシュ・オプションを使用します。

表11-3 CACHE、NOCACHEおよびCACHE READSの使用時期

キャッシュ・モード

読取り

書込み

CACHE READS

頻繁

1回または時々

CACHE

頻繁

頻繁

NOCACHE(デフォルト)

1回または時々

なし

CACHE/NOCACHE/CACHE READS: LOB値とバッファ・キャッシュ

- CACHE: Oracleは、アクセスを高速化するために、バッファ・キャッシュにLOBページを置きます。

- NOCACHE: STORE AS句のパラメータとしてNOCACHEが指定された場合は、LOB値はバッファ・キャッシュには入りません。

- CACHE READS: LOB値は、読取り中のみバッファ・キャッシュに入れられ、書込み中には入れられません。

NOCACHEは、SecureFilesとBasicFiles LOBの両方に関してデフォルトです。

注意:
CACHEオプションを使用すると、LOB列からのデータの読取りおよび書込み時のパフォーマンスが向上します。ただし、LOBでない他のページが通常より早くバッファ・キャッシュからページ・アウトされる可能性があります。

BasicFiles LOB用のLOGGING/NOLOGGINGパラメータ

[NO] LOGGINGは、LOBの使用に関しては他の表操作と同様に適用されます。通常、[NO]LOGGING句が省略されている場合は、NOLOGGINGまたはLOGGINGのどちらも指定されていないことを意味し、その場合は表または表のパーティションのロギング属性は、置かれている表領域のロギング属性にデフォルトで設定されます。

LOBには、CACHEの指定によっては他にも指定方法があります。

- CACHEが指定される場合、[NO]LOGGING句は省略されます。LOGGINGが自動的に実装されます(CACHE NOLOGGINGがないためです)。

- CACHEが指定されない場合、[NO]LOGGING句は省略されます。プロセスのデフォルトは、表およびパーティション化された表と同じ方法になります。[NO]LOGGING値はLOBセグメントの置かれている表領域から取得されます。

ただし、次の事項を考慮する必要があります。

LOBは、常にLOB索引ページに対してUNDOを生成する

LOGGINGまたはNOLOGGINGが設定されているかどうかにかかわらず、古いLOBデータはバージョンごとに格納されるため、LOBではLOBデータ・ページのロールバック情報(UNDO)は生成されません。LOBについて作成されるロールバック情報は、LOBの索引ページの変更専用であるため、サイズが小さくなります。

LOGGINGが設定されている場合、LOBデータ・ページの完全なREDOが生成される

NOLOGGINGは、メディア・リカバリを必要としない場合に使用されます。したがって、ディスク、テープ、ストレージなどのメディアに障害が発生した場合、変更のログは作成されていないため、ログから変更をリカバリできません。

NOLOGGINGはバルク・ロードまたは挿入に効果的

たとえば、LOBにデータをロードする際、REDOを必要とせず、ロードが失敗してもロードを簡単に再開できる場合は、LOBデータ・セグメントの記憶特性をNOCACHE NOLOGGINGに設定します。これによって、データの初期ロードのパフォーマンスが向上します。

データのロードが完了すると、ALTER TABLEを使用して、永続LOB操作に対するLOBデータ・セグメントのLOB記憶特性を、CACHEやNOCACHE LOGGINGに変更できます。

注意:
CACHEを設定すると、LOGGINGも行われます。

SecureFiles LOB用のLOGGING/FILESYSTEM_LIKE_LOGGING

NOLOGGINGまたはLOGGINGは、SecureFilesの使用に関してはLOGGING/NOLOGGINGによる他の表操作と同様に適用されます。通常、logging_clauseが省略されている場合、SecureFilesではロギング属性を、置かれている表領域から継承します。ここで、NOLOGGINGがデフォルト値の場合、SecureFilesはデフォルトでFILESYSTEM_LIKE_LOGGINGになります。

注意:
CACHEオプションを使用すると、LOB列からのデータの読取りおよび書込み時のパフォーマンスが向上します。ただし、LOBでない他のページが通常より早くバッファ・キャッシュからページ・アウトされる可能性があります。

CACHEによって決まるLOGGING

SecureFilesには、CACHEの指定によっては他にも指定方法があります。

- CACHEが指定されると、LOGGING句が省略され、LOGGINGが使用されます。

- CACHEが指定されないと、logging_clauseが省略されます。プロセスのデフォルトは、表およびパーティション化された表と同じ方法になります。LOGGING値はLOB値の置かれている表領域から取得されます。表領域がNOLOGGINGの場合、SecureFilesはデフォルトでFILESYSTEM_LIKE_LOGGINGに設定されます。

ただし、次の事項を考慮する必要があります。

SecureFilesおよび効率的なREDOおよびUNDO生成の方法

これは、Oracle Databaseが、ヒープ・ブロックと同様に、ブロックへの変更のためにREDOおよびUNDOを生成する方がより効率的か、または、BasicFiles LOBと同様に、バージョンおよび新規ブロックの完全なREDOを生成するかどうかを判断することを意味します。

バルク・ロードまたは挿入に効果的なFILESYSTEM_LIKE_LOGGING

たとえば、LOBにデータをロードする際、REDOを必要とせず、ロードが失敗してもロードを簡単に再開できる場合は、LOBデータ・セグメントの記憶特性をFILESYSTEM_LIKE_LOGGINGに設定します。これによって、データの初期ロードのパフォーマンスが向上します。

データのロードが完了したら、必要に応じて、ALTER TABLEを使用して、通常のLOB操作用のLOBデータ・セグメントのLOB記憶域の特性を変更します。たとえば、CACHEまたはNOCACHE LOGGINGに変更します。

CHUNK

チャンクとは1つまたは複数のOracleブロックです。LOBを含む表を作成する場合に、BasicFiles LOB用のチャンク・サイズを指定できます。これは、LOB値に対してアクセスまたは変更を行うときに、Oracle Databaseが使用するデータ・サイズに対応します。チャンクの一部はシステム関連の情報を格納し、残りはLOB値を格納します。使用するAPIには、LOBチャンク内で使用され、LOB値を格納している領域の量を戻すファンクションがあります。PL/SQLでは、DBMS_LOB.GETCHUNKSIZEを使用します。OCIでは、OCILobGetChunkSize()を使用します。

注意:
表ブロック・サイズがデータベース・ブロック・サイズと同じ場合、CHUNKは、データベース・ブロック・サイズの倍数でもあります。CHUNKのデフォルト・サイズは、1つの表領域ブロックのサイズと同じで、最大値は32KBです。

関連項目:
最大LOBサイズの詳細は、「サイズがTBのLOBのサポート」 を参照してください。

CHUNKの値の選択

LOB列の作成時にCHUNKの値を選択した後は、値を変更できません。したがって、記憶域およびパフォーマンスの要件に最適な値を選択することが重要です。SecureFilesでは、CHUNKは、アドバイザ・サイズで、後方互換性のために使用します。

記憶域に関する考慮事項

CHUNKの値は、インラインに格納されるLOBには関係ありません。ENABLE STORAGE IN ROWが設定され、LOBロケータおよびLOBデータのサイズが約4000バイトを下回る場合には、LOBはインラインに格納されます。ただし、LOBデータがアウトラインに格納される場合には、必ずCHUNKパラメータの倍数の領域が使用されます。これは、データが小さいのにCHUNKが大きな数字に設定されている場合は、領域をかなり無駄に使用することになります。表11-4「データ・サイズとCHUNKサイズ」で、この点について示します。

表11-4 データ・サイズとCHUNKサイズ

データ・サイズ

CHUNKサイズ

LOB格納に使用されるディスク領域

領域使用率(%)

3500(ENABLE STORAGE IN ROW)

関連なし

3500行

100

3500(DISABLE STORAGE IN ROW)

32KB

32KB

10

3500(DISABLE STORAGE IN ROW)

4KB

4KB

90

33KB

32KB

64KB

51

2GB +10

32KB

2GB + 32 KB

99+

パフォーマンスに関する考慮事項

LOBへのアクセスは、大きいデータ・チャンクで行うほうが効率的です。CHUNKは、最も頻繁にアクセスまたは書込みが行われるデータ・サイズに設定できます。たとえば、一度に1ブロックのみのLOBデータにアクセスする場合は、CHUNKをその1ブロックのサイズに設定します。LOBが大きく、読取り/書込みのデータ量が多い場合は、CHUNKに大きな値を選択します。

CHUNKよりも大きいサイズにINITIALおよびNEXTを設定する

LOBの記憶特性を明示的に指定する場合、LOBデータ・セグメントの記憶域のINITIALおよびNEXTを、必ずCHUNKサイズより大きい値に設定します。たとえば、データベース・ブロックのサイズが2KBで、CHUNKを8KBに指定する場合、INITIALおよびNEXTを8KBよりも十分に大きい値(16KB以上)に設定します。

つまり、INITIAL、NEXT、またはLOBのCHUNK のサイズの値を指定する場合は、必ず次の条件に従って設定してください。

- CHUNK <= NEXT

- CHUNK <= INITIAL

ENABLE句またはDISABLE STORAGE IN ROW句

ENABLE | DISABLE STORAGE IN ROW句を使用して、LOBをインライン(行内)またはアウトラインに格納するかどうかを指定します。

注意:
これは一度指定すると、変更できません。ENABLE STORAGE IN ROWからDISABLE STORAGE IN ROWにも、またその逆にも変更できません。

デフォルトは、ENABLE STORAGE IN ROWです。

ENABLEまたはDISABLE STORAGE IN ROWのガイドライン

インラインに格納されるLOBデータの最大サイズは、最大VARCHAR2サイズ(4,000バイト)です。この最大値には、LOB値および制御情報が含まれます。LOBをインラインに格納するように指定しても、LOB値および制御情報が約4000バイトを超えると、LOB値は自動的にアウトラインに移動されます。

このため、次のようなガイドラインが必要になります。

次の理由から、通常、デフォルトのENABLE STORAGE IN ROWが最適です。

- 小さいLOB: LOBサイズが小さい(約4000バイト未満)場合、余分なディスクI/Oなしで行の読取り時にLOB全体を読み取ることができます。

- 大きいLOB: LOBが大きい(約4000バイトを超える)場合、行の外部にLOBデータを移動した後でも、ENABLE STORAGE IN ROWが設定されていれば、制御情報は行に格納されたままです。この制御情報によって、アウトラインLOBデータを高速で読み取ることができます。

ただし、DISABLE STORAGE IN ROWの方が適している場合もあります。LOBをインラインに格納すると、行のサイズが大きくなるためです。行サイズが大きいと、ユーザーが全表スキャン、複数行アクセス(レンジ・スキャン)、LOB列以外の列への多数のUPDATE/SELECTなどの実表の処理を頻繁に行う場合、パフォーマンスが低下します。

LOB列に対する索引付け

この項では、LOB列の索引付けに使用できる各種の方法について説明します。

注意:
LOB列の移動後、表の既存の索引を再作成する必要があります。

LOB列でのドメイン索引機能の使用

ドメイン専用の索引を作成すると、問合せのパフォーマンスを改善できる場合があります。データベースに用意されている拡張性のあるインタフェースによって、そのようなドメイン固有の索引を実装するための枠組みである、ドメイン索引作成機能を利用できます。

注意:
LOB列には、Bツリーまたはビットマップ索引を構築できません。

関連項目:
ドメイン固有の索引作成の詳細は、『Oracle Databaseデータ・カートリッジ開発者ガイド』を参照してください。

テキスト索引を使用したLOB列に対する索引付け

LOB列の内容の性質によっては、Oracle Textオプションの1つを使用して索引を作成することもできます。たとえば、テキスト・ドキュメントがCLOB列に格納されている場合、テキスト索引を作成して、CLOB列に対するテキストベースの問合せのパフォーマンスを向上させることができます。

関連項目:
Oracle Textオプションの詳細は、『Oracle Textリファレンス』を参照してください。

LOBに対するファンクション索引付け

ファンクション索引とは、式に対して作成される索引です。これによって、列のみの場合より索引機能が拡張されます。ファンクション索引により、データ・アクセスの方法が多様化します。

ファンクション索引は、ネストした表やLOB列には作成できません。ただし、VARRAYには作成できます。

DML操作がLOB列で実行されると、LOB列の拡張索引およびドメイン索引と同様に、ファンクション索引も自動的に更新されます。拡張索引が更新されると、ファンクション索引も更新されます。

関連項目:
ファンクション索引の使用方法の詳細は、『Oracle Databaseアドバンスト・アプリケーション開発者ガイド』を参照してください。

LOB列に対する拡張索引作成機能

データベースには、必要に応じて新規索引タイプを定義できる拡張索引作成機能が用意されています。これは、データ・カートリッジおよびデータベースがOLAP (On-line-Analytical Processing)などのためにテキストや空間などのデータ型の索引を構築および保持するという協調索引の概念に基づいています。

カートリッジは、索引構造の定義、ロード操作および更新操作中の索引内容のメンテナンス、問合せ処理中の索引の検索を行います。索引構造は、ヒープ構成表または索引構成表としてOracleに格納するか、OSファイルとして外部に格納できます。

この構造をサポートするために、データベースには索引タイプが用意されています。索引タイプの目的は、データ・カートリッジを使用して、テキスト、空間、イメージ、OLAPなどの複合ドメインを効率的に検索および取出しできるようにすることです。索引タイプは、Oracleサーバーに組み込まれているソート済の索引またはビットマップ索引に似ています。相違点は、組込み索引はOracleカーネルによって実装されますが、索引タイプはデータ・カートリッジの開発者によって実装されることです。データ・カートリッジの開発者が新しい索引タイプを実装すると、データ・カートリッジのエンド・ユーザーは、組込み索引タイプと同様にその索引タイプを使用できます。

データベース・システムがドメイン索引の物理的な格納を処理する場合、データ・カートリッジは次のことを行います。

- 索引のフォーマットおよび内容の定義。これによって、カートリッジが複合データ・オジェクトを保存できる索引構造を定義できます。

- ドメイン索引の作成、削除および更新。カートリッジは、索引構造の構築およびメンテナンスを処理します。これは、単純なSQLデータ型用に提供されている医療業界向け索引付け機能から大幅に発展した機能です。また、索引は一定の数の要素で構成される集合として作成されるため、インプレース更新が直接サポートされます。

- 索引の内容へのアクセスおよび解析。この機能を持つデータ・カートリッジは、問合せの処理に不可欠なコンポーネントです。データベースへの問合せの内容に関連する句は、データ・カートリッジが処理します。

データベースでは、拡張索引作成機能がサポートされるため、LOBなどの複合データ型にアクセスするパフォーマンスの高いソリューションを非常に簡単に開発できます。

拡張可能オプティマイザ

ユーザー定義ファンクションおよび索引の作成者は、拡張可能オプティマイザの機能を使用して、統計集計ファンクション、選択ファンクションおよびコスト・ファンクションを作成できます。オプティマイザは、この情報を使用して問合せ計画を選択します。コストベース・オプティマイザは、ユーザーが提供する情報を使用するように拡張されています。

拡張索引作成機能を使用すると、新しい演算子、索引タイプおよびドメイン索引を定義できます。これらのユーザー定義演算子およびドメイン索引については、拡張可能オプティマイザの機能を使用して、オプティマイザが実行計画を選択するために使用する3つの主な構成要素(統計、選択性、コスト)を制御できます。

関連項目:
『Oracle Databaseデータ・カートリッジ開発者ガイド』

Oracle TextによるXMLへの索引付けのサポート

CLOB列にOracle Textの索引を作成し、XMLデータで問合せを実行できます。

関連項目:

- 『Oracle XML Developer's Kitプログラマーズ・ガイド』

- 『Oracle Textリファレンス』

- 『Oracle Textアプリケーション開発者ガイド』

パーティション表内のLOBの操作

LOB列を含む表をパーティション化できます。この結果、次のように、パーティション化のすべてのメリットをLOBでも利用できます。

- LOBセグメントをいくつかの表領域に分散して、I/O負荷を均衡化させ、バックアップおよびリカバリの管理をより簡単にできます。

- パーティション表内のLOBがメンテナンスしやすくなります。

- LOBを論理グループにパーティション化し、グループとしてアクセスされるLOBの操作を高速化できます。

この項では、パーティション表内のLOBの操作方法をいくつか説明します。

LOB列を含む表のパーティション化

LOBは、レンジ・パーティション表、リスト・パーティション表およびハッシュ・パーティション表でサポートされます。コンポジット・ヒープ構成表にも、LOBを含めることができます。

LOB列を含む表をパーティション化するには、次の方法があります。

- CREATE TABLE文のPARTITION BY ...句を使用して表を作成します。

- ALTER TABLE ...ADD PARTITION句を使用して既存の表にパーティションを追加します。

- ALTER TABLE ...EXCHANGE PARTITION句を使用して、パーティション化されたLOB列を含む表とパーティションを交換します。EXCHANGE PARTITIONを使用できるのは、両方の表でLOBをアウトラインに格納する場合など、両方の表の記憶域属性が同一の場合のみであることに注意してください。

(CREATE TABLE文で)表の作成と同時にLOBパーティションを作成することをお薦めします。表の作成時にLOB列にパーティションを作成すると、その列にインラインLOBまたはアウトラインLOBを保持できます。

表の作成後は、アウトラインに格納されたLOB列にのみ新規LOBパーティションを作成できます。また、パーティション・メンテナンス操作SPLIT PARTITIONおよびMERGE PARTITIONSは、LOBをアウトラインに格納するLOB列にのみ機能します。

関連項目:
LOBの制限に関する追加情報は、「パーティション化された索引構成表のLOBに対する制限」 を参照してください。

表の作成後は記憶域属性を変更できないことに注意してください。LOB記憶域属性の詳細は、「LOB記憶域パラメータ」を参照してください。

パーティション化されたLOB列を含む表に対する索引の作成

問合せのパフォーマンスを改善するために、パーティション化されたLOB列に対して索引を作成できます。次に例を示します。

CREATE INDEX index_name
ON table_name (LOB_column_1, LOB_column_2, ...) LOCAL;

LOB列でサポートされるのは、ドメイン索引とファンクション索引のみであることに注意してください。一意索引など、他のタイプの索引はLOBでサポートされません。

LOBを含むパーティションの移動

LOBパーティションを別の表領域に移動できます。この移動が役立つのは、表領域が小さすぎてパーティションを保持できなくなった場合です。移動には、ALTER TABLE ...MOVE PARTITION句を使用します。次に例を示します。

ALTER TABLE current_table MOVE PARTITION partition_name
TABLESPACE destination_table_space
LOB (column_name) STORE AS (TABLESPACE current_tablespace);

LOBを含むパーティションの分割

ALTER TABLE ...SPLIT PARTITION句を使用すると、LOBを含むパーティションを同じサイズの2つのパーティションに分割できます。これにより、一方または両方の新規パーティションを新規の表領域に配置できます。次に例を示します。

ALTER TABLE table_name SPLIT PARTITION partition_name
AT (partition_range_upper_bound)
INTO (PARTITION partition_name,
PARTITION new_partition_name TABLESPACE new_tablespace_name
LOB (column_name) STORE AS (TABLESPACE tablespace_name)
... ;

LOBを含むパーティションのマージ

ALTER TABLE ...MERGE PARTITIONS句を使用すると、LOB列を含むパーティションをマージできます。この方法は、使用されていないパーティション領域を再生する場合に役立ちます。次に例を示します。

ALTER TABLE table_name
MERGE PARTITIONS partition_1, partition_2
INTO PARTITION new_partition TABLESPACE new_tablespace_name
LOB (column_name) store as (TABLESPACE tablespace_name)
... ;

索引構成表内のLOB

現在、索引構成表(IOT)は内部LOB列および外部LOB列をサポートしています。ほとんどの場合、IOT内のLOBに対するSQLのDDL、DMLおよびピース単位操作は、従来の表での操作と同様の結果をもたらします。作成時のLOBのデフォルトのセマンティクスのみが異なります。主な違いは次のとおりです。

- 表領域のマッピング: デフォルトで、または別に指定されていないかぎり、LOBデータおよび索引セグメントは、索引構成表の主キー索引セグメントが作成された表領域の中に作成されます。

- インライン記憶域とアウトライン記憶域: オーバーフロー・セグメントなしで作成された索引構成表内のすべてのLOBは、デフォルトでアウトラインに格納されます。つまり、索引構成表がオーバーフロー・セグメントなしで作成された場合、この表内のLOBのデフォルト記憶域属性はDISABLE STORAGE IN ROWになります。このようなLOBに対して強制的にENABLE STORAGE IN ROW句を指定しようとすると、SQLはエラーを表示します。
一方、オーバーフロー・セグメントが指定されている場合、索引構成表内のLOBは従来の表と同様のセマンティクスで動作します(「永続LOBに対する表領域および記憶特性の定義」を参照)。

LOB列を含む索引構成表(IOT)の例

次の例について考えてみます。

CREATE TABLE iotlob_tab (c1 INTEGER PRIMARY KEY, c2 BLOB, c3 CLOB, c4
VARCHAR2(20))
ORGANIZATION INDEX
TABLESPACE iot_ts
PCTFREE 10 PCTUSED 10 INITRANS 1 MAXTRANS 1 STORAGE (INITIAL 4K)
PCTTHRESHOLD 50 INCLUDING c2
OVERFLOW
TABLESPACE ioto_ts
PCTFREE 10 PCTUSED 10 INITRANS 1 MAXTRANS 1 STORAGE (INITIAL 8K) LOB (c2)
STORE AS lobseg (TABLESPACE lob_ts DISABLE STORAGE IN ROW
CHUNK 16384 PCTVERSION 10 CACHE STORAGE (INITIAL 2M)
INDEX lobidx_c1 (TABLESPACE lobidx_ts STORAGE (INITIAL 4K)));

これらの文を実行すると、次の要素を持つ索引構成表iotlob_tabが作成されます。

- 表領域iot_ts内の主キー索引セグメント

- 表領域ioto_ts内のオーバーフロー・データ・セグメント

- オーバーフロー・データ・セグメント内に明示的に格納される、C3から始まる列

- 表領域lob_ts内のBLOB(列C2)データ・セグメント

- 表領域lobidx_ts内のBLOB(列C2)索引セグメント

- 表領域iot_ts内のCLOB(列C3)データ・セグメント

- 表領域iot_ts内のCLOB(列C3)索引セグメント

- IOTにオーバーフロー・セグメントがあるためにインラインに格納されるCLOB(列C3)

- 明示的にアウトラインに強制格納されるBLOB(列C2)

注意:
オーバーフローが指定されていない場合、C2とC3の両方がデフォルトでアウトラインに格納されます。

BFILEや可変幅文字LOBなどの他のLOB機能も索引構成表でサポートされ、その使用方法も従来の表の場合と同じです。

パーティション化された索引構成表内のLOBに対する制限

LOB列はレンジ・パーティション化、リスト・パーティション化およびハッシュ・パーティション化された索引構成表でサポートされますが、次の制限があります。

- コンポジットでパーティション化された索引構成表はサポートされません。

- リレーショナルおよびオブジェクト・パーティション化された(レンジ、ハッシュまたはリスト・パーティション化された)索引構成表には、次のようにLOBを格納できます。ただし、MOVE、SPLITおよびMERGEなどのパーティション・メンテナンス操作はサポートされません。

- LOBデータ型として格納されているVARRAYデータ型

- LOB属性を持つ抽象データ型

- LOB型を持つネストした表

関連項目:
LOB列全般に関するその他の制限については、「LOBのルールと制限」を参照してください。

ネストした表内のLOBの更新

ネストした表内のLOBを更新するには、LOBを含む行を明示的にロックする必要があります。そのためには、LOB値を更新する前に、副問合せでFOR UPDATE句を指定します。

親表の行をロックしても、LOB列を含むネストした表の行はロックされないことに注意してください。

注意:
LOB列を含むネストした表は、LOBのコレクション作成のためにサポートされている唯一のデータ構造です。LOBデータ型のVARRAYは作成できません。

12 高度な設計時の考慮事項

この章では、より高度なアプリケーション開発時の考慮事項について説明します。

この章の内容は次のとおりです。

- LOBバッファリング・サブシステム(LBS)

- OPENおよびCLOSEインタフェースを使用した永続LOBのオープン

- 読取り一貫性のあるロケータ

- LOBロケータとトランザクション境界

- オブジェクト・キャッシュ内のLOB

- サイズがTBのLOBのサポート

- サイズがGBのLOB作成時のガイドライン

LOBバッファリング・サブシステム(LBS)

データベースは、高度なOCIベースのアプリケーションに対してLOBバッファリング・サブシステム(LBS)を提供する必要があります。このようなアプリケーションには、データ・カートリッジ、Webサーバー、および1つ以上のLOBの内容をクライアント・アドレス領域にバッファリングする必要がある他のクライアント・ベースのアプリケーションなどがあります。バッファリング・サブシステムに対するクライアント側の最大使用時のメモリー要件は512KBです。これはまた、バッファリングされたアクセス用として有効であるLOBの単一の読取りまたは書込み操作に対して指定できる最大量でもあります。

LOBバッファリングのメリット

バッファリングは、LOBの特定の部分に一連の小規模な読取りおよび書込みを実行する(繰り返し行われる場合が多い)クライアント・アプリケーションに対して特に、次の点で有効です。

- バッファリングによってサーバーへの遅延書込みが可能になります。クライアントのアドレス空間のLOBバッファに数回分の書込みをバッファリングし、最後にサーバーへフラッシュできます。これによって、クライアント・アプリケーションとサーバー間のネットワーク・ラウンドトリップ数が減り、LOB更新の全体的なパフォーマンスが向上します。

- バッファリングによって、サーバー上のLOBの総更新回数が減り、LOBのバージョン数とロギング量が減ります。これによって、全体的なLOBパフォーマンスおよびディスク使用率が向上します。

LOBバッファリングの使用上のガイドライン

バッファリングされたLOB操作では、次のことに注意する必要があります。

- LOBバッファの内容を明示的にフラッシュします。LOBバッファリング・サブシステムは、キャッシュではありません。LOBバッファの内容がサーバー上のLOB値とは異なる場合があります。LOBバッファの内容を明示的にフラッシュしなければ、サーバーの実際のLOBに反映された、バッファリングを利用した書込み結果を参照できません。

- バッファリングされた LOB 操作のエラー・リカバリはユーザーの責任です。実際のLOBの更新には遅れがあるため、バッファリングされた特定の読取りまたは書込み操作のエラー・レポートは、次回のサーバー・ベースのLOBへのアクセスまで行われません。

- LOBバッファリングは、シングル・ユーザー、シングル・スレッド形式です。LOBのバッファリング操作を含むトランザクションは、ユーザー・セッション間では移行できません。LBSは、シングル・ユーザー、シングル・スレッドのシステムであるためです。

- ロールバックするための論理セーブポイントを保持します。Oracleでは、バッファリングされたLOB操作に対するトランザクション・サポートは保証されていません。バッファリングされたLOB更新に対してトランザクション・セマンティクスを保証するには、アプリケーションで論理セーブポイントを保持して、エラーの際には、LOBに対するすべての変更をロールバックできるようにする必要があります。2つの論理セーブポイントの間に、バッファリングされたLOBの更新を常にラップする必要があります(「OCI: LOBバッファリングの例」を参照)。

- バッファリング・サブシステムを使用しない同一トランザクションの他の操作によって、LOBが更新されないことを確認します。どのトランザクションにおいても、バッファリングされた書込みを使用してLOBの更新を開始した後は、バッファリング・サブシステムを使用しない同一のトランザクション内で、他の操作によって同じLOBが更新されないようにする必要があります。
この状況は、サーバー・ベースのLOBを更新するSQL文を使用することで発生する可能性があります。Oracleではこのような操作を区別できないため、防止することができません。これは、アプリケーションの正確さと整合性に影響します。

- バッファリングを使用可能にしたLOBロケータを更新します。LOBに対するバッファリング操作は、通常の場合と同様にロケータを介して実行されます。バッファリングを使用可能にしたロケータは、そのロケータを使用したLOBへの書込み操作が実行されるまでは、読取り一貫性のあるLOBを提供します。「読取り一貫性のあるロケータ」を参照してください。
バッファリングされた書込み用として使用されることによってロケータが更新済ロケータになると、このロケータは、バッファリングされたサブシステムを介して確認できるように最新バージョンのLOBへのアクセスを常に提供します。また、バッファリングにより、この更新済ロケータの重要性が増します。つまり、LOBに対してバッファリングされた書込みはすべてこの更新済ロケータを介してのみ実行可能になります。バッファリングを使用可能にした他のロケータを介してLOBに書き込もうとすると、エラーが戻されます。「更新済ロケータを介したLOB更新の例」も参照してください。

- バッファリングを使用可能にしたLOBロケータにIN OUTまたはOUTパラメータを渡します。バッファリングを使用可能にした更新済ロケータは、PL/SQLプロシージャへのINパラメータとして渡せます。ただし、IN OUTまたはOUTパラメータを渡したり、更新済ロケータを戻そうとすると、エラーが発生します。

- バッファリングを使用可能にした更新済ロケータを別のロケータに割り当てることはできません。ロケータの割当ては、OCILobAssign()の使用、PL/SQL変数の割当て、オブジェクトがLOB属性を含む場合のOCIObjectCopy()の使用など、様々な場合に発生します。バッファリングを使用可能にしている読取り一貫性のあるロケータを、バッファリングを使用可能にしていないロケータに割り当てると、対象となるロケータに対してバッファリング機能がオンになります。同様に、バッファリングを使用可能にしていないロケータを、バッファリングを使用可能にしているロケータに割り当てると、対象となるロケータに対してバッファリング機能がオフになります。
また、もともとバッファリングを使用可能にしているロケータに対してSELECTを発行した場合、ロケータは新しいロケータ値で上書きされ、バッファリング機能はオフになります。

- 複数のロケータが同じLOBを指す場合は、1つのみのロケータでバッファリングを使用可能にします。複数の異なるロケータが同じLOBを指す場合は、1つのロケータでのみバッファリングが使用可能になるようにする必要があります。それ以外の場合、LOBの内容は保証されません。

- バッファリングを使用可能にしたLOBでは、バイト値0(ゼロ)の充填文字または空白の作成が必要になるような追加はサポートされていません。バッファリングされた書込みを使用したLOB値への追加は、これらの書込みを開始するオフセットが、BLOB(またはCLOB/NCLOB)の終わりから1バイト(または1文字)の場合にのみ可能です。バッファリング・サブシステムでは、サーバー・ベースのLOB内に対してバイト値0(ゼロ)の充填文字または空白の作成が必要になるような追加はサポートされていません。

- CLOBの場合、ロケータ・バインド変数に対するクライアント側のキャラクタ・セット・フォームがサーバー内の LOBのものと同じである必要があります。ほとんどのOCI LOBプログラムでは、この条件が必要です。ロケータがリモート・データベースから選択された場合は例外で、この場合は、OCIプログラムが現在アクセスしているデータベースからのキャラクタ・セット・フォームと異なっている場合があります。この場合は、エラーが戻されます。キャラクタ・セット・フォームがユーザーによって入力されていない場合、OracleではSQLCS_IMPLICITが使用されます。

LOBバッファリング・サブシステムの使用方法

次に、LOBバッファリング・サブシステムの詳細を示します。

LOBバッファの物理構造

各ユーザー・セッションの構造は、次のとおりです。

- 各ユーザー・セッションには、16ページの固定ページ・プールがあります。このページは、そのセッションからバッファリング・モードでアクセスされるすべてのLOBによって共有されます。

- 各ページ・サイズは、最大32KB(文字単位ではない)の固定サイズです。ページ・サイズ = n x CHUNK = 約32KBとなります。

LOBバッファは、これらのページの1つ以上で構成されています(セッションごとに最大16)。バッファリングされた特定の読取りまたは書込み操作に指定する必要がある最大量は512KBですが、状況が異なる場合、読取り/書込み可能な最大量は小さくなる可能性があります。

LOBバッファリング・サブシステムの使用例

LOBは、固定サイズの論理リージョンに分割されることを考慮してください。各ページはこれらの固定サイズ・リージョンの1つにマップされ、基本的には、メモリー内コピーにもマップされます。入力オフセット、および読取りまたは書込み操作用に指定した量に従って、ページ・プールから1ページ以上の空きページがLOBのバッファに割り当てられます。空きページは、バッファリングされた読取りまたは書込み操作によって読取りまたは書込みが行われていないページです。

たとえば、ページ・サイズを32KBとします。

- 入力オフセットが1000で、指定された読取り/書込みの量が30000の場合、Oracleでは、LOBの最初の32KBのリージョンがLOBバッファ内のページに読み取られます。

- 入力オフセットが33000で、読取り/書込みの量が30000の場合、LOBの次の32KBのリージョンがページに読み取られます。

- 入力オフセットが1000で、読取り/書込みの量が35000の場合、LOBのバッファは2ページになります。最初の部分はLOBの1から32KBまでのリージョンに、次の部分は32KB + 1から64KBまでのリージョンにマップされます。

ページとLOBリージョン間のこのマッピングは、ページに別のリージョンがマップされるまでの一時的なものです。LOBバッファ内で完全には使用可能ではないLOBのリージョンにアクセスしようとすると、ページ・プール内で使用可能な任意の空きページがLOBバッファに割り当てられます。ページ・プール内で使用可能な空きページがない場合、ページは次のように再配置されます。LOBバッファ内で未修正のページ間で最近最も使用されていないページが削除され、現在の操作に再配置されます。

LOBバッファ内にこのようなページがない場合、同じセッション内でバッファリングされている他のLOBの未修正のページ間で最近最も使用されていないページが削除されます。それでもこのようなページがない場合は、ページ・プール内のすべてのページが変更済であることを意味し、現在アクセスしているLOBまたは他のLOBの1つをフラッシュする必要があります。この状況はエラーとしてユーザーに通知されます。変更済ページが暗黙的にフラッシュされて再配置されることはありません。これらは明示的にフラッシュするか、LOBでのバッファリングを無効化することによって破棄できます。

前述の内容をわかりやすく説明するために、バッファリング・モードでL1およびL2の2つのLOBにアクセス中で、各LOBには8ページのバッファがある場合を考えてみます。L1のバッファの8ページのうち6ページが使用済で、残りの2ページには、サーバーから読み取られた未修正データが入っているとします。L2のバッファの状態も同様であるとします。ここで、L1の次のバッファリング操作のために、L1のバッファの未修正の2ページからLRUページが再配置されます。L1のバッファの8ページすべてがLOB書込みのために使用されると、LRUの方針に基づいて、L2のバッファから未修正の2ページを再配置することによって、L1に対してさらに2つの操作が可能になります。ただし、L1またはL2でさらにバッファリング操作を実行しようとすると、Oracleではエラーが戻されます。

バッファがすべて使用済の場合に、バッファリングされたLOBに別の読取りまたは書込みを行うと、次のエラーが発生します。

Error 22280: no more buffers available for operation

これには、2つの原因が考えられます。

1. バッファ・プールにあるすべてのバッファが、以前の操作で使用された。
この場合、LOBの更新に使用されているロケータを介してLOBをフラッシュします。

2. 以前バッファリングされた更新操作がないのにLOBをフラッシュしようとしている。
この場合、バッファをフラッシュする前に、バッファリングが可能なロケータを介してLOBに書き込みます。

LOBバッファのフラッシュ

フラッシュとは、一連のプロセスを指します。ロケータを介してバッファ内のLOBにデータを書き込むと、そのロケータは、更新済ロケータになります。更新済ロケータを介してバッファのLOBデータを更新すると、フラッシュ・コールは、次のことを行います。

- LOBのバッファの使用済ページをサーバー・ベースのLOBに書き込み、それによってLOB値を更新します。

- 更新済ロケータをリセットして、読取り一貫性のあるロケータにします。

- フラッシュ済バッファを解放するか、バッファのページの状態を使用済から変更されていない状態に戻します。

フラッシュ後、ロケータは、読取り一貫性のあるロケータとなり、別のロケータに割り当てることができます(L2 := L1)。

たとえば、L1およびL2の2つのロケータがあるとします。これらは両方とも読取り一貫性のあるロケータであり、サーバー内のLOBデータの状態との一貫性があるとします。バッファに書込みをしてLOBを更新すると、L1は更新済ロケータになります。L1およびL2は、その時点で、別のバージョンのLOB値を参照しています。サーバーのLOBを更新する場合は、L1を使用して、L2で得た読取り一貫性のある状態を維持する必要があります。フラッシュ操作によって、フラッシュに使用したロケータに新しいスナップショット環境が書き込まれます。重要な点は、LOBバッファをフラッシュするとき、更新済ロケータ(L1)を使用する必要があることです。読取り一貫性のあるロケータをフラッシュしようとすると、エラーが発生します。

LOBバッファのフラッシュに使用する方法によって、バッファ内のキャッシュがクリアされるかどうかが決定されます。また、パフォーマンスに次のように影響します。

- デフォルト・モードの場合、データは、フラッシュ操作が行われたときに変更されたページ内に維持されます。その際、同じバイト範囲に対して読取りまたは書込みを行う場合、サーバーに対するラウンドトリップは必要ありません。このコンテキストでバッファをフラッシュしてもバッファ内のデータはクリアされません。また、フラッシュされたバッファによって占有されているメモリーがクライアントのアドレス領域に戻されることもありません。

注意:
変更されていないページは、必要に応じてページ・アウトされます。

- 2つ目のケースでは、OCILobFlushBuffer()のフラグ・パラメータをOCI_LOB_BUFFER_FREEに設定して、バッファ・ページを解放すると、メモリーは、クライアントのアドレス領域に戻されます。この方法を使用してバッファをフラッシュすると、サーバー上でLOB値が更新され、読取り一貫性のあるロケータが戻され、バッファ・ページが解放されます。

更新済LOBのフラッシュ

LOBバッファリング・システムを使用して更新したLOBは、次の場合にフラッシュする必要があります。

- トランザクションをコミットする前

- 現行のトランザクションから別のトランザクションに移行する前

- LOBのバッファリング操作を使用禁止にする前

- 外部コールアウトの実行からPL/SQLのファンクション、プロシージャまたはメソッドのコールに戻る前
外部コールアウトが、PL/SQLブロックからコールされ、ロケータがパラメータとして渡される場合、バッファリングを使用可能にするコールを含めてすべてのバッファリング操作をコールアウトの内部で行う必要があることに注意してください。次の手順に従うことをお薦めします。

- 外部コールアウトを呼び出します。

- ロケータをバッファリング可能にします。

- ロケータを使用して読取り/書込みを行います。

- LOBをフラッシュします。

- ロケータをバッファリング使用禁止にします。

- PL/SQLのコール側のファンクション、プロシージャまたはメソッドに戻ります。

データベースでLOBバッファが暗黙的にフラッシュすることはないことに注意してください。

バッファリング対応のロケータの使用

バッファリング対応のロケータを使用できる場合と使用できない場合があることに注意してください。

- バッファリング対応ロケータを使用できる場合

- OCI - バッファリングが使用可能になっているロケータは、次のOCI APIとのみ使用できます。
OCILobRead2()、OCILobWrite2()、OCILobAssign()、OCILobIsEqual()、OCILobLocatorIsInit()、OCILobCharSetId()、OCILobCharSetForm()

- バッファリング対応ロケータを使用できない場合: 次のOCI APIを、バッファリングが使用可能になっているロケータとともに使用すると、エラーが戻されます。

- OCI — OCILobCopy2(), OCILobAppend(), OCILobErase2(), OCILobGetLength2(), OCILobTrim2(), OCILobWriteAppend2()
これらのAPIは、バッファリングが使用可能になっていないロケータとともに使用したときに、そのロケータが示すLOBがその他のロケータを介してバッファリング・モードでアクセスされている場合にも、エラーを戻します。

- PL/SQL (DBMS_LOB) — 入力LOBロケータでバッファリングが使用可能になっている場合、DBMS_LOB APIからエラーが戻されます。

- その他のすべてのロケータの場合と同様に、LOBバッファリングを使用可能にしたロケータは、トランザクションにまたがることはできません。

再選択を避けるためのロケータ状態の保存

さらにLOBバッファに書き込む前に、LOBの現在の状態を保存するとします。LOBバッファリングの使用中に更新を実行すると、既存のバッファへの書込みで、サーバーへのラウンドトリップは不要なため、ロケータのスナップショット環境はリフレッシュされません。これは、LOBバッファリングを使用しないで直接LOBを更新する場合にはあてはまりません。その場合、更新するたびにサーバーへのラウンドトリップが必要となるため、ロケータのスナップショットはリフレッシュされます。

LOBバッファを使用して書き込まれたLOBの状態を保存するには、次の手順に従います。

1. LOBをフラッシュして、LOBおよびロケータ(L1)のスナップショット環境を更新します。この時点では、ロケータ(L1)の状態とLOBは同じです。

2. フラッシュおよび更新に使用されたロケータ(L1)を別のロケータ(L2)に割り当てます。この時点では、2つのロケータの状態(L1およびL2)とLOBはすべて同じです。

これで、L2は読取り一貫性のあるロケータになり、フラッシュが行われるまではL1を介して行われた変更にアクセスできますが、フラッシュ後はアクセスできません。この割当てによって、ロケータをL2に選択しなおすために、サーバーにアクセスする必要がなくなります。

OCI: LOBバッファリングの例

次に示すOCIの擬似コード例は、Oracle Databaseサンプル・スキーマに含まれるPMスキーマに基づいています。

OCI_BLOB_buffering_program()
{
int            amount;
int            offset;
OCILobLocator  lbs_loc1, lbs_loc2, lbs_loc3;
void          *buffer;
int            bufl;

-- Standard OCI initialization operations - logging on to
-- server, creating and initializing bind variables...

init_OCI();

-- Establish a savepoint before start of LOB buffering subsystem
-- operations
exec_statement("savepoint lbs_savepoint");

-- Initialize bind variable to BLOB columns from buffered
-- access:
exec_statement("select ad_composite into lbs_loc1 from Print_media
where ad_id = 12001");
exec_statement("select ad_composite into lbs_loc2 from Print_media
where ad_id = 12001 for update");
exec_statement("select ad_composite into lbs_loc2 from Print_media
where ad_id = 12001 for update");

-- Enable locators for buffered mode access to LOB:
OCILobEnableBuffering(..., lbs_loc1);
OCILobEnableBuffering(..., lbs_loc2);
OCILobEnableBuffering(..., lbs_loc3);

-- Read 4K bytes through lbs_loc1 starting from offset 1:
amount = 4096; offset = 1; bufl = 4096;
OCILobRead2(.., lbs_loc1, &amount, 0, offset, buffer, bufl, ...);
if (exception)
goto exception_handler;
-- This reads the first 32K bytes of the LOB from
-- the server into a page (call it page_A) in the LOB
-- client-side buffer.
-- lbs_loc1 is a read-consistent locator.

-- Write 4K of the LOB throgh lbs_loc2 starting from
-- offset 1:
amount = 4096; offset = 1; bufl = 4096;
buffer = populate_buffer(4096);
OCILobWrite2(.., lbs_loc2, &amount, 0, offset, buffer, bufl, ..);

if (exception)
goto exception_handler;
-- This reads the first 32K bytes of the LOB from
-- the server into a new page (call it page_B) in the
-- LOB buffer, and modify the contents of this page
-- with input buffer contents.
-- lbs_loc2 is an updated locator.

-- Read 20K bytes through lbs_loc1 starting from
-- offset 10K
amount = 20480; offset = 10240;
OCILobRead2(.., lbs_loc1, &amount, 0, offset, buffer, bufl, ..);

if (exception)
goto exception_handler;
-- Read directly from page_A into the user buffer.
-- There is no round-trip to the server because the
-- data is in the client-side buffer.

-- Write 20K bytes through lbs_loc2 starting from offset
-- 10K
amount = 20480; offset = 10240; bufl = 20480;
buffer = populate_buffer(20480);
OCILobWrite2(.., lbs_loc2, &amount, 0, offset, buffer, bufl, ..);

if (exception)
goto exception_handler;
-- The contents of the user buffer are now written
-- into page_B without involving a round-trip to the
-- server.  This avoids making a new LOB version on the
-- server and writing redo to the log.

-- The following write through lbs_loc3 also
-- results in an error:
amount = 20000; offset = 1000; bufl = 20000;
buffer = populate_buffer(20000);
OCILobWrite2(.., lbs_loc3, amount, 0, offset,buffer, bufl, ..);

if (exception)
goto exception_handler;
-- No two locators can be used to update a buffered LOB
-- through the buffering subsystem

-- The following update through lbs_loc3 also
-- results in an error
OCILobFileCopy(.., lbs_loc3, lbs_loc2, ..);

if (exception)
goto exception_handler;
-- Locators enabled for buffering cannot be used with
-- operations like Append, Copy, Trim and so on
-- When done, flush the LOB buffer to the server:
OCILobFlushBuffer(.., lbs_loc2, OCI_LOB_BUFFER_NOFREE);

if (exception)
goto exception_handler;
-- This flushes all the modified pages in the LOB buffer,
-- and resets lbs_loc2 from updated to read-consistent
-- locator. The modified pages remain in the buffer
-- without freeing memory.  These pages can be aged
-- out if necessary.

-- Disable locators for buffered mode access to LOB */
OCILobDisableBuffering(..., lbs_loc1);
OCILobDisableBuffering(..., lbs_loc2);
OCILobDisableBuffering(..., lbs_loc3);

if (exception)
goto exception_handler;
-- This disables the three locators for buffered access,
-- and frees up the LOB buffer resources.
exception_handler:
handle_exception_reporting();
exec_statement("rollback to savepoint lbs_savepoint");
}

OPENおよびCLOSEインタフェースを使用した永続LOBのオープン

OPENおよびCLOSEインタフェースを使用すると、永続LOBインスタンスを明示的にオープンできます。OPENインタフェースを使用してLOBインスタンスをオープンすると、そのインスタンスはCLOSEインタフェースを使用してLOBを明示的にクローズするまでオープンされたままになります。ISOPENインタフェースを使用すると、永続LOBがオープンしているかどうかを確認できます。

LOBのオープン状態はLOBロケータではなくLOBインスタンスに関連付けられていることに注意してください。ロケータには、それが指すLOBインスタンスがオープンしているかどうかを示す情報は格納されません。

関連項目:
「LOBのオープンおよびクローズ」

LOBの明示的なオープンによる索引のパフォーマンス上のメリット

LOBインスタンスを明示的にオープンすると、索引付き列の永続LOBのパフォーマンスを改善できます。

LOBインスタンスを明示的にオープンしない場合、LOBに対する変更が行われるたびにLOBインスタンスが暗黙的にオープンおよびクローズされます。ドメイン索引に対するトリガーは、LOBがクローズされるたびに起動されます。この場合、LOBインスタンスに対する変更が行われるとすぐにLOB上のドメイン索引が更新されます。ドメイン索引は常に有効であり、いつでも使用できます。

LOBインスタンスを明示的にオープンすると、LOBを明示的にクローズするまで索引トリガーは起動されません。この方法を使用すると、LOBを明示的にクローズするまで不要な索引付けイベントが発生しなくなり、索引列のパフォーマンスを改善できます。LOB列のすべての索引は、そのLOBを明示的にクローズするまで無効であることに注意してください。

明示的にオープンしたLOBインスタンスの操作

LOBインスタンスを明示的にオープンした場合は、トランザクションをコミットする前にLOBをクローズする必要があります。

オープン状態にあるLOBインスタンスに対するトランザクションをコミットすると、エラーが発生します。このエラーが発生すると、LOBインスタンスが暗黙的にクローズされてLOBインスタンスに対する変更が保存され、トランザクションがコミットされますが、LOB列の索引は更新されません。この場合は、LOB列に対する索引を再作成する必要があります。

その後トランザクションをロールバックすると、LOBインスタンスは前の状態にロールバックされますが、LOBインスタンスは明示的にオープンされません。

次の状況で明示的にオープンしたLOBインスタンスは、すべてクローズする必要があります。

- トランザクションを起動するDML文の間(SELECT ... FOR UPDATEおよびCOMMITを含む)

- 自律型トランザクション・ブロックの中

- セッションの終了前(関係するトランザクションがないとき)
LOBインスタンスを明示的にクローズしない場合、セッションの終了時に暗黙的にクローズされ、索引トリガーは起動されません。

明示的にオープンしたLOBがオープン状態かクローズ状態かを追跡してください。次の場合にはエラーが発生します。

- すでに明示的にオープンしているLOBインスタンスを明示的にオープンする場合

- すでに明示的にクローズしているLOBインスタンスを明示的にクローズする場合

このエラーは、LOBインスタンスへのアクセスに同じロケータを使用しているかどうかに関係なく発生します。

読取り一貫性のあるロケータ

Oracle DatabaseのLOBに対する読取り一貫性メカニズムは、その他すべてのスカラー量に対するデータベースの読取りおよび更新のための読取り一貫性メカニズムと同じです。読取り一貫性に関する一般的な説明は、『Oracle Database概要』を参照してください。LOBロケータの場合、読取り一貫性にはいくつかの特別な用途があるため、正しく理解しておく必要があります。これらの用途については次の項で説明します。

読取り一貫性のあるロケータになる、SELECTされたロケータ

FOR UPDATE句の有無にかかわらず、SELECTされたロケータは読取り一貫性のあるロケータとなり、LOB値がそのロケータによって更新されるまでは読取り一貫性のあるロケータとして存在します。読取り一貫性のあるロケータには、SELECT操作の実行時点のスナップショット環境が含まれます。

これには複雑な意味があります。たとえば、SELECT操作によって読取り一貫性のあるロケータ(L1)を作成したとします。L1によって永続LOB値を読み取るときは、次のことに注意してください。

- SELECT文にFOR UPDATEが含まれていても、SELECT文実行時点のLOBが読み取られます。

- 同じトランザクションの別のロケータ(L2)によってLOB値が更新されても、L1ではL2の更新が認識されません。

- L1では、別のトランザクションによってLOBにコミットされた更新も認識されません。

- 読取り一貫性のあるロケータL1が別のロケータL2にコピーされた場合(たとえば、2つのロケータ変数のPL/SQL割当てL2:= L1によって)、L2はL1と同様に読取り一貫性のあるロケータとなり、読み取られるデータはL1に対するSELECT実行時点のデータとなります。

複数のロケータが存在していることを利用して、変化するLOB値のそれぞれの値にアクセスできます。ただし、その場合は、どのロケータでどの値にアクセスしているかを常に理解しておく必要があります。

LOBの更新および読取り一貫性の例

読取り一貫性のあるロケータでは、SELECT実行時期に関係なく同じLOB値が提供されます。

次に、読取り一貫性と更新の関係を簡単な例で示します。Print_media表とPL/SQLを使用して、clob_selected、clob_updateおよびclob_copiedの3つのCLOBインスタンスをロケータとして作成します。

次のコード例では、t1からt6が次のように処理されます。

- 最初のSELECT INTOの実行時(t1)に、ad_sourcetext内の値がロケータclob_selectedに対応付けられます。

- 次の操作(t2)で、ad_sourcetext内の値がロケータclob_updatedに対応付けられます。t1とt2の間ではad_sourcetextの値が変わらないため、clob_selectedおよびclob_updatedの両方のロケータは、異なる時点でのスナップショットを反映していても、同じ値を持つ読取り一貫性のあるロケータとなります。

- 3つ目の操作(t3)では、clob_selectedの値がclob_copiedにコピーされます。この時点で、3つのロケータが同じ値になります。例では、一連のDBMS_LOB.READ()コールがこれを示しています。

- t4で、プログラムはDBMS_LOB.WRITE()を使用してclob_updated内の値を変更します。DBMS_LOB.READ()が新しい値を示します。

- ただし、clob_selectedを介した値のDBMS_LOB.READ()は(t5)、これが読取り一貫性のあるロケータで、SELECTの実行時と同じ値が引き続き参照されることを示します。

- 同様に、clob_copiedを介した値のDBMS_LOB.READ()は(t6)、これが読取り一貫性のあるロケータで、clob_selectedと同じ値が引き続き参照されることを示します。

INSERT INTO PRINT_MEDIA VALUES (2056, 20020, EMPTY_BLOB(),
'abcd', EMPTY_CLOB(), EMPTY_CLOB(), NULL, NULL, NULL, NULL);

COMMIT;

DECLARE
num_var           INTEGER;
clob_selected     CLOB;
clob_updated      CLOB;
clob_copied       CLOB;
read_amount       INTEGER;
read_offset       INTEGER;
write_amount      INTEGER;
write_offset      INTEGER;
buffer            VARCHAR2(20);

BEGIN
-- At time t1:
SELECT ad_sourcetext INTO clob_selected
FROM Print_media
WHERE ad_id = 20020;

-- At time t2:
SELECT ad_sourcetext INTO clob_updated
FROM Print_media
WHERE ad_id = 20020
FOR UPDATE;

-- At time t3:
clob_copied := clob_selected;
-- After the assignment, both the clob_copied and the
-- clob_selected have the same snapshot as of the point in time
-- of the SELECT into clob_selected

-- Reading from the clob_selected and the clob_copied does
-- return the same LOB value. clob_updated also sees the same
-- LOB value as of its select:
read_amount := 10;
read_offset := 1;
dbms_lob.read(clob_selected, read_amount, read_offset, buffer);
dbms_output.put_line('clob_selected value: ' || buffer);
-- Produces the output 'abcd'

read_amount := 10;
dbms_lob.read(clob_copied, read_amount, read_offset, buffer);
dbms_output.put_line('clob_copied value: ' || buffer);
-- Produces the output 'abcd'

read_amount := 10;
dbms_lob.read(clob_updated, read_amount, read_offset, buffer);
dbms_output.put_line('clob_updated value: ' || buffer);
-- Produces the output 'abcd'

-- At time t4:
write_amount := 3;
write_offset := 5;
buffer := 'efg';
dbms_lob.write(clob_updated, write_amount, write_offset, buffer);

read_amount := 10;
dbms_lob.read(clob_updated, read_amount, read_offset, buffer);
dbms_output.put_line('clob_updated value: ' || buffer);
-- Produces the output 'abcdefg'

-- At time t5:
read_amount := 10;
dbms_lob.read(clob_selected, read_amount, read_offset, buffer);
dbms_output.put_line('clob_selected value: ' || buffer);
-- Produces the output 'abcd'

-- At time t6:
read_amount := 10;
dbms_lob.read(clob_copied, read_amount, read_offset, buffer);
dbms_output.put_line('clob_copied value: ' || buffer);
-- Produces the output 'abcd'
END;
/

更新済ロケータを介したLOB更新の例

LOBロケータ(L1)によって永続LOBの値を更新すると、L1(ロケータ自体)は、L1によるLOB値の操作が完了した時点のスナップショット環境を持つように更新されます。このため、L1は更新済ロケータと呼ばれます。この操作によって、LOB値に対して行った変更を、同じロケータL1による次の読取り時に参照できます。

注意:
LOB値を読み取ることのみのためにロケータが使用される場合、ロケータのスナップショット環境は更新されません。更新されるのは、PL/SQL DBMS_LOBパッケージまたはOCI LOB APIを使用して、ロケータを介してLOB値を変更した場合のみです。

別のトランザクションによってコミットされた更新は、そのトランザクションがコミット読取りトランザクションであり、他のトランザクションのコミット後にL1を使用してLOB値を更新する場合のみに、L1によって認識されます。

注意:
永続LOBの値を更新すると、最新のLOB値が常に変更されます。

OCI LOB APIやPL/SQL DBMS_LOBパッケージなどの使用可能なメソッドによって永続LOBの値を更新することは、LOB値を更新して、新しいLOB値を参照するロケータを再選択することになります。

注意:
どのような手段でもLOBロケータを選択すればロケータから読み取れますが、書き込めません。
SQLを介したLOB値の更新は、単なるUPDATE文です。UPDATEによって行われた変更をロケータが認識できるように、LOBロケータを再選択するか、UPDATE文でRETURNING句を使用するかは、ユーザーが決定します。LOBロケータを再選択するかRETURNING句を使用しないかぎり、最新の値を読み取っていない場合でも最新の値を読み取っていると判断する場合があります。このような理由により、SQL DMLをOCIおよび DBMS_LOB ピース単位操作と混同しないようにする必要があります。

関連項目:
『Oracle Database PL/SQL言語リファレンス』

SQL DMLおよびDBMS_LOBを使用したLOBの更新例

次の例では、Print_media表を使用し、CLOBロケータがclob_selectedとして作成されます。この例では、t1からt3が次のように処理されます。

- 最初のSELECT INTOの実行時(t1)に、ad_sourcetext内の値がロケータclob_selectedに対応付けられます。

- 次の操作(t2)では、ロケータclob_selectedに影響を与えずに、SQL UPDATE文を介してad_sourcetext内の値が変更されます。ロケータは元のSELECT時点でのLOB値を参照します。つまり、ロケータはSQL UPDATE文によって実行された更新を認識しません。例では、後続のDBMS_LOB.READ()コールがこれを示しています。

- 3つ目の操作(t3)では、LOB値が再選択されロケータclob_selectedに挿入されます。これによって、ロケータは最新のスナップショット環境に更新され、先のSQL UPDATE文によって行われた変更を認識できるようになります。このため、次のDBMS_LOB.READ()では、LOB値が空である(データがない)ためエラーが戻されます。

INSERT INTO Print_media VALUES (3247, 20010, EMPTY_BLOB(),
'abcd', EMPTY_CLOB(), EMPTY_CLOB(), NULL, NULL, NULL, NULL);

COMMIT;

DECLARE
num_var           INTEGER;
clob_selected     CLOB;
read_amount       INTEGER;
read_offset       INTEGER;
buffer            VARCHAR2(20);

BEGIN

-- At time t1:
SELECT ad_sourcetext INTO clob_selected
FROM Print_media
WHERE ad_id = 20010;

read_amount := 10;
read_offset := 1;
dbms_lob.read(clob_selected, read_amount, read_offset, buffer);
dbms_output.put_line('clob_selected value: ' || buffer);
-- Produces the output 'abcd'

-- At time t2:
UPDATE Print_media SET ad_sourcetext = empty_clob()
WHERE ad_id = 20010;
-- although the most current LOB value is now empty,
-- clob_selected still sees the LOB value as of the point
-- in time of the SELECT

read_amount := 10;
dbms_lob.read(clob_selected, read_amount, read_offset, buffer);
dbms_output.put_line('clob_selected value: ' || buffer);
-- Produces the output 'abcd'

-- At time t3:
SELECT ad_sourcetext INTO clob_selected FROM Print_media WHERE
ad_id = 20010;
-- the SELECT allows clob_selected to see the most current
-- LOB value

read_amount := 10;
dbms_lob.read(clob_selected, read_amount, read_offset, buffer);
-- ERROR: ORA-01403: no data found
END;
/

同じLOB値を更新するために1つのロケータを使用する例

注意:
異なるロケータを使用して同じLOBを更新しないでください。特定のLOB値の更新にはロケータを1つのみ使用することで、多くの問題を回避できます。

次の例では、Print_media表を使用し、clob_updatedおよびclob_copiedの2つのCLOBをロケータとして作成します。

この例では、t1からt5が次のように処理されます。

- 最初のSELECT INTOの実行時(t1)に、ad_sourcetext内の値がロケータclob_updatedに対応付けられます。

- 次の操作(t2)では、clob_updatedの値がclob_copiedにコピーされます。この時点では、両方のロケータが同じ値を参照します。例では、一連のDBMS_LOB.READ()コールがこれを示しています。

- t3で、プログラムはDBMS_LOB.WRITE()を使用してclob_updated内の値を変更します。DBMS_LOB.READ()が新しい値を示します。

- ただし、clob_copiedを介した値のDBMS_LOB.READ()は(t4)、clob_updatedから割り当てられた時点(t2)のLOBの値を参照しています。

- clob_updatedがclob_copiedに割り当てられた時点(t5)で初めて、clob_copiedはclob_updatedによる更新があったことを認識します。

INSERT INTO PRINT_MEDIA VALUES (2049, 20030, EMPTY_BLOB(),
'abcd', EMPTY_CLOB(), EMPTY_CLOB(), NULL, NULL, NULL, NULL);

COMMIT;

DECLARE
num_var          INTEGER;
clob_updated     CLOB;
clob_copied      CLOB;
read_amount      INTEGER;
read_offset      INTEGER;
write_amount     INTEGER;
write_offset     INTEGER;
buffer           VARCHAR2(20);
BEGIN

-- At time t1:
SELECT ad_sourcetext INTO clob_updated FROM PRINT_MEDIA
WHERE ad_id = 20030
FOR UPDATE;

-- At time t2:
clob_copied := clob_updated;
-- after the assign, clob_copied and clob_updated see the same
-- LOB value

read_amount := 10;
read_offset := 1;
dbms_lob.read(clob_updated, read_amount, read_offset, buffer);
dbms_output.put_line('clob_updated value: ' || buffer);
-- Produces the output 'abcd'

read_amount := 10;
dbms_lob.read(clob_copied, read_amount, read_offset, buffer);
dbms_output.put_line('clob_copied value: ' || buffer);
-- Produces the output 'abcd'

-- At time t3:
write_amount := 3;
write_offset := 5;
buffer := 'efg';
dbms_lob.write(clob_updated, write_amount, write_offset,
buffer);

read_amount := 10;
dbms_lob.read(clob_updated, read_amount, read_offset, buffer);
dbms_output.put_line('clob_updated value: ' || buffer);
-- Produces the output 'abcdefg'

-- At time t4:
read_amount := 10;
dbms_lob.read(clob_copied, read_amount, read_offset, buffer);
dbms_output.put_line('clob_copied value: ' || buffer);
-- Produces the output 'abcd'

-- At time t5:
clob_copied := clob_updated;

read_amount := 10;
dbms_lob.read(clob_copied, read_amount, read_offset, buffer);
dbms_output.put_line('clob_copied value: ' || buffer);
-- Produces the output 'abcdefg'
END;
/

PL/SQL(DBMS_LOB)バインド変数を使用したLOBの更新の例

別の永続LOBを更新するためのソースとしてLOBロケータを使用する場合(SQLのINSERT文またはUPDATE文、DBMS_LOB.COPYルーチンなど)、ソースLOBロケータ内のスナップショット環境によって、ソースとして使用されるLOB値が決まります。ソース・ロケータ(たとえばL1)が読取り一貫性のあるロケータの場合、L1のSELECT実行時点のLOB値が使用されます。ソース・ロケータ(たとえばL2)が更新済ロケータの場合、更新時におけるL2のスナップショット環境に対応付けられたLOB値が使用されます。

次の例では、Print_media表を使用し、clob_selected、clob_updatedおよびclob_copiedの3つのCLOBをロケータとして作成します。

この例では、t1からt5が次のように処理されます。

- 最初のSELECT INTOの実行時(t1)に、ad_sourcetext内の値がロケータclob_updatedに対応付けられます。

- 次の操作(t2)では、clob_updatedの値がclob_copiedにコピーされます。この時点では、両方のロケータが同じ値を参照します。

- この時点で(t3)、プログラムはDBMS_LOB.WRITE()を使用してclob_updated内の値を変更します。DBMS_LOB.READ()が新しい値を示します。

- ただし、clob_copiedを介した値のDBMS_LOB.READ()は(t4)、clob_copiedがclob_updatedによる変更を参照しないことを示します。

- このため(t5の時点で)、clob_copiedをINSERT文の値のソースとして使用する場合、clob_copiedと対応付けられた値が挿入されます(clob_updatedによる新規の変更は反映されません)。これは、その後の、挿入された直後の値に対するDBMS_LOB.READ()によってわかります。

INSERT INTO PRINT_MEDIA VALUES (2056, 20020, EMPTY_BLOB(),
'abcd', EMPTY_CLOB(), EMPTY_CLOB(), NULL, NULL, NULL, NULL);

COMMIT;

DECLARE
num_var           INTEGER;
clob_selected     CLOB;
clob_updated      CLOB;
clob_copied       CLOB;
read_amount       INTEGER;
read_offset       INTEGER;
write_amount      INTEGER;
write_offset      INTEGER;
buffer            VARCHAR2(20);
BEGIN

-- At time t1:
SELECT ad_sourcetext INTO clob_updated FROM PRINT_MEDIA
WHERE ad_id = 20020
FOR UPDATE;

read_amount := 10;
read_offset := 1;
dbms_lob.read(clob_updated, read_amount, read_offset, buffer);
dbms_output.put_line('clob_updated value: ' || buffer);
-- Produces the output 'abcd'

-- At time t2:
clob_copied := clob_updated;

-- At time t3:
write_amount := 3;
write_offset := 5;
buffer := 'efg';
dbms_lob.write(clob_updated, write_amount, write_offset, buffer);

read_amount := 10;
dbms_lob.read(clob_updated, read_amount, read_offset, buffer);
dbms_output.put_line('clob_updated value: ' || buffer);
-- Produces the output 'abcdefg'
-- note that clob_copied does not see the write made before
-- clob_updated

-- At time t4:
read_amount := 10;
dbms_lob.read(clob_copied, read_amount, read_offset, buffer);
dbms_output.put_line('clob_copied value: ' || buffer);
-- Produces the output 'abcd'

-- At time t5:
-- the insert uses clob_copied view of the LOB value which does
-- not include clob_updated changes
INSERT INTO PRINT_MEDIA VALUES (2056, 20022, EMPTY_BLOB(),
clob_copied, EMPTY_CLOB(), EMPTY_CLOB(), NULL, NULL, NULL, NULL)
RETURNING ad_sourcetext INTO clob_selected;

read_amount := 10;
dbms_lob.read(clob_selected, read_amount, read_offset, buffer);
dbms_output.put_line('clob_selected value: ' || buffer);
-- Produces the output 'abcd'
END;
/

LOBロケータとトランザクション境界

この項では、トランザクションでのLOBロケータの使用、およびトランザクションIDについて説明します。LOBロケータおよびBFILEロケータの基本的な説明は、「LOBロケータとBFILEロケータ」を参照してください。

LOBロケータとトランザクションについては、次のことに注意してください。

- ロケータがトランザクションIDを含む場合
トランザクションを開始してからロケータを選択する場合。トランザクションを開始した後にロケータを選択すると、ロケータにトランザクションIDが含まれます。トランザクションを明示的に開始しなくてもトランザクションに暗黙的に入ることができます。たとえば、SELECT... FOR UPDATEによってトランザクションは暗黙的に開始されます。このような場合、ロケータにはトランザクションIDが含まれます。

- ロケータがトランザクションIDを含まない場合。

- トランザクション外でロケータを選択する場合。トランザクションの外部でロケータを選択する場合は対照的に、ロケータはトランザクションIDを含みません。

- DML文実行前に選択する場合。最初のDML文実行まで、トランザクションIDは割り当てられません。このため、このようなDML文の前に選択されたロケータはIDを含みません。

ロケータを使用したLOBに対する読取りおよび書込み

ロケータがトランザクションIDを含んでいるかどうかにかかわらず、常にロケータを使用してLOBデータを読み取ることができます。

- ロケータを使用して書込みができない場合: ロケータがトランザクションIDを含む場合、その特定のトランザクション外でLOBに書き込むことはできません。

- ロケータを使用して書込みができる場合: ロケータがトランザクションIDを含まない場合、トランザクションを明示的または暗黙的に開始した後で、LOBに書き込むことができます。

- シリアライズ可能なトランザクションを含むロケータを使用して読取りまたは書込みができない場合: ロケータが古いトランザクションのトランザクションIDを含み、現行のトランザクションがシリアライズ可能な場合、そのロケータを使用した読取りまたは書込みはできません。

- シリアライズ可能でないトランザクションを含むロケータを使用して読取りはできるが、書込みはできない場合: トランザクションがシリアライズ可能でない場合、そのトランザクション外で読取りはできますが、書込みはできません。

次の例では、ロケータとシリアライズ可能でないトランザクションの関係を示します。

トランザクション境界外でのロケータの選択

次の使用例では、トランザクション外でロケータが選択された場合に、シリアライズ可能でないトランザクションでロケータを使用する方法について説明します。

使用例1:

1. 現行トランザクションを持たないロケータを選択します。この時点ではロケータはトランザクションIDを含みません。

2. トランザクションを開始します。

3. ロケータを使用してLOBからデータを読み取ります。

4. トランザクションをコミットまたはロールバックします。

5. ロケータを使用してLOBからデータを読み取ります。

6. トランザクションを開始します。ロケータはトランザクションIDを含みません。

7. ロケータを使用してデータをLOBに書き込みます。この操作は、ロケータが書込みの前にトランザクションIDを含まないため有効です。このコールの後、ロケータはトランザクションIDを含むようになります。

使用例2:

1. 現行トランザクションを持たないロケータを選択します。この時点ではロケータはトランザクションIDを含みません。

2. トランザクションを開始します。ロケータはトランザクションIDを含みません。

3. ロケータを使用してLOBからデータを読み取ります。ロケータはトランザクションIDを含みません。

4. ロケータを使用してデータをLOBに書き込みます。この操作は、ロケータが書込みの前にトランザクションIDを含まないため有効です。このコールの後、ロケータはトランザクションIDを含むようになります。続けてLOBの読取りまたは書込みを行うことができます。

5. トランザクションをコミットまたはロールバックします。ロケータは引き続きトランザクションIDを含みます。

6. ロケータを使用してLOBからデータを読み取ります。この操作は有効です。

7. トランザクションを開始します。ロケータは前のトランザクションのIDを含んでいます。

8. ロケータを使用してデータをLOBに書き込みます。ロケータが現行トランザクションに一致するトランザクションIDを含まないため、この書込み操作は失敗します。

トランザクション境界内でのロケータの選択

次の使用例では、ロケータをトランザクション内で選択する場合に、シリアライズ可能でないトランザクションでロケータを使用する方法について説明します。

使用例1:

1. トランザクションの中でロケータを選択します。この時点では、ロケータはトランザクションIDを含んでいます。

2. トランザクションを開始します。ロケータは前のトランザクションのIDを含んでいます。

3. ロケータを使用してLOBからデータを読み取ります。ロケータの中のトランザクションIDは現在のトランザクションに一致していませんが、この操作は有効です。

関連項目:
ロケータを使用したLOBデータの読取りの詳細は、「読取り一貫性のあるロケータ」を参照してください。

4. ロケータを使用してデータをLOBに書き込みます。ロケータの中のトランザクションIDが現在のトランザクションに一致していないため、この操作は失敗します。

使用例2:

1. トランザクションを開始します。

2. ロケータを選択します。ロケータがトランザクションの中で選択されたため、トランザクションIDが含まれています。

3. ロケータを使用してLOBの読取りまたは書込みを行います。これらの操作は有効です。

4. トランザクションをコミットまたはロールバックします。ロケータは引き続きトランザクションIDを含みます。

5. ロケータを使用してLOBからデータを読み取ります。ロケータの中にトランザクションIDがあり、そのトランザクションはすでにコミットまたはロールバックされていますが、この操作は有効です。

6. ロケータを使用してデータをLOBに書き込みます。ロケータの中のトランザクションIDはすでにコミットまたはロールバックされたトランザクション用であるため、この操作は失敗します。

複数のトランザクションにまたがることのできないLOBロケータ

DBMS_LOB、OCI、SQLのINSERT文またはUPDATE文を使用し、LOBロケータによって永続LOBの値を更新すると、読取り一貫性のあるロケータが更新済ロケータに変更されます。INSERT文やUPDATE文によって、トランザクションが自動的に開始され、行がロックされます。一度これが発生すると、ロケータを現行トランザクション以外で使用して、LOB値を変更できなくなる可能性があります。データの書込みに使用するLOBロケータを複数のトランザクションにまたがって使用することはできません。ただし、シリアライズ可能なトランザクション内でない場合は、ロケータを使用してLOB値を読み取ることができます。

関連項目:
LOBとトランザクション境界の関係については、「LOBロケータとトランザクション境界」を参照してください。

次の例では、CLOBロケータ(clob_updated)が作成されます。

- 最初のSELECT INTOの実行時(t1)に、ad_sourcetext内の値がロケータclob_updatedに対応付けられます。

- 次の操作で(t2)、DBMS_LOB.WRITEファンクションを使用してclob_updated内の値を変更します。DBMS_LOB.READが新しい値を示します。

- COMMIT文(t3)によって現行のトランザクションが終了します。

- トランザクションを終了すると(t4)、clob_updatedロケータは別のトランザクション(コミット済)を参照することになるため、その後のDBMS_LOB.WRITE操作は失敗します。これは、戻されるエラーによって通知されます。このLOBロケータをさらにDBMS_LOB(およびOCI)の変更操作で使用するには、再選択する必要があります。

トランザクションにまたがらないロケータの例

INSERT INTO PRINT_MEDIA VALUES (2056, 20010, EMPTY_BLOB(),
'abcd', EMPTY_CLOB(), EMPTY_CLOB(), NULL, NULL, NULL, NULL);

COMMIT;

DECLARE
num_var          INTEGER;
clob_updated     CLOB;
read_amount      INTEGER;
read_offset      INTEGER;
write_amount     INTEGER;
write_offset     INTEGER;
buffer           VARCHAR2(20);

BEGIN
-- At time t1:
SELECT      ad_sourcetext
INTO        clob_updated
FROM        PRINT_MEDIA
WHERE       ad_id = 20010
FOR UPDATE;
read_amount := 10;
read_offset := 1;
dbms_lob.read(clob_updated, read_amount, read_offset, buffer);
dbms_output.put_line('clob_updated value: ' || buffer);
-- This produces the output 'abcd'

-- At time t2:
write_amount := 3;
write_offset := 5;
buffer := 'efg';
dbms_lob.write(clob_updated, write_amount, write_offset, buffer);
read_amount := 10;
dbms_lob.read(clob_updated, read_amount, read_offset, buffer);
dbms_output.put_line('clob_updated value: ' || buffer);
-- This produces the output 'abcdefg'

-- At time t3:
COMMIT;

-- At time t4:
dbms_lob.write(clob_updated , write_amount, write_offset, buffer);
-- ERROR: ORA-22990: LOB locators cannot span transactions
END;
/

オブジェクト・キャッシュ内のLOB

内部LOB属性および外部LOB属性には、次のようなオブジェクト・キャッシュの問題があります。

- 永続LOB属性: オブジェクト・キャッシュ内にオブジェクトを作成すると、LOB属性は空に設定されます。
オブジェクト・キャッシュ内に、永続LOB属性を持つオブジェクトを作成すると、そのLOB属性は暗黙的に空に設定されます。この空のLOBロケータを使用して、データをLOBに書き込むことはできません。最初にオブジェクトをフラッシュし、その後、表に行を挿入し、空のLOB(長さ0(ゼロ)のLOB)を作成する必要があります。オブジェクトがオブジェクト・キャッシュ内でリフレッシュされ(OCI_PIN_LATESTを使用)、実際のLOBロケータがLOB属性に読み取られると、OCI LOB APIをコールしてLOBにデータを書き込むことができます。

- 外部LOB(BFILE)属性: オブジェクト・キャッシュ内にオブジェクトを作成すると、BFILE属性はNULLに設定されます。
外部LOB (BFILE)属性を使用してオブジェクトを作成する場合、BFILEはNULLに設定されます。これは、BFILEから読み取られる前に有効なディレクトリ・オブジェクト名およびファイル名を使用して更新する必要があります。

LOBロケータ属性を使用してオブジェクト・キャッシュ内でオブジェクトを別のオブジェクトにコピーする場合、LOBロケータのみがコピーされます。つまり、これら2つの異なるオブジェクト内のLOB属性には、唯一かつ同一のLOB値を参照する厳密に同一のロケータが含まれます。ターゲット・オブジェクトがフラッシュされた場合のみ、異なるLOB値の物理コピーが作成されます。これは、ソースLOB値とは異なります。

関連項目:
ロケータの1つを使用して書込みが実行された場合、各オブジェクトでどのバージョンのLOB値が参照されるかについては、「LOBの更新および読取り一貫性」を参照してください。

したがって、コピーのターゲットであったLOBを変更する場合、ターゲット・オブジェクトをフラッシュし、ターゲット・オブジェクトをリフレッシュしてから、ロケータ属性を介してLOBに書き込む必要があります。

サイズがTBのLOBのサポート

サイズがTBのLOB(データベース・ブロックのサイズに応じて最大サイズが8から128TBのLOB)は、次のAPIでサポートされます。

- JDBC(Java Database Connectivity)を使用したJava

- DBMS_LOBパッケージを使用したPL/SQL

- OCI(Oracle Call Interface)を使用したC

4GBを超えるサイズのLOBインスタンス(サイズがTBのLOB)は、次のプログラム環境では作成も使用もできません。

- Pro*COBOLプリコンパイラを使用したCOBOL

- Pro*C/C++プリコンパイラを使用したCまたはC++

- OO4O(Oracle Objects for OLE)を使用したVisual Basic

注意:
Oracle Databaseでは、どのプログラム環境であっても、2^64-1バイト(OCIではUB8MAXVAL)を超えるBFILEはサポートされません。BFILEには、オペレーティング・システムに基づくその他のファイル・サイズ制限も適用されます。

サイズがTBのLOBの最大記憶域の制限

サポートされている環境では、データベース構成の最大記憶域サイズの上限までLOBを作成して操作できます。

Oracle Databaseを使用すると、データベースのブロック・サイズとは異なるブロック・サイズの表領域を作成できます。LOBの最大サイズは、表領域ブロックのサイズによって決まります。CHUNKは、LOB記憶域のパラメータで、この値は、LOBが格納されている表領域のブロック・サイズによって制御されます。

注意:
CHUNKパラメータは、SecureFiles LOBには適用されません。これは、BasicFiles LOBに対してのみ使用されます。

LOB列を作成する場合、CHUNKの値を指定できます。これは、LOBの操作用に割り当てるバイト数です。この値は、表領域ブロック・サイズの倍数である必要があります。そうでない場合、Oracle Databaseによって次の倍数に切り上げられます。(表ブロック・サイズがデータベース・ブロック・サイズと同じ場合、CHUNKは、データベース・ブロック・サイズの倍数でもあります。)

使用構成で許可される記憶域の最大制限は、表領域ブロック・サイズによって決まり、(4GB - 1)にDBMS_LOB.GETCHUNKSIZEまたはOCILobGetChunkSize()から取得した値を乗算した値として計算されます。この値(BLOBのバイト数またはCLOBの文字数)は、内部記憶域のオーバーヘッドにより、実際にはCHUNKパラメータのサイズより小さくなります。表領域ブロック・サイズで許可される現在の範囲は2Kから32Kであるため、記憶域の制限範囲は8TBから128TBです。

たとえば、データベース・ブロック・サイズが32KBの場合に、8KBの非標準のブロック・サイズの表領域を作成するとします。また、LOB列のある表を作成し、CHUNKサイズを16KB(表領域ブロック・サイズ8KBの倍数)に指定するとします。その場合、この列のLOBの最大サイズは、(4GB-1)×16KBです。

関連項目:

- データベース・インストレーションにあわせた初期化パラメータ設定の詳細は、『Oracle Database管理者ガイド』を参照してください。

- 「CHUNK」

この記憶域制限は、サイズがTBのLOBをサポートしている環境では、すべてのLOB型に適用されます。ただし、CLOB型とNCLOB型のサイズは文字単位で、BLOB型のサイズはバイト単位であることに注意してください。

JDBCでのサイズがTBのLOBの使用

Oracle JDBCクラスに含まれるLOB APIを使用して、サイズがTBのLOBにアクセスできます。

関連項目:
「Java(JDBC)を使用したLOBの作業」

DBMS_LOBパッケージでのサイズがTBのLOBの使用

DBMS_LOB PL/SQLパッケージに含まれるどのAPIでも、サイズがTBのLOBにアクセスできます。LOBの読取りおよび書込みに使用される値を取得するには、DBMS_LOB.GETCHUNKSIZEを使用します。チャンクに格納されているバイト数は、実際には、内部記憶域のオーバーヘッドのため、CHUNKパラメータのサイズよりも小さくなります。DBMS_LOB.GET_STORAGE_LIMITファンクションは、データベース構成の記憶域制限を戻します。これは、LOBの最大許容記憶域の値です。BLOBのサイズはバイト単位で、CLOBおよびNCLOBのサイズは文字単位であることに注意してください。

関連項目:
データベース・インストレーションにあわせた初期化パラメータ設定の詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

OCIでのサイズがTBのLOBの使用

Oracle Call Interface APIには、すべてのサイズのLOBを操作するための関数セットが用意されています。OCILobGetChunkSize()は、BLOBの場合はバイト単位で、CLOBの場合は文字単位で値を戻します。可変幅キャラクタ・セットの場合、値は幅に応じたUnicode文字数となります。チャンクに格納されているバイト数は、実際には、内部記憶域のオーバーヘッドのため、CHUNKパラメータのサイズよりも小さくなります。OCILobGetStorageLimit()ファンクションは、現在のデータベース・インストレーションにおける内部LOBの最大許容サイズをバイト単位で戻します。LOB全体が読み取られるストリーム・モードが使用される場合は、チャンク・サイズを取得する必要はありません。

関連項目:
LOBをサポートするOCI関数の詳細は、『Oracle Call Interfaceプログラマーズ・ガイド』の「LOBおよびBFILEの操作」、サイズが4GBを超えるLOBの使用に関する項を参照してください。

サイズがGBのLOB作成時のガイドライン

サポートされている環境でサイズがGBのLOBを作成するには、次のガイドラインに従って、LOB記憶域用の表領域で使用可能な領域をすべて使用します。

- 単一のデータ・ファイル・サイズ制限:オペレーティング・システムごとに単一のデータ・ファイルのサイズに関する制限があります。たとえば、Solaris 2.5では、オペレーティング・システム・ファイルは2GB以下に制限されています。このため、Oracle Databaseが実行されているオペレーティング・システムのファイルの最大許容ファイル・サイズよりもLOBが大きくなった場合、表領域にデータファイルを追加する必要があります。

- PCT INCREASEパラメータをゼロに設定: LOB記憶域句のPCTINCREASEパラメータは、新規エクステント・サイズの増加率を指定します。LOBが表領域内にピース単位で格納されていくとき、そのプロセスで多数の新しいエクステントが作成されます。エクステント・サイズが毎回デフォルト値である50%ずつ増加し続けると、エクステントが管理不可能になり、最終的に表領域内の領域が無駄になります。そのため、PCTINCREASEパラメータを0(ゼロ)または小さい値に設定する必要があります。

- MAXEXTENTSを適切な値またはUNLIMITEDに設定:MAXEXTENTSパラメータは、LOB列で許可されるエクステント数を制限します。LOBのサイズが大きくなると、多数のエクステントが段階的に作成されます。そのため、このパラメータは、その列のすべてのLOBを保持できる十分大きい値に設定する必要があります。または、UNLIMITEDに設定できます。

- 大きなエクステント・サイズの使用:新しいエクステントが作成されるたびに、そのエクステントに対してヘッダーとその他のメタデータのUNDO情報が生成されます。エクステントの数が多い場合、ロールバック・セグメントが容量オーバーになることがあります。これを避けるには、大きなエクステント・サイズ(100MBなど)を選択してエクステント作成の頻度を削減するか、またはより頻繁にトランザクションをコミットして、ロールバック・セグメントの領域を再利用します。

サイズがGBのLOBを格納する表領域および表の作成

次の例に、サイズがGBのLOBを格納する表領域と表の作成方法を示します。

CREATE TABLESPACE lobtbs1 DATAFILE '/your/own/data/directory/lobtbs_1.dat'
SIZE 2000M REUSE ONLINE NOLOGGING DEFAULT STORAGE (MAXEXTENTS UNLIMITED);
ALTER TABLESPACE lobtbs1 ADD DATAFILE
'/your/own/data/directory/lobtbs_2.dat' SIZE 2000M REUSE;

CREATE TABLE print_media_backup
(product_id NUMBER(6),
ad_id NUMBER(6),
ad_composite BLOB,
ad_sourcetext CLOB,
ad_finaltext CLOB,
ad_fltextn NCLOB,
ad_textdocs_ntab textdoc_tab,
ad_photo BLOB,
ad_graphic BLOB,
ad_header adheader_typ)
NESTED TABLE ad_textdocs_ntab STORE AS textdocs_nestedtab5
LOB(ad_sourcetext) STORE AS (TABLESPACE lobtbs1 CHUNK 32768 PCTVERSION 0
NOCACHE NOLOGGING
STORAGE(INITIAL 100M NEXT 100M MAXEXTENTS
UNLIMITED PCTINCREASE 0));

この例では、次のことに注意してください。

- この例では、CREATE TABLESPACE文にSTORAGE句が指定されています。

- STORAGE句は、CREATE TABLE文に指定することも可能です。

- CREATE TEMPORARY TABLESPACEにはSTORAGE句を指定できません。

- サイズがGBのLOBの場合は、PCTINCREASEパラメータを0(ゼロ)に設定することをお薦めします。サイズが小さいか中程度のLOBの場合は、エクステント割当て数を減らすために、PCTINCREASEのデフォルト値である50に設定することをお薦めします。

13 LOB APIの概要

この章の内容は次のとおりです。

- LOBをサポートするプログラム環境

- LOBインタフェースの比較

- PL/SQL(DBMS_LOBパッケージ)を使用したLOBの作業

- OCIを使用したLOBの作業

- C++(OCCI)を使用したLOBの作業

- C/C++(Pro*C)を使用したLOBの作業

- COBOL(Pro*COBOL)を使用したLOBの作業

- COM(Oracle Objects for OLE)を使用したLOBの作業

- Java(JDBC)を使用したLOBの作業

- Oracle Provider for OLE DB(OraOLEDB)

- Oracle Data Provider for .NET(ODP.NET)の概要

LOBをサポートするプログラム環境

表13-1に、LOB機能をサポートするプログラム環境を示します。

関連項目:
サポートされているLOB操作用のAPIについては、次の章を参照してください。

- 第19章「永続LOBに固有の操作と一時LOBに固有の操作」

- 第22章「LOB APIの使用」

- 第21章「BFILE操作用のLOB API」

表13-1 LOBをサポートするプログラム環境

言語

プリコンパイラまたはインタフェース・プログラム

構文についての参照先

この章での参照先

PL/SQL

DBMS_LOBパッケージ

『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』

「PL/SQL(DBMS_LOBパッケージ)を使用したLOBの作業」

C

OCI

『Oracle Call Interfaceプログラマーズ・ガイド』

「OCIを使用したLOBの作業」

C++

OCCI

『Oracle C++ Call Interfaceプログラマーズ・ガイド』

「C++(OCCI)を使用したLOBの作業」

C/C++

Pro*C/C++プリコンパイラ

『Pro*C/C++プログラマーズ・ガイド』

「C/C++(Pro*C)を使用したLOBの作業」

COBOL

Pro*COBOLプリコンパイラ

『Pro*COBOLプログラマーズ・ガイド』

「COBOL(Pro*COBOL)を使用したLOBの作業」

COM

Oracle Objects For OLE (OO4O)

『Oracle Objects for OLE開発者ガイド』

「COM(Oracle Objects for OLE)を使用したLOBの作業」

Java

JDBC API

『Oracle Database JDBC開発者ガイドおよびリファレンス』

「Java(JDBC)を使用したLOBの作業」

ADO/OLE DB

Oracle Provider for OLE DB(OraOLEDB)

『Oracle Provider for OLE DB開発者ガイド』

「Oracle Provider for OLE DB(OraOLEDB)」

.NET

Oracle Data Provider for .NET(ODP.NET)

『Oracle Data Provider for .NET開発者ガイド』

「Oracle Data Provider for .NET(ODP.NET)の概要」

LOBインタフェースの比較

表13-2および表13-3では、8つのプログラム用LOBインタフェースについて、LOB操作に使用するそれぞれのファンクションおよびメソッドをリストし、比較しています。表が2つに分かれているのは、単に8つのインタフェースすべてを記載するためです。これらのインタフェースのLOBに関する機能については、この後の項で説明します。

表13-2 LOBインタフェースの比較(1/2)

PL/SQL: DBMS_LOB(dbmslob.sql)

C(OCI)(ociap.h)

C++ (OCCI) (occiData.h)。およびCLOBおよびBFILEクラス用。

Pro*C/C++およびPro*COBOL

DBMS_LOB.COMPARE

利用不可

利用不可

利用不可

DBMS_LOB.INSTR

利用不可

利用不可

利用不可

DBMS_LOB.SUBSTR

利用不可

利用不可

利用不可

DBMS_LOB.APPEND

OCILobAppend()

Blob.append()

APPEND

利用不可(PL/SQL割当て演算子を使用)

OCILobAssign()

ASSIGN

利用不可

OCILobCharSetForm()

Clob.getCharsetForm(CLOBのみ)

利用不可

利用不可

OCILobCharSetId()

Clob.getCharsetId()

(CLOBのみ)

利用不可

DBMS_LOB.CLOSE

OCILobClose()

Blob.close()

CLOSE

利用不可

利用不可

Clob.closeStream()

利用不可

DBMS_LOB.COPY

OCILobCopy2()

Blob.copy()

COPY

利用不可

OCILobDisableBuffering()

利用不可

DISABLE BUFFERING

利用不可

OCILobEnableBuffering()

利用不可

ENABLE BUFFERING

DBMS_LOB.ERASE

OCILobErase2()

利用不可

ERASE

DBMS_LOB.FILECLOSE

OCILobFileClose()

Clob.close()

CLOSE

DBMS_LOB.FILECLOSEALL

OCILobFileCloseAll()

利用不可

FILE CLOSE ALL

DBMS_LOB.FILEEXISTS

OCILobFileExist()

Bfile.fileExists()

DESCRIBE [FILEEXISTS ]

DBMS_LOB.GETCHUNKSIZE

OCILobGetChunkSize()

Blob.getChunkSize()

DESCRIBE [CHUNKSIZE ]

DBMS_LOB.GET_STORAGE_LIMIT

OCILobGetStorageLimit()

利用不可

利用不可

DBMS_LOB.GETOPTIONS

OCILobGetOptions()

Blob/Clob::getOptions

利用不可

DBMS_LOB.FILEGETNAME

OCILobFileGetName()

Bfile.getFileName()およびBfile.getDirAlias()

DESCRIBE [DIRECTORY, FILENAME ]

DBMS_LOB.FILEISOPEN

OCILobFileIsOpen()

Bfile.isOpen()

DESCRIBE [ISOPEN ]

DBMS_LOB.FILEOPEN

OCILobFileOpen()

Bfile.open()

OPEN

利用不可(BFILENAME演算子を使用)

OCILobFileSetName()

Bfile.setName()

FILE SET

利用不可

OCILobFlushBuffer()

利用不可

FLUSH BUFFER

DBMS_LOB.GETLENGTH

OCILobGetLength2()

Blob.length()

DESCRIBE [LENGTH ]

利用不可

OCILobIsEqual()

演算子= ( )=/!=

利用不可

DBMS_LOB.ISOPEN

OCILobIsOpen()

Blob.isOpen()

DESCRIBE [ISOPEN ]

DBMS_LOB.LOADFROMFILE

OCILobLoadFromFile2()

overloadedcopy()メソッドを使用

LOAD FROM FILE

利用不可

OCILobLocatorIsInit()

Clob.isinitialized()

利用不可

DBMS_LOB.OPEN

OCILobOpen()

Blob.open

OPEN

DBMS_LOB.READ

OCILobRead()

Blob.read

READ

DBMS_LOB.SETOPTIONS

OCILobSetOptions()

Blob/Clob::setOptions

利用不可

DBMS_LOB.TRIM

OCILobTrim2()

Blob.trim

TRIM

DBMS_LOB.WRITE

OCILobWrite2

Blob.write

WRITEORALOB.

DBMS_LOB.WRITEAPPEND

OCILobWriteAppend2()

利用不可

WRITE APPEND

DBMS_LOB.CREATETEMPORARY

OCILobCreateTemporary()

利用不可

利用不可

DBMS_LOB.FREETEMPORARY

OCILobFreeTemporary()

利用不可

利用不可

DBMS_LOB.ISTEMPORARY

OCILobIsTemporary()

利用不可

利用不可

利用不可

OCILobLocatorAssign()

演算子= ( )を使用、またはコンストラクタをコピー

利用不可

表13-3 LOBインタフェースの比較(2/2)

PL/SQL: DBMS_LOB(dbmslob.sql)

COM(OO4O)

Java(JDBC)

ODP.NET

DBMS_LOB.COMPARE

ORALOB.Compare

DBMS_LOBを使用

OracleClob.Compare

DBMS_LOB.INSTR

ORALOB.Matchpos

position

OracleClob.Search

DBMS_LOB.SUBSTR

利用不可

BLOBまたはBFILE固有のgetBytes

CLOB固有のgetSubString

利用不可

DBMS_LOB.APPEND

ORALOB.Append

lengthの後でputBytes()またはPutString()を使用

OracleClob.Append

OCILobAssign()

ORALOB.Clone

利用不可(等号を使用)

OracleClob.Clone

OCILobCharSetForm()

利用不可

利用不可

利用不可

OCILobCharSetId()

利用不可

利用不可

利用不可

DBMS_LOB.CLOSE

利用不可

DBMS_LOBを使用

OracleClob.Close

DBMS_LOB.COPY

ORALOB.Copy

readおよびwriteを使用

OracleClob.CopyTo

OCILobDisableBuffering()

ORALOB.DisableBuffering

利用不可

利用不可

OCILobEnableBuffering()

ORALOB.EnableBuffering

利用不可

利用不可

DBMS_LOB.ERASE

ORALOB.Erase

DBMS_LOBを使用

OracleClob.Erase

DBMS_LOB.FILECLOSE

ORABFILE.Close

closeFile

OraBFile.CloseFile

DBMS_LOB.FILECLOSEALL

ORABFILE.CloseAll

DBMS_LOBを使用

利用不可

DBMS_LOB.FILEEXISTS

ORABFILE.Exist

fileExists

OracleBFile.FileExists

DBMS_LOB.GETCHUNKSIZE

利用不可

getChunkSize

OracleClob.OptimumChunkSize

DBMS_LOB.FILEGETNAME

ORABFILE.DirectoryName

ORABFILE.FileName

getDirAlias

getName

OracleBFile.DirectoryName

Oracle.BFile.FileName

DBMS_LOB.FILEISOPEN

ORABFILE.IsOpen

DBMS_LOB.ISOPENを使用

OracleBFile.IsOpen

DBMS_LOB.FILEOPEN

ORABFILE.Open

openFile

OracleBFile.OpenFile

OCILobFileSetName()

DirectoryName

FileName

BFILENAMEを使用

OracleBFile.DirectoryName

Oracle.BFile.FileName

OCILobFlushBuffer()

ORALOB.FlushBuffer

利用不可

利用不可

DBMS_LOB.GETLENGTH

ORALOB.Size

長さ

OracleClob.Length

利用不可

利用不可

equals()

利用不可

DBMS_LOB.ISOPEN

ORALOB.IsOpen

DBMS_LOB. ISOPEN()を使用

OracleClob.IsInChunkWriteMode

DBMS_LOB.LOADFROMFILE

ORALOB.

CopyFromBfile

readの後でwriteを使用

利用不可

DBMS_LOB.OPEN

ORALOB.open

DBMS_LOB.OPEN()を使用

OracleClob.BeginChunkWrite

DBMS_LOB.READ

ORALOB.Read

BLOBまたはBFILE: getBytes()およびgetBinaryStream()

CLOB: getString()、getSubString()およびgetCharacterStream()

OracleClob.Read

DBMS_LOB.TRIM

ORALOB.Trim

DBMS_LOB.TRIM()を使用

OracleClob.SetLength

DBMS_LOB.WRITE

ORALOB.Write

BLOB: setBytes()およびsetBinaryStream()

CLOB: setString()およびsetCharacterStream()

OracleClob.Write

DBMS_LOB.WRITEAPPEND

利用不可

length()の後でputString()またはputBytes()を使用

OracleClob.Append

DBMS_LOB.CREATETEMPORARY

利用不可

利用不可

OracleClobコンストラクタ

DBMS_LOB.FREETEMPORARY

利用不可

利用不可

OracleClob.Dispose

DBMS_LOB.ISTEMPORARY

利用不可

利用不可

OracleClob.IsTemporary

PL/SQL(DBMS_LOBパッケージ)を使用したLOBの作業

PL/SQL DBMS_LOBパッケージは、次の操作のために使用できます。

- 内部永続LOBおよび一時LOB: 全体またはピース単位の読取りおよび変更操作

- BFILE: 読取り操作

関連項目:
パラメータ、パラメータ・タイプ、戻り値およびサンプル・コードの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

DBMS_LOBルーチン実行前のLOBロケータの提供

詳しく後述するように、DBMS_LOBルーチンはLOBロケータに基づいて機能します。DBMS_LOBルーチンを正常に実行するには、ルーチンをコールする前に、データベース表領域または外部ファイルシステムに存在しているLOBを示す入力ロケータを用意する必要があります。

- 永続LOB: SQLを使用してLOB列を含む表を定義します。その後、SQLを使用してこれらのLOB列のロケータを初期化または移入できます。

- 外部LOB: アクセス対象の外部LOBを含む有効物理ディレクトリにマップする、DIRECTORYオブジェクトを定義します。これらのファイルは存在し、Oracleサーバーで処理を行うための読取り権限を所有している必要があります。オペレーティング・システムがパス名の大/小文字を区別する場合には、正しい大/小文字でディレクトリを指定してください。詳細は、「ディレクトリ・オブジェクト」を参照してください。

一度LOBを定義して作成すると、SELECTを実行してLOBロケータをローカルのPL/SQL LOB変数に割り当てることができます。また、この変数を、LOB値にアクセスするためのDBMS_LOBへの入力パラメータとして使用できます。

次の項では、各DBMS_LOBルーチンで提供されている例を使用して、前述の操作について説明します。

DBMS_LOB操作のオフセット・パラメータおよび量パラメータのガイドライン

DBMS_LOB PL/SQLパッケージのプロシージャで使用されるオフセット・パラメータと量パラメータには、次のガイドラインが適用されます。

- 文字データ(すべての形式、固定幅および可変幅)の場合、amountパラメータとoffsetパラメータは文字単位です。これは、CLOBデータ型とNCLOBデータ型に対する操作に適用されます。

- バイナリ・データの場合、offsetパラメータとamountパラメータはバイト単位です。このガイドラインはBLOBデータ型に対する操作に適用されます。

- 次のプロシージャを使用する場合のガイドライン

- DBMS_LOB.LOADFROMFILE

- DBMS_LOB.LOADBLOBFROMFILE

- DBMS_LOB.LOADCLOBFROMFILE

量パラメータには、ロード元のBFILEのサイズを超える値を指定できません。これらのプロシージャを使用してBFILE全体をロードするには、BFILEの正確なサイズまたは最大許容記憶域の上限を指定する必要があります。

関連項目:

- 「LOBへのBFILEデータのロード」

- 「BLOBへのBFILEデータのロード」

- 「CLOBまたはNCLOBへのBFILEデータのロード」

- DBMS_LOB.READを使用する場合、amountパラメータはデータより大きいサイズに指定できます。バッファ・サイズ以下の値を指定する必要があります。バッファ・サイズの上限は32KBです。

関連項目:
「LOBからのデータの読取り」

キャラクタ・セットIDの取得

キャラクタ・セットIDを取得するには、キャラクタ・セット名を知っている必要があります(データベース・キャラクタ・セットおよび各国語キャラクタ・セットの有効なキャラクタ・セット名がリストされているV$NLS_VALID_VALUESビューから選択できます)。次に、目的のキャラクタ・セット名を1つの文字列引数に指定したNLS_CHARSET_IDファンクションをコールします。キャラクタ・セットIDが整数で戻されます。UTF16には、キャラクタ・セット名がないので、正しく動作しません。UTF16には、キャラクタ・セットIDとして1000を使用します。UTF16は、データベース・キャラクタ・セットまたは各国語キャラクタ・セットとしては許可されていませんが、DBMS_LOBのAPIではデータベース変換用にサポートされています。DBMS_LOB.LOADCLOBFROMFILEおよびDBMS_LOBの他のプロシージャは、キャラクタ・セット名ではなくキャラクタ・セットIDを入力として受け取ります。

関連項目:

- 詳細およびサポートされているUnicodeエンコーディングは、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』のDBMS_LOB.LOADCLOBFROMFILEに関する項を参照してください。

- サポートされている言語は、『Oracle Databaseグローバリゼーション・サポート・ガイド』の「付録A」を参照してください。

LOB用のPL/SQLファンクションおよびプロシージャ

BLOB、CLOB、NCLOBおよびBFILEを操作するPL/SQLファンクションおよびプロシージャは、次のとおりです。

- 永続LOBの値を変更するには、表13-4を参照してください。

- LOB値の読取りまたはテストは、表13-5を参照してください。

- 一時LOBの作成、解放または確認は、表13-6を参照してください。

- 外部LOB(BFILE)での読取り専用ファンクションは、表13-7を参照してください。

- LOBのオープン、クローズ、またはLOBがオープンしているかどうかの確認は、表13-8を参照してください。

- SecureFilesでアーカイブ管理を実行する方法は、「SecureFiles LOBおよびDBFS用のPL/SQLパッケージ」を参照してください。

LOB値を変更するPL/SQLファンクションおよびプロシージャ

次の表に、DBMS_LOBプロシージャを示します。

表13-4 PL/SQL: LOB値を変更するDBMS_LOBプロシージャ

関数/プロシージャ

説明

APPEND

LOB値を別のLOBに追加します。

CONVERTTOBLOB

CLOBをBLOBに変換します。

CONVERTTOCLOB

BLOBをCLOBに変換します。

COPY

LOBの全体または一部を他のLOBにコピーします。

ERASE

指定のオフセットから開始して、LOBの一部を消去します。

FRAGMENT_DELETE

LOBの指定されたオフセットから指定された長さのデータを削除します。

FRAGMENT_INSERT

LOBの指定されたオフセットに、指定されたデータ(32KB未満)を挿入します。

FRAGMENT_MOVE

指定されたオフセットから他の指定されたオフセットに、指定されたバイト数を移動します。

FRAGMENT_REPLACE

指定されたオフセットのデータを、指定されたデータ(32KB未満)と置換します。

LOADFROMFILE

BFILEデータを永続LOBにロードします。

LOADCLOBFROMFILE

キャラクタ・セットをファイルからLOBにロードします。

LOADBLOBFROMFILE

バイナリ・データをファイルからLOBにロードします。

SETOPTIONS

LOB機能(重複除外および圧縮)を設定します。

TRIM

指定された長さまでLOB値を切り捨てます。

WRITE

指定されたオフセットからLOBにデータを書き込みます。

WRITEAPPEND

データをLOBの終わりに書き込みます。

LOBのイントロスペクションに使用するPL/SQLファンクションおよびプロシージャ

表13-5 PL/SQL: 内部LOBおよび外部LOBの値の読取りまたはテストを行うDBMS_LOBプロシージャ

関数/プロシージャ

説明

COMPARE

2つのLOBの値を比較します。

GETCHUNKSIZE

読取りおよび書込み用にチャンク・サイズを取得します。これは永続LOBにのみ適用され、外部LOB(BFILE)には適用されません。

GETLENGTH

LOB値の長さを取得します。

GETOPTIONS

SecureFilesのオプション(重複除外、圧縮、暗号化)を戻します。

GET_STORAGE_LIMIT

データベース構成のLOB記憶域制限を取得します。

INSTR

LOBにおけるパターンのn番目の出現位置を戻します。

ISSECUREFILE

このファンクションは、渡されるBLOBまたはCLOBロケータがSecureFiles用の場合はTRUE、そうでない場合はFALSEを戻します。

READ

指定されたオフセットからLOBのデータを読み取ります。

SETOPTIONS

デフォルトのLOB列の設定を上書きする、SecureFilesのオプション(重複除外および圧縮)を設定します。サーバーへのラウンドトリップが発生します。

SUBSTR

指定されたオフセットからLOB値の一部を戻します。

一時LOBに対するPL/SQL操作

表13-6 PL/SQL: 一時LOBを操作するDBMS_LOBプロシージャ

関数/プロシージャ

説明

CREATETEMPORARY

一時LOBを作成します。

ISTEMPORARY

LOBロケータが一時LOBを参照するかどうかを確認します。

FREETEMPORARY

一時LOBを解放します。

PL/SQL: BFILE固有の読取り専用ファンクションおよびプロシージャ

表13-7 PL/SQL: BFILE固有のDBMS_LOB読取り専用プロシージャ

関数/プロシージャ

説明

FILECLOSE

ファイルをクローズします。CLOSE()でも可能です。

FILECLOSEALL

オープンしていたすべてのファイルをクローズします。

FILEEXISTS

ファイルがサーバー上に存在するかどうかを確認します。

FILEGETNAME

ディレクトリ・オブジェクト名とファイル名を取得します。

FILEISOPEN

入力BFILEロケータを使用して、ファイルがオープンされたかどうかを確認します。ISOPEN()でも可能です。

FILEOPEN

ファイルをオープンします。OPEN()でも可能です。

PL/SQL: 内部LOBおよび外部LOBをオープンおよびクローズするファンクションおよびプロシージャ

表13-8 PL/SQL: 内部LOBおよび外部LOBをオープンおよびクローズするDBMS_LOBプロシージャ

関数/プロシージャ

説明

OPEN

LOBをオープンします。

ISOPEN

LOBがオープンしているかどうかを確認します。

CLOSE

LOBをクローズします。

「OPENおよびCLOSEインタフェースを使用した永続LOBのオープン」では、特定のLOB操作(LOBを含む行の挿入など)について、これらのプロシージャをさらに詳しく説明します。

OCIを使用したLOBの作業

Oracle Call Interface(OCI)のLOB関数を使用すると、CでLOBにアクセスして変更し、BFILEからデータを読み取ることができます。

関連項目:
この項で説明するすべての内容の詳細は、『Oracle Call Interfaceプログラマーズ・ガイド』の「LOBおよびBFILEの操作」の章を参照してください。

LOBデータ、長さおよびチャンク・サイズのプリフェッチ

小さいLOBのOCIアクセスを向上するため、ロケータもフェッチしながら、LOBデータをプリフェッチおよびキャッシュできます。これは、内部LOB、一時LOBおよびBFILEに適用されます。

OCI LOB APIのCSIDパラメータの設定

データを2バイトのUnicode(UCS2)フォーマットで読取りまたは書込みする場合は、OCILobRead2()およびOCILobWrite2()のcsid(キャラクタ・セットID)パラメータをOCI_UTF16IDに設定します。CSIDパラメータは、バッファ・パラメータ用のCSIDを示します。csidパラメータは、すべてのCSIDに設定できます。csidパラメータが設定されていると、環境変数NLS_LANGより優先されます。

関連項目:

- OCIUnicodeToCharSet()関数の説明およびOCI構文全般の詳細は、『Oracle Call Interfaceプログラマーズ・ガイド』を参照してください。

- 異なる言語におけるアプリケーションの実装の詳細は、『Oracle Databaseグローバリゼーション・サポート・ガイド』を参照してください。

OCIにおける固定幅キャラクタ・セットと可変幅キャラクタ・セットの規則

OCIの場合、固定幅のクライアント側キャラクタ・セットには、次の規則が適用されます。

- CLOBおよびNCLOB: オフセット・パラメータおよび量パラメータは、常に文字で表されます。

- BLOBおよびBFILE: オフセット・パラメータおよび量パラメータは、常にバイトで表されます。

可変幅のクライアント側キャラクタ・セットに対しては、次の規則が適用されます。

- オフセット・パラメータ: クライアント側キャラクタ・セットが可変幅かどうかにかかわらず、オフセット・パラメータは常に次のように表されます。

- CLOBおよびNCLOB: 文字で表されます。

- BLOBおよびBFILE: バイトで表されます。

- 量パラメータ: 量パラメータは、常に次のように表されます。

- サーバー側LOBを参照する場合: 文字で表されます。

- クライアント側バッファを参照する場合: バイトで表されます。

- OCILobFileGetLength(): クライアント側キャラクタ・セットが可変幅かどうかにかかわらず、出力の長さは次のように表されます。

- CLOBおよびNCLOB: 文字で表されます。

- BLOBおよびBFILE: バイトで表されます。

- OCILobRead2(): 可変幅のクライアント側キャラクタ・セット、CLOBおよびNCLOBでは次のようになります。

- 入力量は、文字で表されます。入力量は、サーバー側のCLOBまたはNCLOBから読み取られる文字数を表します。

- 出力量は、バイトで表されます。出力量は、バッファbufpに読み取られたバイト数を表します。

- OCILobWrite2(): 可変幅のクライアント側キャラクタ・セット、CLOBおよびNCLOBでは次のようになります。

- 入力量は、バイトで表されます。入力量は、入力バッファbufpにあるデータのバイト数を表します。

- 出力量は、文字で表されます。出力量は、サーバー側のCLOBまたはNCLOBに書き込まれた文字数を表します。

他の操作

その他すべてのLOB操作については、クライアント側キャラクタ・セットかどうかにかかわらず、量パラメータはCLOBおよびNCLOBについては文字で表されます。これには、OCILobCopy2()、OCILobErase2()、OCILobLoadFromFile2()およびOCILobTrim2()が含まれます。これらの操作はすべて、サーバー上のLOBデータの量に関する操作です。

関連項目:
『Oracle Databaseグローバリゼーション・サポート・ガイド』

OCIにおけるNCLOBの使用

NCLOBは、メソッドのパラメータとして使用できます。

OCILobLoadFromFile2()の量パラメータ

OCILobLoadFromFile2()を使用する場合、量パラメータに、BFILEの長さより長い値を指定することはできません。BFILE全体をロードするには、OCILobGetStorageLimit()の戻り値を渡します。

OCILobRead2()の量パラメータ

OCILobRead2()を使用してLOBの終わりまで読み取るには、OCILobGetStorageLimit()の戻り値と等しい量を指定します。詳細は、「LOBからのデータの読取り」を参照してください。

OCILobLocatorポインタの割当て

OCIプログラムでOCILobLocatorポインタを割り当てる場合は、特殊事例として=代入演算子を使用する必要があります。ポインタの割当てによりLOBのシャロー・コピーが作成されます。ポインタの割当て後は、ソースLOBとターゲットLOBが同じデータ・コピーを指します。

これらのセマンティクスは、割当ての実行にOCILobAssign()やOCILobLocatorAssign()などのLOB APIを使用する場合とは異なります。これらのAPIを使用すると、割当て後のロケータは独立したデータ・コピーを論理的に指します。

一時LOBの場合は、ポインタ割当てを実行する前にOCIFreeTemporary()をコールして、ターゲットLOBロケータ内の一時LOBが解放されていることを確認する必要があります。これに対して、OCILobLocatorAssign()を使用すると、割当てが発生する前に、ターゲットLOBロケータ変数内の元の一時LOB(存在する場合)が自動的に解放されます。

OCIにおける定義変数とアウトバインド変数内のLOBロケータ

SQL文の定義変数またはアウトバインド変数内でLOBロケータを再利用する前に、OCIFreeTemporary()を使用して既存のLOBロケータ・バッファ内の一時LOBを解放する必要があります。

OCI: BLOB、CLOB、NCLOBおよびBFILEを操作する関数

BLOB、CLOB、NCLOBおよびBFILEを操作するOCI関数は、次のとおりです。

- 永続LOBを変更するには、表13-9を参照してください。

- LOB値の読取りまたはテストは、表13-10を参照してください。

- 一時LOBの作成または解放、または一時LOBが存在するかどうかの確認は、表13-11を参照してください。

- 外部LOB(BFILE)での読取り専用ファンクションは、表13-12を参照してください。

- LOBロケータでの操作は、表13-13を参照してください。

- LOBのバッファリングは、表13-14を参照してください。

- LOBのオープンおよびクローズは、表13-15を参照してください。

OCI: 永続LOB(BLOB、CLOBおよびNCLOB)の値を変更する関数

表13-9 OCI: 永続LOB(BLOB、CLOBおよびNCLOB)の値を変更する関数

関数/プロシージャ

説明

OCILobAppend()

LOB値を別のLOBに追加します。

OCILobArrayWrite()

1回のラウンドトリップで複数のロケータを使用してデータを書き込みます。

OCILobCopy2()

LOBの全体または一部を他のLOBにコピーします。

OCILobErase2()

指定のオフセットから開始して、LOBの一部を消去します。

OCILobLoadFromFile2()

BFILEデータを永続LOBにロードします。

OCILobSetContentType()

SecureFilesにコンテンツ文字列を設定します。

OCILObSetOptions()

SecureFilesのオプション設定(重複除外および圧縮)を使用可能にします。

OCILobTrim2()

LOBを切り捨てます。

OCILobWrite2()

バッファのデータをLOBに書き込み、既存データを上書きします。

OCILobWriteAppend2()

バッファのデータをLOBの終わりに書き込みます。

OCI: 永続LOBおよび外部LOB(BFILE)の値の読取りまたはテストを行う関数

表13-10 OCI: 永続LOBおよび外部LOB(BFILE)の値の読取りまたはテストを行う関数

関数/プロシージャ

説明

OCILobArrayRead()

1回のラウンドトリップで複数のロケータを使用してデータを読み取ります。

OCILobGetChunkSize()

読取りおよび書込み用にチャンク・サイズを取得します。これは永続LOBに適用され、外部LOB(BFILE)には適用されません。

OCILobGetContentType()

SecureFilesのコンテンツ文字列を取得します。

OCILobGetLength2()

LOBまたはBFILEの長さを戻します。

OCILObGetOptions()

指定されたSecureFilesの使用可能な設定(重複除外、圧縮および暗号化)を取得します。

OCILobGetStorageLimit()

内部LOBの最大長を取得します。

OCILobRead2()

NULL以外のLOBまたはBFILEの指定部分をバッファに読み取ります。

OCI: 一時LOBを操作する関数

表13-11 OCI: 一時LOBを操作する関数

関数/プロシージャ

説明

OCILobCreateTemporary()

一時LOBを作成します。

OCILobIsTemporary()

一時LOBが存在するかどうかを確認します。

OCILobFreeTemporary()

一時LOBを解放します。

OCI: BFILE固有の読取り専用関数

表13-12 OCI: BFILE固有の読取り専用関数

関数/プロシージャ

説明

OCILobFileClose()

オープンしているBFILEをクローズします。

OCILobFileCloseAll()

オープンしているすべてのBFILEをクローズします。

OCILobFileExists()

BFILEが存在するかどうかを確認します。

OCILobFileGetName()

BFILEの名前を戻します。

OCILobFileIsOpen()

BFILEがオープンしているかどうかを確認します。

OCILobFileOpen()

BFILEをオープンします。

OCI: LOBロケータ関数

表13-13 OCI: LOBロケータ関数

関数/プロシージャ

説明

OCILobAssign()

LOBロケータを別のLOBロケータに割り当てます。

OCILobCharSetForm()

LOBのキャラクタ・セット・フォームを戻します。

OCILobCharSetId()

LOBのキャラクタ・セットIDを戻します。

OCILobFileSetName()

BFILEの名前をロケータに設定します。

OCILobIsEqual()

2つのLOBロケータが同じLOBを参照しているかどうかを確認します。

OCILobLocatorIsInit()

LOBロケータが初期化されているかどうかを確認します。

OCI: LOBバッファリング関数

表13-14 OCI: LOBバッファリング関数

関数/プロシージャ

説明

OCILobDisableBuffering()

バッファリング・サブシステムを使用禁止にします。

OCILobEnableBuffering()

後続のLOBデータの読取り/書込みに、LOBバッファリング・サブシステムを使用します。

OCILobFlushBuffer()

LOBバッファリング・サブシステムへの変更を、データベース(サーバー)へフラッシュします。

OCI: 内部LOBおよび外部LOBをオープンおよびクローズする関数

表13-15 OCI: 内部LOBおよび外部LOBをオープンおよびクローズする関数

関数/プロシージャ

説明

OCILobOpen()

LOBをオープンします。

OCILobIsOpen()

LOBがオープンしているかどうかを確認します。

OCILobClose()

LOBをクローズします。

OCI LOBの例

OCIの例は、次の章にも記載されています。

- 第22章「LOB APIの使用」

- 第21章「BFILE操作用のLOB API」

これ以外のOCIのデモ・スクリプトについては、『Oracle Call Interfaceプログラマーズ・ガイド』の付録B「OCIデモ・プログラム」を参照してください。

OCIの詳細

OCIの詳細および機能は、OTN Webサイト(http://www.oracle.com/technology/)のOCIの機能およびFAQを参照してください。

C++(OCCI)を使用したLOBの作業

Oracle C++ Call Interface (OCCI)は、Oracle Databaseでデータを操作するためのC++ APIです。OCCIは、使いやすいC++クラス・セットとして構成されています。これにより、C++プログラムでは、データベースへの接続、SQL文の実行、データベース表への値の挿入とデータベース表の値の更新、問合せ結果の取得、データベースでのストアド・プロシージャの実行、データベース・スキーマ・オブジェクトのメタデータへのアクセスが可能になります。また、OCCIには、ユーザー定義型のオブジェクトをC++クラス・インスタンスとして操作するためのシームレスなインタフェースも用意されています。

OCCIは、OCIとともに使用することによって、アプリケーションを構築できます。

OCCI APIには、JDBCおよびODBCと比べて次のメリットがあります。

- OCCIにはJDBCより多くのOracle機能があります。OCCIは、JDBCにないすべてのOCI機能を提供します。

- OCCIは、コンパイル型のパフォーマンスを実現します。コンパイル型のプログラムでは、ソース・コードは、可能なかぎり初めからコンピュータ言語に近いコードで記述されています。JDBCはインタプリタ型APIであるため、コンパイル型APIほどのパフォーマンスは実現できません。インタプリタ型のプログラムでは、コードの各行を1行ずつコンピュータ言語に近いコードに解析する必要があるため、パフォーマンスが低下します。

- OCCIでは、スマート・ポインタを使用してメモリーを管理できます。OCCIオブジェクトのメモリー管理に注意する必要がありません。そのため、アプリケーション・コードのパフォーマンスが大幅に向上します。

- OCCIのナビゲーショナル・アクセスによって、直観的にオブジェクトにアクセスし、メソッドをコールできます。オブジェクトへの変更を持続するために、対応するSQL文を記述する必要はありません。クライアント側のキャッシュを使用する場合、オブジェクト・インタフェースよりナビゲーショナル・アクセス用インタフェースの方がパフォーマンスが高くなります。

- ODBCに関しては、OCCI APIの方が簡単に使用できます。ODBCはC言語で構築されていますが、OCCIには、CにはないC++のすべてのメリットがあります。さらに、ODBCの習得は簡単ではないとされています。それに対してOCCIは、使いやすさを基に設計されています。

OCCIを使用すると、次のように、永続LOBの全体、初め、中または終わりの部分を変更できます。

- 内部LOBおよび外部LOB(BFILE)からの読取り

- 永続LOBへの書込み

OCCIでLOBに使用するクラス

OCCIには、C++アプリケーションで各種のLOBインスタンスをオブジェクトとして使用できるように、次のクラスが用意されています。

- Clobクラス: 内部CLOBおよび内部NCLOBに格納されているデータにアクセスし、データを変更します。

- Blobクラス: 内部BLOBに格納されているデータにアクセスし、データを変更します。

- Bfileクラス: 外部LOB(BFILE)に格納されているデータにアクセスし、データを読み取ります。

関連項目:
各クラスの構文情報とOCCIの詳細は、『Oracle C++ Call Interfaceプログラマーズ・ガイド』を参照してください。

Clobクラス

Clobドライバは、SQL LOBロケータを使用してCLOBオブジェクトを実装します。これは、CLOBオブジェクトに、データ自体ではなくSQL CLOBデータへの論理ポインタが含まれていることを意味します。

CLOBインタフェースでは、SQL CLOB値の長さの取得、クライアント上のCLOB値のマテリアライズ化、および部分文字列の取得を実行するためのメソッドが提供されます。ResultSetインタフェースおよびStatementインタフェースのgetClob()やsetClob()などのメソッドを使用すると、SQL CLOB値にアクセスできます。

関連項目:
Clobクラスの詳細は、『Oracle C++ Call Interfaceプログラマーズ・ガイド』を参照してください。

Blobクラス

ResultSetインタフェースおよびStatementインタフェースのgetBlob()やsetBlob()などのメソッドを使用すると、SQL BLOB値にアクセスできます。Blobインタフェースでは、SQL BLOB値の長さの取得、クライアント上のBLOB値のマテリアライズ化、およびBLOBの一部の抽出を実行するためのメソッドが提供されます。

関連項目:

- Blobクラスのメソッドの詳細およびC++アプリケーションでのBlobオブジェクトのインスタンス化および初期化の詳細は、『Oracle C++ Call Interfaceプログラマーズ・ガイド』を参照してください。

- 異なる言語におけるアプリケーションの実装の詳細は、『Oracle Databaseグローバリゼーション・サポート・ガイド』を参照してください。

Bfileクラス

Bfileクラスを使用すると、C++アプリケーションでBfileオブジェクトをインスタンス化できます。この場合、Bfileクラスのメソッド(setName()メソッドなど)を使用して、データベースのBFILE列内のBFILE型のオブジェクトにオブジェクト・プロパティを関連付けるBfileオブジェクトを初期化する必要があります。

関連項目:
Blobクラスのメソッドの詳細およびC++アプリケーションでのBlobオブジェクトのインスタンス化および初期化の詳細は、『Oracle C++ Call Interfaceプログラマーズ・ガイド』を参照してください。

固定幅キャラクタ・セットの規則

OCCIの場合、固定幅のクライアント側キャラクタ・セットには、次の規則が適用されます。

- Clob: オフセット・パラメータおよび量パラメータは、常に文字で表されます。

- Blob: オフセット・パラメータおよび量パラメータは、常にバイトで表されます。

- Bfile: オフセット・パラメータおよび量パラメータは、常にバイトで表されます。

可変幅キャラクタ・セットの規則

可変幅のクライアント側キャラクタ・セットに対しては、次の規則が適用されます。

- オフセット・パラメータ: クライアント側キャラクタ・セットが可変幅かどうかにかかわらず、オフセット・パラメータは常に次のように表されます。

- Clob(): 文字で表されます。

- Blob(): バイトで表されます。

- Bfile(): バイトで表されます。

- 量パラメータ: 量パラメータは、常に次のように表されます。

- Clob: サーバー側LOBを参照する場合は文字で表されます。

- Blob: クライアント側バッファを参照する場合はバイトで表されます。

- Bfile: クライアント側バッファを参照する場合はバイトで表されます。

- length(): クライアント側キャラクタ・セットが可変幅かどうかにかかわらず、出力の長さは次のように表されます。

- Clob.length(): 文字で表されます。

- Blob.length(): バイトで表されます。

- Bfile.length(): バイトで表されます。

- Clob.read()およびBlob.read(): 可変幅のクライアント側キャラクタ・セット、CLOBおよびNCLOBでは次のようになります。

- 入力量は、文字で表されます。入力量は、サーバー側のCLOBまたはNCLOBから読み取られる文字数を表します。

- 出力量は、バイトで表されます。出力量は、OCCIバッファ・パラメータbufferに読み取られたバイト数を表します。

- Clob.write()およびBlob.write(): 可変幅のクライアント側キャラクタ・セット、CLOBおよびNCLOBでは次のようになります。

- 入力量は、バイトで表されます。入力量は、OCCI入力バッファbufferにあるデータのバイト数を表します。

- 出力量は、文字で表されます。出力量は、サーバー側のCLOBまたはNCLOBに書き込まれた文字数を表します。

他のOCCI操作のためのオフセット・パラメータおよび量パラメータ

その他すべてのOCCI LOB操作については、クライアント側キャラクタ・セットかどうかにかかわらず、量パラメータはCLOBおよびNCLOBについては文字で表されます。内容は次のとおりです。

- Clob.copy()

- Clob.erase()

- Clob.trim()

- LoadFromFile機能用にオーバーロードされたClob.copy()

これらの操作はすべて、サーバー上のLOBデータの量に関する操作です。

関連項目:
『Oracle Databaseグローバリゼーション・サポート・ガイド』

OCCIにおけるNCLOBの使用

- NCLOBインスタンスは、メソッドのパラメータとして使用できます。

- NCLOBインスタンスを、オブジェクト型の属性として使用できるようになりました。

OCCI LOB copy()メソッドの量パラメータ

ClobおよびBlobにcopy()メソッドを使用すると、BFILEからデータをロードできます。このメソッドの量パラメータには、次のいずれかの値を渡すことができます。

- データの一部をロードする場合は、BFILEのサイズよりも小さい量。

- データ全体をロードする場合は、BFILEのサイズと等しい量。

- BFILEデータをすべてロードする場合は、UB8MAXVAL定数。

BFILEのサイズより大きいサイズは指定できません。

OCCI read()操作の量パラメータ

Clob、BlobまたはBfileオブジェクトに対するread()メソッドは、BFILEからデータを読み取ります。量パラメータの次のいずれかの値を渡して、読み取るデータ量を指定できます。

- データの一部をロードする場合は、BFILEのサイズよりも小さい量。

- データ全体をロードする場合は、BFILEのサイズと等しい量。

- BFILEの終わりまでストリーム・モードで読み取る場合は、0 (ゼロ)。

BFILEのサイズより大きいサイズは指定できません。

OCCIの詳細

関連項目:

- 『Oracle C++ Call Interfaceプログラマーズ・ガイド』

- http://www.oracle.com/productsにアクセスして、OCCIについての項目および製品情報を検索してください。

OCCI: BLOB、CLOB、NCLOBおよびBFILEを操作するメソッド

BLOB、CLOB、NCLOBおよびBFILEを操作するOCCIメソッドは、次のとおりです。

- 永続LOBを変更するには、表13-16を参照してください。

- LOB値の読取りまたはテストは、表13-17を参照してください。

- 外部LOB(BFILE)での読取り専用メソッドは、表13-18を参照してください。

- 他のLOB OCCIメソッドは、表13-19を参照してください。

- LOBのオープンおよびクローズは、表13-20を参照してください。

OCCI: 永続LOB(BLOB、CLOBおよびNCLOB)の値を変更するメソッド

表13-16 OCCI: 永続LOB(BLOB、CLOBおよびNCLOB)の値を変更するClobメソッドおよびBlobメソッド

関数/プロシージャ

説明

Blob/Clob.append()

CLOBまたはBLOB値を別のLOBに追加します。

Blob/Clob.copy()

CLOBまたはBLOBの全体または一部を別のLOBにコピーします。

Blob/Clob.copy()

BFILEデータを永続LOBにロードします。

Blob/Clob.trim()

CLOBまたはBLOBを切り捨てます。

Blob/Clob.write()

バッファのデータをLOBに書き込み、既存データを上書きします。

OCCI: 永続LOBおよびBFILEの値の読取りまたはテストを行うメソッド

表13-17 OCCI: 永続LOBおよびBFILEの値の読取りまたはテストを行うBlob、ClobおよびBfileのメソッド

関数/プロシージャ

説明

Blob/Clob.getChunkSize()

読取りおよび書込み用にチャンク・サイズを取得します。これは永続LOBに適用され、外部LOB(BFILE)には適用されません。

Blob/Clob.getOptions()

既存および新規に作成されたLOBの設定を取得します。

Blob/Clob.length()

LOBまたはBFILEの長さを戻します。

Blob/Clob.read()

NULL以外のLOBまたはBFILEの指定部分をバッファに読み取ります。

Blob/Clob.setOptions()

既存および新規に作成されたLOB設定を使用可能にします。

OCCI: BFILE固有の読取り専用メソッド

表13-18 OCCI: BFILE固有の読取り専用メソッド

関数/プロシージャ

説明

Bfile.close()

オープンしているBFILEをクローズします。

Bfile.fileExists()

BFILEが存在するかどうかを確認します。

Bfile.getFileName()

BFILEの名前を戻します。

Bfile.getDirAlias()

ディレクトリ・オブジェクト名を取得します。

Bfile.isOpen()

BFILEがオープンしているかどうかを確認します。

Bfile.open()

BFILEをオープンします。

他のOCCI LOBメソッド

表13-19 他のOCCI LOBメソッド

メソッド

説明

Clob/Blob/Bfile.operator=()

LOBロケータを別のLOBロケータに割り当てます。=

Clob.getCharSetForm()

LOBのキャラクタ・セット・フォームを戻します。

Clob.getCharSetId()

LOBのキャラクタ・セットIDを戻します。

Bfile.setName()

BFILEの名前を設定します。

Clob/Blob/Bfile.operator==()

2つのLOBが同じLOBを参照しているかどうかを確認します。

Clob/Blob/Bfile.isInitialized()

LOBが初期化されているかどうかを確認します。

OCCI: 内部LOBおよび外部LOBをオープンおよびクローズするメソッド

表13-20 OCCI: 内部LOBおよび外部LOBをオープンおよびクローズするメソッド

関数/プロシージャ

説明

Clob/Blob/Bfile.Open()

LOBをオープンします。

Clob/Blob/Bfile.isOpen()

LOBがオープンしているかどうかを確認します。

Clob/Blob/Bfile.Close()

LOBをクローズします。

C/C++(Pro*C)を使用したLOBの作業

埋込みSQLを使用すると、永続LOBの全体、またはLOBの初め、中、終わりの部分を変更できます。読取りを目的として内部LOBと外部LOBの両方にアクセスしたり、永続LOBに対して書込みを行うことができます。

埋込みSQL文によって、BLOB、CLOB、NCLOBおよびBFILEに格納されたデータにアクセスできます。この種の文の詳細は後述します。

関連項目:
構文、ホスト変数、ホスト変数型およびサンプル・コードの詳細は、『Pro*C/C++プログラマーズ・ガイド』を参照してください。

LOBを表す入力ロケータ・ポインタの割当て

PL/SQLのロケータとは異なり、Pro*C/C++のロケータはロケータ・ポインタにマップされ、LOBまたはBFILE値を参照するために使用できます。

埋込みSQL LOB文を正常に実行するには、次の処理が必要です。

1. 文を実行する前に、データベース表領域または外部ファイルシステムに存在するLOBを表す入力ロケータ・ポインタを割り当てます。

2. LOBロケータをLOBロケータ・ポインタ変数にSELECTします。

3. 埋込みSQL LOB文の中でこの変数を使用し、LOB値にアクセスし操作します。

関連項目:
サポートされているLOB操作用のAPIについては、次の章を参照してください。

- 第19章「永続LOBに固有の操作と一時LOBに固有の操作」

- 第22章「LOB APIの使用」

- 第21章「BFILE操作用のLOB API」

Pro*C/C++: BLOB、CLOB、NCLOBおよびBFILEを操作する文

BLOB、CLOBおよびNCLOBを操作するPro*C/C++文は、次のとおりです。

- 永続LOBを変更するには、表13-21を参照してください。

- LOB値の読取りまたはテストは、表13-22を参照してください。

- 一時LOBの作成または解放、または一時LOBが存在するかどうかの確認は、表13-23を参照してください。

- BFILEにおけるクローズおよびファイルの有無は、表13-24を参照してください。

- LOBロケータでの操作は、表13-25を参照してください。

- LOBのバッファリングは、表13-26を参照してください。

- LOBまたはBFILEのオープンまたはクローズは、表13-27を参照してください。

Pro*C/C++: 永続LOBの値を変更する埋込みSQL文

表13-21 Pro*C/C++: 永続LOBの値を変更する埋込みSQL文

文

説明

APPEND

LOB値を別のLOBに追加します。

COPY

LOBの全体または一部を別のLOBにコピーします。

ERASE

指定のオフセットから開始して、LOBの一部を消去します。

LOAD FROM FILE

永続LOBの指定されたオフセットにBFILEデータをロードします。

TRIM

LOBを切り捨てます。

WRITE

LOBの指定されたオフセットにバッファのデータを書き込みます。

WRITE APPEND

バッファのデータをLOBの終わりに書き込みます。

Pro*C/C++: LOBのイントロスペクションに使用する埋込みSQL文

表13-22 Pro*C/C++: LOBのイントロスペクションに使用する埋込みSQL文

文

説明

DESCRIBE [CHUNKSIZE ]

書込み用のチャンク・サイズを取得します。これは、永続LOBに対してのみ機能します。外部LOB (BFILE)には適用されません。

DESCRIBE [LENGTH ]

LOBまたはBFILEの長さを戻します。

READ

NULL以外のLOBまたはBFILEの指定部分をバッファに読み取ります。

Pro*C/C++: 一時LOBを操作する埋込みSQL文

表13-23 Pro*C/C++: 一時LOBを操作する埋込みSQL文

文

説明

CREATE TEMPORARY

一時LOBを作成します。

DESCRIBE [ISTEMPORARY ]

LOBロケータが一時LOBを参照しているかどうかをチェックします。

FREE TEMPORARY

一時LOBを解放します。

Pro*C/C++: BFILE固有の埋込みSQL文

表13-24 Pro*C/C++: BFILE固有の埋込みSQL文

文

説明

FILE CLOSE ALL

オープンしているすべてのBFILEをクローズします。

DESCRIBE [FILEEXISTS ]

BFILEが存在するかどうかを確認します。

DESCRIBE [DIRECTORY,FILENAME ]

BFILEのディレクトリ・オブジェクト名とファイル名を戻します。

Pro*C/C++: LOBロケータ埋込みSQL文

表13-25 Pro*C/C++: LOBロケータ埋込みSQL文

文

説明

ASSIGN

LOBロケータを別のLOBロケータに割り当てます。

FILE SET

BFILEのディレクトリ・オブジェクト名とファイル名をロケータに設定します。

Pro*C/C++: LOBバッファリングのための埋込みSQL文

表13-26 Pro*C/C++: LOBバッファリングのための埋込みSQL文

文

説明

DISABLE BUFFERING

バッファリング・サブシステムを使用禁止にします。

ENABLE BUFFERING

後続のLOBデータの読取り/書込みに、LOBバッファリング・サブシステムを使用します。

FLUSH BUFFER

LOBバッファリング・サブシステムへの変更を、データベース(サーバー)へフラッシュします。

Pro*C/C++: LOBをオープンおよびクローズするための埋込みSQL文

表13-27 Pro*C/C++: 永続LOBおよび外部LOB(BFILE)をオープンおよびクローズするための埋込みSQL文

文

説明

OPEN

LOBまたはBFILEをオープンします。

DESCRIBE [ISOPEN ]

LOBまたはBFILEがオープンしているかどうかを確認します。

CLOSE

LOBまたはBFILEをクローズします。

COBOL(Pro*COBOL)を使用したLOBの作業

埋込みSQLを使用すると、永続LOBの全体、または永続LOBの初め、中、終わりの部分を変更できます。読取りを目的として内部LOBと外部LOBの両方にアクセスしたり、永続LOBに対して書込みを行うこともできます。

埋込みSQL文によって、BLOB、CLOB、NCLOBおよびBFILEに格納されたデータにアクセスできます。この種の文の詳細は後述します。

LOBを表す入力ロケータ・ポインタの割当て

PL/SQLのロケータとは異なり、Pro*COBOLのロケータはロケータ・ポインタにマップされ、LOBまたはBFILE値を参照するために使用されます。埋込みSQL LOB文を正常に実行するには、次の処理が必要です。

1. 文を実行する前に、データベース表領域または外部ファイルシステムに存在するLOBを表す入力ロケータ・ポインタを割り当てます。

2. LOBロケータをLOBロケータ・ポインタ変数にSELECTします。

3. 埋込みSQL LOB文でこの変数を使用し、LOB値にアクセスし操作します。

関連項目:
サポートされているLOB操作用のAPIについては、次の章を参照してください。

- 第19章「永続LOBに固有の操作と一時LOBに固有の操作」

- 第22章「LOB APIの使用」

- 第21章「BFILE操作用のLOB API」

Pro*COBOLインタフェースが必要な機能を提供していない場合は、Cを使用してOCIをコールできます。このようなプログラムはオペレーティング・システムによって異なるため、ここでは例を示しません。

関連項目:
構文、ホスト変数、ホスト変数型およびサンプル・コードの詳細は、『Pro*COBOLプログラマーズ・ガイド』を参照してください。

Pro*COBOL: BLOB、CLOB、NCLOBおよびBFILEを操作する文

BLOB、CLOB、NCLOBおよびBFILEを操作するPro*COBOL文は、次のとおりです。

- 永続LOBを変更するには、表13-28を参照してください。

- 内部LOBおよび外部LOBの値の読取りまたはテストは、表13-29を参照してください。

- 一時LOBの作成、解放、またはLOBロケータの確認は、表13-30を参照してください。

- BFILEにおけるクローズおよびファイルの有無は、表13-31を参照してください。

- LOBロケータでの操作は、表13-32を参照してください。

- LOBのバッファリングは、表13-33を参照してください。

- 永続LOBまたはBFILEのオープンまたはクローズは、表13-34を参照してください。

Pro*COBOL: 永続LOBの値を変更する埋込みSQL文

表13-28 Pro*COBOL: LOBの値を変更する埋込みSQL文

文

説明

APPEND

LOB値を別のLOBに追加します。

COPY

LOBの全体または一部を別のLOBにコピーします。

ERASE

指定のオフセットから開始して、LOBの一部を消去します。

LOAD FROM FILE

永続LOBの指定されたオフセットにBFILEデータをロードします。

TRIM

LOBを切り捨てます。

WRITE

LOBの指定されたオフセットにバッファのデータを書き込みます。

WRITE APPEND

バッファのデータをLOBの終わりに書き込みます。

Pro*COBOL: LOBのイントロスペクションに使用する埋込みSQL文

表13-29 Pro*COBOL: LOBのイントロスペクションに使用する埋込みSQL文

文

説明

DESCRIBE [CHUNKSIZE ]

書込み用のチャンク・サイズを取得します。

DESCRIBE [LENGTH ]

LOBまたはBFILEの長さを戻します。

READ

NULL以外のLOBまたはBFILEの指定部分をバッファに読み取ります。

Pro*COBOL: 一時LOBを操作する埋込みSQL文

表13-30 Pro*COBOL: 一時LOBを操作する埋込みSQL文

文

説明

CREATE TEMPORARY

一時LOBを作成します。

DESCRIBE [ISTEMPORARY ]

LOBロケータが一時LOBを参照しているかどうかをチェックします。

FREE TEMPORARY

一時LOBを解放します。

Pro*COBOL: BFILE固有の埋込みSQL文

表13-31 Pro*COBOL: BFILE固有の埋込みSQL文

文

説明

FILE CLOSE ALL

オープンしているすべてのBFILEをクローズします。

DESCRIBE [FILEEXISTS ]

BFILEが存在するかどうかを確認します。

DESCRIBE [DIRECTORY, FILENAME ]

BFILEのディレクトリ・オブジェクト名とファイル名を戻します。

Pro*COBOL: LOBロケータ埋込みSQL文

表13-32 Pro*COBOL: LOBロケータ埋込みSQL文

文

説明

ASSIGN

LOBロケータを別のLOBロケータに割り当てます。

FILE SET

BFILEのディレクトリ・オブジェクト名とファイル名をロケータに設定します。

Pro*COBOL: LOBバッファリングのための埋込みSQL文

表13-33 Pro*COBOL: LOBバッファリングのための埋込みSQL文

文

説明

DISABLE BUFFERING

バッファリング・サブシステムを使用禁止にします。

ENABLE BUFFERING

後続のLOBデータの読取り/書込みに、LOBバッファリング・サブシステムを使用します。

FLUSH BUFFER

LOBバッファリング・サブシステムへの変更を、データベース(サーバー)へフラッシュします。

Pro*COBOL: LOBおよびBFILEをオープンおよびクローズするための埋込みSQL文

表13-34 Pro*COBOL: 永続LOBおよびBFILEをオープンおよびクローズするための埋込みSQL文

文

説明

OPEN

LOBまたはBFILEをオープンします。

DESCRIBE [ISOPEN ]

LOBまたはBFILEがオープンしているかどうかを確認します。

CLOSE

LOBまたはBFILEをクローズします。

COM(Oracle Objects for OLE)を使用したLOBの作業

Oracle Objects for OLE (OO4O)は、プログラム可能なCOMオブジェクトのセットで、Oracle Databaseと通信するよう設計されたアプリケーションの開発を簡素化します。OO4Oは高いパフォーマンスのデータベース・アクセスを提供します。また、ADOなど他のODBCまたはOLE DBベースのコンポーネントからでは面倒で非効率となる、Oracle固有機能へのアクセスが容易になります。

次のオブジェクト・インタフェースの1つを使用すると、Oracle Objects for OLE (OO4O) APIを介して、永続LOBの全体、または永続LOBの初め、中、終わりの部分に対する変更ができます。

- OraBlob: データベース内のBLOBデータ型において操作を実行するためのメソッドを提供します。

- OraClob: データベース内のCLOBデータ型において操作を実行するためのメソッドを提供します。

- OraBFile: オペレーティング・システム・ファイル内に格納されているBFILEデータにおける操作を実行するためのメソッドを提供します。

注意:
OracleBlobおよびOracleClobは非推奨となっており、現在は機能していません

OO4O構文の参照

OO4Oの構文および詳細は、OO4Oオンライン・ヘルプを参照してください。Oracle Objects for OLE(OO4O)は、データベースに付属するWindowsベースの製品です。

関連項目:
『Oracle Objects for OLE開発者ガイド』

OraBlob、OraClobおよびOraBfileオブジェクト・インタフェースによるロケータのカプセル化

これらのインタフェースはLOBロケータをカプセル化するため、ユーザーは、ロケータではなく、提供されているメソッドおよびプロパティを使用して操作することで、状態情報を取得できます。

ダイナセットの一部として取り出されたOraBlobおよびOraClobオブジェクト

OraBlobオブジェクトおよびOraClobオブジェクトがダイナセットの一部として取り出された場合、これらのオブジェクトはダイナセット・カレント行のLOBロケータを表します。移動操作のためにダイナセット・カレント行が変更されると、OraBlobオブジェクトおよびOraClobオブジェクトは新しいカレント行のLOBロケータを表します。

ダイナセット移動からロケータの独立を維持するためのCloneメソッドの使用

ダイナセットに移動操作を行ってもOraBlobオブジェクトおよびOraClobオブジェクトのLOBロケータが影響を受けないようにするためには、Cloneメソッドを使用します。このメソッドは、OraBlobオブジェクトおよびOraClobオブジェクトを戻します。また、これらのオブジェクトをPL/SQLバインド・パラメータとして使用することもできます。

OraBlobおよびOraBfileの例

次の例に、OraBlobおよびOraBfileの使用方法を示します。

Dim OraDyn as OraDynaset, OraSound1 as OraBLOB, OraSoundClone as OraBlob, OraMyBfile as OraBFile

OraConnection.BeginTrans
set OraDyn = OraDb.CreateDynaset("select * from print_media order by product_id", ORADYN_DEFAULT)
set OraSound1 = OraDyn.Fields("Sound").value
set OraSoundClone = OraSound1

OraParameters.Add "id", 1,ORAPARAM_INPUT
OraParameters.Add "mybfile", Empty,ORAPARAM_OUTPUT
OraParameters("mybfile").ServerType = ORATYPE_BFILE

OraDatabase.ExecuteSQL ("begin  GetBFile(:id, :mybfile ") end")

Set OraMyBFile = OraParameters("mybfile").value
'Go to Next row
OraDyn.MoveNext

OraDyn.Edit
'Lets update OraSound1 data with that from the BFILE
OraSound1.CopyFromBFile  OraMyBFile
OraDyn.Update

OraDyn.MoveNext
'Go to Next row
OraDyn.Edit
'Lets update OraSound1 by appending with LOB data from 1st row represented by
'OraSoundClone
OraSound1.Append  OraSoundClone
OraDyn.Update

OraConnection.CommitTrans

この例では、次のことを表しています。

- OraSound1: ダイナセット内のカレント行のロケータを表します。

- OraSoundClone: 最初の行にあるロケータを表します。

カレント行における変更(OraDyn.MoveNextなど)は、次のことを意味します。

- OraSound1: 2番目の行のロケータを表します。

- OraSoundClone: 最初の行にあるロケータを表します。OraDyn行ナビゲーションにかかわらず、OraSoundCloneは最初の行のロケータのみを参照します。

- OraMyBFile: OraDatabase.ExecuteSQLを実行することによって、PL/SQLプロシージャを実行した結果として、PL/SQL OUTパラメータから取得されたロケータを参照します。

注意:
SQLの実行によって取得されたLOBは、トランザクションの存続期間のみ有効です。このため、BEGINTRANSおよびCOMMITTRANSを使用して、トランザクションの存続期間を指定します。

OO4O: LOBに格納されたデータにアクセスするメソッドおよびプロパティ

Oracle Objects for OLE (OO4O)には、BLOB、CLOB、NCLOBおよびBFILEに格納されたデータにアクセスするために使用するメソッドおよびプロパティが含まれます。

関連項目:
サポートされているLOB操作用のAPIについては、次の章を参照してください。

- 第19章「永続LOBに固有の操作と一時LOBに固有の操作」

- 第22章「LOB APIの使用」

- 第21章「BFILE操作用のLOB API」

関連項目:
パラメータ、パラメータ・タイプ、戻り値およびサンプル・コードの詳細は、OO4Oオンライン・ヘルプを参照してください。Oracle Objects for OLE(OO4O)は、データベースに付属するWindowsベースの製品で、ドキュメントはなく、オンライン・ヘルプのみです。OO4Oオンライン・ヘルプはデータベース・インストレーションのアプリケーション開発サブメニューから使用可能です。

BLOB、CLOB、NCLOBおよびBFILEを操作するOO4Oのメソッドとプロパティは、次のとおりです。

- 永続LOBを変更するには、表13-35を参照してください。

- 内部LOBおよび外部LOBの値の読取りまたはテストは、表13-36を参照してください。

- BFILEのオープンおよびクローズは、表13-37を参照してください。

- LOBのバッファリングは、表13-38を参照してください。

- LOBがNULLかどうかの確認、またはポーリング量の取得または設定を行うプロパティは、表13-39を参照してください。

- 読取り専用のBFILEメソッドは、表13-40を参照してください。

- BFILEのプロパティは、表13-41を参照してください。

OO4O: BLOB、CLOBおよびNCLOBの値を変更するメソッド

表13-35 OO4O: BLOB、CLOBおよびNCLOBの値を変更するメソッド

メソッド

説明

OraBlob.Append

OraClob.Append

BLOB値を別のLOBに追加します。

CLOBまたはNCLOB値を別のLOBに追加します。

OraBlob.Copy

OraClob.Copy

BLOBの一部を別のLOBにコピーします。

CLOBまたはNCLOBの一部を別のLOBにコピーします。

OraBlob.Erase

OraClob.Erase

指定のオフセットから開始して、BLOBの一部を消去します。

指定のオフセットから開始して、CLOBまたはNCLOBの一部を消去します。

OraBlob.CopyFromBFile

OraClob.CopyFromBFile

BFILEデータを内部BLOBにロードします。

BFILEデータを内部CLOBまたはNCLOBにロードします。

OraBlob.Trim

OraClob.Trim

BLOBを切り捨てます。

CLOBまたはNCLOBを切り捨てます。

OraBlob.CopyFromFile

OraClob.CopyFromFile

データをファイルからBLOBに書き込みます。

データをファイルからCLOBまたはNCLOBに書き込みます。

OraBlob.Write

OraClob.Write

データをBLOBに書き込みます。

データをCLOBまたはNCLOBに書き込みます。

OO4O: 内部LOBおよび外部LOBの値の読取りまたはテストを行うメソッド

表13-36 OO4O: 内部LOBおよび外部LOBの値の読取りまたはテストを行うメソッド

関数/プロシージャ

説明

OraBlob.Read

OraClob.Read

OraBFile.Read

NULLでないBLOBの指定部分をバッファに読み取ります。

NULLでないCLOBの指定部分をバッファに読み取ります。

NULLでないBFILEの指定部分をバッファに読み取ります。

OraBlob.CopyToFile

OraClob.CopyToFile

NULLでないBLOBの指定部分をファイルに読み取ります。

NULLでないCLOBの指定部分をファイルに読み取ります。

OO4O: 外部LOB(BFILE)をオープンおよびクローズするメソッド

表13-37 OO4O: 外部LOB(BFILE)をオープンおよびクローズするメソッド

メソッド

説明

OraBFile.Open

BFILEをオープンします。

OraBFile.Close

BFILEをクローズします。

OO4O: 永続LOBバッファリング・メソッド

表13-38 OO4O: 永続LOBバッファリング・メソッド

メソッド

説明

OraBlob.FlushBuffer

OraClob.FlushBuffer

BLOBバッファリング・サブシステムへの変更を、データベースへフラッシュします。

CLOBバッファリング・サブシステムへの変更を、データベースへフラッシュします。

OraBlob.EnableBuffering

OraClob.EnableBuffering

BLOB操作のバッファリングを使用可能にします。

CLOB操作のバッファリングを使用可能にします。

OraBlob.DisableBuffering

OraClob.DisableBuffering

BLOB操作のバッファリングを使用禁止にします。

CLOB操作のバッファリングを使用禁止にします。

OO4O: LOBプロパティ

表13-39 OO4O: LOBプロパティ

プロパティ

説明

IsNull (Read)

LOBがNULLであることを示します。

PollingAmount(Read/Write)

読取り/書込みポーリング操作の合計を取得/設定します。

Offset(Read/Write)

読取り/書込み操作のオフセットを取得/設定します。デフォルトでは1に設定されています。

Status(Read)

ポーリングのステータスを戻します。可能な値は次のとおりです。

- ORALOB_NEED_DATA: 読取りまたは書込みを行うデータが残っています。

- ORALOB_NO_DATA: 読取りまたは書込みを行うデータは残っていません。

- ORALOB_SUCCESS_LOB: データは正常に読取り/書込みされました。

Size(Read)

LOBデータの長さを戻します。

OO4O: 外部LOB(BFILE)固有の読取り専用メソッド

表13-40 OO4O: 外部LOB(BFILE)固有の読取り専用メソッド

メソッド

説明

OraBFile.Close

オープンしているBFILEをクローズします。

OraBFile.CloseAll

オープンしているすべてのBFILEをクローズします。

OraBFile.Open

BFILEをオープンします。

OraBFile.IsOpen

BFILEがオープンしているかどうかを判断します。

OO4O: 外部LOB(BFILE)での操作のためのプロパティ

表13-41 OO4O: 外部LOB(BFILE)での操作のためのプロパティ

プロパティ

説明

OraBFile.DirectoryName

サーバー側のディレクトリ・オブジェクト名を取得/設定します。

OraBFile.FileName(Read/Write)

サーバー側のファイル名を取得/設定します。

OraBFile.Exists

BFILEが存在するかどうかを確認します。

Java(JDBC)を使用したLOBの作業

Java(JDBC)を使用して、LOBに対して次の作業を行うことができます。

- Javaを使用した内部永続LOBの変更

- Javaを使用した内部永続LOBおよび外部LOB(BFILE)の読取り

- Java(JDBC)からのDBMS_LOBパッケージのコール

- Java(JDBC)を使用したLOBの参照

- 一時LOBの作成と操作、および表への永続LOBとしての保存。「JDBC: 一時LOB API」を参照してください。

Javaを使用した内部永続LOBの変更

次のクラスを介してJDBC APIを使用すると、Javaにおける永続LOBの全体、初め、中または終わりの部分に対する変更ができます。

- oracle.sql.BLOB

- oracle.sql.CLOB

これらのクラスは、LOB変更用のメソッドがあるJDBC 3.0仕様に応じてjava.sql.Blobおよびjava.sql.Clobインタフェースを実装します。これらには、LOB変更用のOracle固有のレガシー・メソッドも含まれます。これらのレガシー・メソッドは非推奨としてマークされています。

Oracle Databaseリリース11.1以降、JDKの最小サポート・バージョンはJDK5です。JDK5を使用するには、ojdbc5.jarをCLASSPATH内に配置します。JDK6を使用するには、ojdbc6.jarをCLASSPATH内に配置します。ojdbc5.jarはJDBC 3.0仕様をサポートし、ojdbc6.jarは、JDK6での新規仕様であるJDBC4.0仕様をサポートします。

表7-42で説明する、非推奨のOracle独自のAPIの使用を停止することをお薦めします。

表13-42 BLOBメソッドの対応関係

Oracle独自メソッド(非推奨)

JDBC 3.0標準メソッドによる置換

putBytes(long pos, byte [ ] bytes)

setBytes(long pos, byte[] bytes)

putBytes(long pos, byte [ ] bytes, int length)

setBytes(long pos, byte[] bytes, int offset, int len)

getBinaryOutputStream(long pos)

setBinaryStream(long pos)

trim (long len)

truncate(long len)

表13-43 CLOBメソッドの対応関係

Oracle独自メソッド(非推奨)

JDBC 3.0標準メソッドによる置換

putString(long pos, String str)

setString(long pos, String str)

利用不可

setString(long pos, String str, int offset, int len)

getAsciiOutputStream(long pos)

setAsciiStream(long pos)

getCharacterOutputStream(long pos)

setCharacterStream(long pos)

trim (long len)

truncate(long len)

Javaを使用した内部永続LOBおよび外部LOB(BFILE)の読取り

JDBCインタフェースでは、Javaを使用して内部永続LOBと外部LOB(BFILE)の両方を読み取ることができます。

BLOB、CLOBおよびBFILEクラス

- BLOB および CLOB クラス。JDBCでは、これらのクラスは、BLOBおよびCLOBのデータ型を含むデータベースでLOBを操作するメソッドを提供します。

- BFILE クラス。JDBCでは、このクラスは、データベース内のBFILEデータを操作するメソッドを提供します。

BLOB、CLOBおよびBFILEクラスはLOBロケータをカプセル化するため、ユーザーは、ロケータではなく、提供されているメソッドおよびプロパティを使用して操作することで、状態情報を取得します。

Java(JDBC)からのDBMS_LOBパッケージのコール

これらのクラスによって提供されていないすべてのLOB機能は、PL/SQL DBMS_LOBパッケージへコールすることによってアクセスできます。この方法は、このマニュアルの例で繰り返し使用されています。

パフォーマンス改善のためのLOBプリフェッチ

フェッチ中にLOBロケータと一緒にデータおよびメタデータ(長さおよびチャンク・サイズ)の一部をプリフェッチすると、サーバー・ラウンドトリップ数を削減できます。SELECT解析、実行およびフェッチは1回のラウンドトリップで発生します。大きいLOB(プリフェッチ・サイズの5倍より大きい)では、ほとんど改善しません。

プリフェッチ・サイズを構成するには、oracle.jdbc.OracleConnectionに定数として定義されている接続プロパティoracle.jdbc.defaultLobPrefetchSizeを使用します。値-1を使用するとプリフェッチが無効になり、0を使用するとメタデータのみのプリフェッチが有効になり、0より大きい任意の値を指定すると、フェッチ操作時にロケータとともにプリフェッチされるBLOBのバイト数およびCLOBの文字数を表します。

oracle.jdbc.OracleStatementで定義されるメソッドを使用すると、特定の文のプリフェッチ・サイズを変更できます。

void setLobPrefetchSize(int size) throws SQLException;

文レベルの設定は、接続レベルの設定を上書きします。この設定は、サイズがプリフェッチするバイト数(またはCLOBの文字)を表す拡張defineColumnTypeメソッドを使用して列レベルで上書きされます。指定可能な値は接続プロパティと同様です。タイプは、CLOB列にOracleTypes.CLOBおよびBLOB列にOracleTypes.BLOBを設定する必要があります。値が-1未満の場合、このメソッドではSQLExceptionが発生します。文を補うには、oracle.jdbc.OracleStatement内の次を使用できます。

int getLobPrefetchSize();

パフォーマンス改善のためのSecureFilesに対するゼロコピー入力/出力

ゼロコピー入力/出力プロトコルを使用すると、SecureFilesのパフォーマンスを改善できます。これは、新しいNet NSデータ転送プロトコルをサポートしているネットワーク・クライアントでのみ使用できます。

LOBがSecureFilesかどうかを判別するには、次のメソッドを使用します。

public boolean isSecureFile() throws SQLException

SecureFilesの場合、TRUEが戻ります。

このThin接続プロパティを使用すると、ゼロコピー入力/出力プロトコルを無効にできます(FALSEに設定)。

oracle.net.useZeroCopyIO

サーバー上のゼロコピー入力/出力

Oracle Net Servicesでは、ローカル・バッファとの間でデータ転送のやりとりをしなくても、Oracle Net Servicesユーザーにより提供されるデータ・バッファを使用できるようになりました。ネットワーク・バッファ(NS層)は省略され、内部LOBバッファが直接ネットワークに書き込まれます。バッファの読取りも、同様です。

この機能を使用できるのは、新規NSデータ・パケットをサポートするネットワーク・クライアントのみです(これはNSハンドシェイク中にネゴシエーションされます)。Thinドライバは新規NSプロトコルをサポートしているため、サーバーはゼロコピー・プロトコルを使用できます。また、JavaNetによってゼロコピーIOメカニズムが上位層に公開されるため、Thinドライバ・コードではデータ・コピーは必要なくなります。

JDBC Thinドライバでのサーバー上のゼロコピー入力/出力

BLOB.getBytes(long pos, int length, byte[] buffer)APIをコールすると、指定されたバッファをJavaNet層で使用してバイトがソケットから読み込まれます。データは1回のラウンドトリップで取得されます。同様に、書込み操作中にBLOB.setBytes(long pos, byte[] bytes)をコールすると、バッファは直接JavaNet層のネットワーク上に書き込まれます。したがって、データは1回のラウンドトリップで書き込まれます。ユーザー・バッファは、まとめて送信されます。

JDBC-OCIドライバの考慮事項

JDBC-OCIドライバは、サーバーおよびネットワーク層でゼロコピー入力/出力をサポートしています。

Java(JDBC)を使用したLOBの参照

次の2つの方法で、前述のすべてのLOBを参照できます。

- OracleResultSetの列として

- OraclePreparedStatementのOUT型PL/SQLパラメータとして

OracleResultSetの使用: 取り出されたBLOBオブジェクトとCLOBオブジェクト

OracleResultSetの一部としてBLOBオブジェクトとCLOBオブジェクトが取り出された場合、これらのオブジェクトは現在選択されている行のLOBロケータを表します。

移動操作(rset.next()など)によってカレント行が変更されても、取り出されたロケータは元のLOB行を参照したままです。

最新のカレント行のロケータを取り出すには、移動操作を行うたびに、インスタンスがBLOB、CLOBまたはBFILEのいずれであるかに応じて、OracleResultSet上でgetBLOB()、getCLOB()またはgetBFILE()をコールする必要があります。

JDBC構文の参照および詳細

LOBでのJDBCの使用に関するJDBC構文および詳細は、次のドキュメントを参照してください。

関連項目:

- パラメータ、パラメータ・タイプ、戻り値およびサンプル・コードの詳細は、『Oracle Database JDBC開発者ガイドおよびリファレンス』を参照してください。

- http://www.oracle.com/technology/

LOBでの操作のためのJDBCメソッド

BLOB、CLOBおよびBFILEを操作するJDBCメソッドは、次のとおりです。

- BLOB

- BLOBの値を変更するには、表13-44を参照してください。

- BLOB値の読取りまたはテストは、表13-45を参照してください。

- BLOBのバッファリングは、表13-46を参照してください。

- 一時BLOB: BLOBの作成、BLOBがオープンしているかどうかの確認および一時BLOBの解放について。表13-54を参照してください。

- BLOBのオープン、クローズ、およびBLOBがオープンしているかどうかの確認は、表13-54を参照してください。

- BLOBの切捨ては、表13-57を参照してください。

- BLOBストリーミングAPIは、表13-59を参照してください。

- CLOB

- CLOB値の読取りまたはテストは、表13-48を参照してください。

- CLOBのバッファリングは、表13-49を参照してください。

- CLOBを変更するには、表13-59を参照してください。

- 一時CLOB

- CLOBのオープン、クローズ、およびCLOBがオープンしているかどうかの確認は、表13-55を参照してください。

- CLOBの切捨ては、表13-58を参照してください。

- CLOBストリーミングAPIは、表13-60を参照してください。

- BFILE

- BFILEの読取りまたはテストは、表13-50を参照してください。

- BFILEのバッファリングは、表13-51を参照してください。

- BFILEのオープン、クローズ、およびBFILEがオープンしているかどうかの確認は、表13-56を参照してください。

- BFILEストリーミングAPIは、表13-61を参照してください。

JDBC: BLOB値を変更するoracle.sql.BLOBメソッド

表13-44 JDBC: BLOB値を変更するoracle.sql.BLOBメソッド

メソッド

説明

int setBytes(long, byte[])

指定されたオフセットから、バイト配列をBLOBに挿入します。

JDBC: BLOB値の読取りまたはテストを行うoracle.sql.BLOBメソッド

表13-45 JDBC: BLOB値の読取りまたはテストを行うoracle.sql.BLOBメソッド

メソッド

説明

byte[] getBytes(long, int)

指定されたオフセットから、バイトの配列としてLOBの内容を取得します。

long position(byte[],long)

LOB内の指定されたバイト配列を、指定されたオフセットで検索します。

long position(Blob,long)

指定されたBLOBをLOB内で検索します。

public boolean equals(java.lang.Object)

このLOBを別のLOBと比較します。LOBロケータを相互に比較します。

public long length()

LOBの長さを戻します。

public int getChunkSize()

LOBのチャンク・サイズを戻します。

JDBC: BLOBバッファリングのためのoracle.sql.BLOBメソッドおよびプロパティ

表13-46 JDBC: BLOBバッファリングのためのoracle.sql.BLOBメソッドおよびプロパティ

メソッド

説明

public java.io.InputStream getBinaryStream())

LOBをバイナリ・ストリームとして流すストリームを戻します。

public java.io.OutputStream setBinaryStream()

このBlobオブジェクトが表すBLOB値に書き込むために使用できるストリームを取り出します。

JDBC: CLOB値を変更するoracle.sql.CLOBメソッド

表13-47 JDBC: CLOB値を変更するoracle.sql.CLOBメソッド

メソッド

説明

int setString(long, java.lang.String)

JDBC 3.0: このClobオブジェクトが指定するCLOB値のposの位置に、指定されたJava文字列を書き込みます。

int putChars(long, char[])

指定されたオフセットから、文字配列をLOBに挿入します。

JDBC: CLOB値の読取りまたはテストを行うoracle.sql.CLOBメソッド

表13-48 JDBC: CLOB値の読取りまたはテストを行うoracle.sql.CLOBメソッド

メソッド

説明

java.lang.String getSubString(long, int)

LOBの部分文字列を文字列として戻します。

int getChars(long, int, char[])

LOBのサブセットを文字配列に読み取ります。

long position(java.lang.String, long)

指定された文字列をLOB内の指定されたオフセットから検索します。

long position(oracle.jdbc2.Clob, long)

指定されたCLOBをLOB内の指定されたオフセットから検索します。

long length()

LOBの長さを戻します。

int getChunkSize()

LOBのチャンク・サイズを戻します。

JDBC: CLOBバッファリングのためのoracle.sql.CLOBメソッドおよびプロパティ

表13-49 JDBC: CLOBバッファリングのためのoracle.sql.CLOBメソッドおよびプロパティ

メソッド

説明

java.io.InputStream getAsciiStream()

Clobインタフェースのメソッドを実装します。このClobオブジェクトで指定されたCLOB値をASCIIのバイト・ストリームとして取得します。

java.io.OutputStream setAsciiStream(long pos)

JDBC 3.0: このClobオブジェクトが表すCLOB値に、posの位置からASCII文字を書き込むために使用するストリームを取り出します。

java.io.Reader getCharacterStream()

CLOBを文字ストリームとして読み取ります。

java.io.Writer setCharacterStream(long pos)

JDBC 3.0: このClobオブジェクトが表すCLOB値に、posの位置からUnicode文字を書き込むために使用できるストリームを取り出します。

JDBC: 外部LOB(BFILE)値の読取りまたはテストを行うoracle.sql.BFILEメソッド

表13-50 JDBC: 外部LOB(BFILE)値の読取りまたはテストを行うoracle.sql.BFILEメソッド

メソッド

説明

byte[] getBytes(long, int)

指定されたオフセットから、バイトの配列としてBFILEの内容を取得します。

int getBytes(long, int, byte[])

BFILEのサブセットをバイト配列に読み取ります。

long position(oracle.sql.BFILE, long)

指定されたオフセットから、LOB内の指定されたBFILEの内容の1番目のものを検索します。

long position(byte[],long)

指定されたオフセットから、BFILE内の指定されたバイト配列の1番目のものを検索します。

long length()

BFILEの長さを戻します。

boolean fileExists()

このBFILEが参照しているオペレーティング・システム・ファイルが存在するかどうかを確認します。

public void openFile()

このBFILEが参照しているオペレーティング・システム・ファイルをオープンします。

public void closeFile()

このBFILEが参照しているオペレーティング・システム・ファイルをクローズします。

public boolean isFileOpen()

BFILEがオープンしているかどうかを確認します。

public java.lang.String getDirAlias()

このBFILEのディレクトリ・オブジェクト名を取得します。

public java.lang.String getName()

このBFILEが参照しているファイル名を取得します。

JDBC: BFILEバッファリングのためのoracle.sql.BFILEメソッドおよびプロパティ

表13-51 JDBC: BFILEバッファリングのためのoracle.sql.BFILEメソッドおよびプロパティ

メソッド

説明

public java.io.InputStream getBinaryStream()

BFILEをバイナリ・ストリームとして読み取ります。

JDBC: 一時LOB API

Oracle Database JDBCドライバには、一時LOBを作成およびクローズするためのAPIが含まれます。これらのAPIによって、以前のリリースで使用していたDBMS_LOB PL/SQLパッケージの次のプロシージャを使用する必要がなくなります。

- DBMS_LOB.createTemporary()

- DBMS_LOB.isTemporary()

- DBMS_LOB.freeTemporary()

表13-52 JDBC: 一時BLOB API

メソッド

説明

public static BLOB createTemporary(Connection conn,

boolean cache, int duration) throws SQLException

一時BLOBを作成します。

public static boolean isTemporary(BLOB blob)

throws SQLException

指定のBLOBロケータが一時BLOBを参照するかどうかを確認します。

public boolean isTemporary() throws SQLException

現行のBLOBロケータが一時BLOBを参照するかどうかを確認します。

public static void freeTemporary(BLOB temp_blob)

throws SQLException

指定の一時BLOBを解放します。

public void freeTemporary() throws SQLException

一時BLOBを解放します。

表13-53 JDBC: 一時CLOB API

メソッド

説明

public static CLOB createTemporary(Connection conn,

boolean cache, int duration) throws SQLException

一時CLOBを作成します。

public static boolean isTemporary(CLOB clob)

throws SQLException

指定のCLOBロケータが一時CLOBを参照するかどうかを確認します。

public boolean isTemporary() throws SQLException

現行のCLOBロケータが一時CLOBを参照するかどうかを確認します。

public static void freeTemporary(CLOB temp_clob)

throws SQLException

指定の一時CLOBを解放します。

public void freeTemporary() throws SQLException

一時CLOBを解放します。

JDBC: LOBのオープンおよびクローズ

oracle.sql.CLOBクラスは、標準JDBCのjava.sql.ClobインタフェースをOracle JDBCドライバに実装したものです。表13-53は、oracle.sql.CLOBで一時CLOBにアクセスするためのOracle拡張APIを示しています。

Oracle DatabaseのJDBCドライバには、明示的にLOBをオープンおよびクローズするためのAPIが含まれます。これらのAPIによって、以前のDBMS_LOB.open()およびDBMS_LOB.close()を使用する必要がなくなります。

JDBC: BLOBのオープンおよびクローズ

oracle.sql.BLOBクラスは、標準JDBCのjava.sql.BlobインタフェースをOracle JDBCドライバに実装したものです。表13-54は、oracle.sql.BLOBでBLOBをオープンおよびクローズするためのOracle拡張APIを示しています。

表13-54 JDBC: BLOBのオープンおよびクローズ

メソッド

説明

public void open(int mode) throws SQLException

BLOBをオープンします。

public boolean isOpen() throws SQLException

BLOBがオープンしているかどうかを確認します。

public void close() throws SQLException

BLOBをクローズします。

JDBCを使用したBLOBのオープン

JDBCアプリケーションは、oracle.sql.BLOBクラスに定義されているOPENメソッドを使用してBLOBをオープンできます。OPENメソッドの定義は次のとおりです。

/**
* Open a BLOB in the indicated mode. Valid modes include MODE_READONLY,
* and MODE_READWRITE. It is an error to open the same LOB twice.
*/
public void open (int mode) throws SQLException

MODEパラメータに指定可能な値は次のとおりです。

public static final int MODE_READONLY
public static final int MODE_READWRITE

OPENをコールするたびにBLOBがオープンします。次に例を示します。

BLOB blob = ...
blob.open (BLOB.MODE_READWRITE);

JDBCを使用した、BLOBがオープンしているかどうかの確認

JDBCアプリケーションは、oracle.sql.BLOBに定義されているISOPENメソッドを使用して、BLOBがオープンしているかどうかを確認できます。戻されたブール値は、以前にBLOBがオープンされているかどうかを示します。isOpenメソッドは次のように定義します。

/**
* Check whether the BLOB is opened.
* @return true if the LOB is opened.
*/
public boolean isOpen () throws SQLException

次に例を示します。

BLOB blob = ...
// See if the BLOB is opened
boolean isOpen = blob.isOpen ();

JDBCを使用したBLOBのクローズ

JDBCアプリケーションは、oracle.sql.BLOBに定義されているCLOSEメソッドを使用してBLOBをクローズできます。CLOSE APIの定義は次のとおりです。

/**
* Close a previously opened BLOB.
*/
public void close () throws SQLException

次に例を示します。

BLOB blob = ...
// close the BLOB
blob.close ();

JDBC: CLOBのオープンおよびクローズ

oracle.sql.CLOBクラスは、標準JDBCのjava.sql.ClobインタフェースをOracle JDBCドライバに実装したものです。表13-55は、oracle.sql.CLOBでCLOBをオープンおよびクローズするためのOracle拡張APIを示しています。

表13-55 JDBC: CLOBのオープンおよびクローズ

メソッド

説明

public void open(int mode) throws SQLException

CLOBをオープンします。

public boolean isOpen() throws SQLException

CLOBがオープンしているかどうかを確認します。

public void close() throws SQLException

CLOBをクローズします。

JDBCを使用したCLOBのオープン

JDBCアプリケーションは、oracle.sql.CLOBクラスに定義されているOPENメソッドを使用してCLOBをオープンできます。OPENメソッドの定義は次のとおりです。

/**
* Open a CLOB in the indicated mode. Valid modes include MODE_READONLY,
* and MODE_READWRITE. It is an error to open the same LOB twice.
*/
public void open (int mode) throws SQLException

MODEパラメータに指定可能な値は次のとおりです。

public static final int MODE_READONLY
public static final int MODE_READWRITE

OPENをコールするたびにCLOBがオープンします。次に例を示します。

CLOB clob = ...
clob.open (CLOB.MODE_READWRITE);

JDBCを使用した、CLOBがオープンしているかどうかの確認

JDBCアプリケーションは、oracle.sql.CLOBに定義されているISOPENメソッドを使用して、CLOBがオープンしているかどうかを確認できます。戻されたブール値は、以前にCLOBがオープンされているかどうかを示します。isOpenメソッドは次のように定義します。

/**
* Check whether the CLOB is opened.
* @return true if the LOB is opened.
*/
public boolean isOpen () throws SQLException

次に例を示します。

CLOB clob = ...
// See if the CLOB is opened
boolean isOpen = clob.isOpen ();

JDBCを使用したCLOBのクローズ

JDBCアプリケーションは、oracle.sql.CLOBに定義されているCLOSEメソッドを使用してCLOBをクローズできます。CLOSE APIの定義は次のとおりです。

/**
* Close a previously opened CLOB.
*/
public void close () throws SQLException

次に例を示します。

CLOB clob = ...
// close the CLOB
clob.close ();

JDBC: BFILEのオープンおよびクローズ

oracle.sql.BFILEクラスは、データベースBFILEオブジェクトをラップします。表13-56は、oracle.sql.BFILEでBFILEをオープンおよびクローズするOracle拡張APIを示しています。

表13-56 BFILEをオープンおよびクローズするためのJDBC拡張API

メソッド

説明

public void open() throws SQLException

BFILEをオープンします。

public void open(int mode) throws SQLException

BFILEをオープンします。

public boolean isOpen() throws SQLException

BFILEがオープンしているかどうかを確認します。

public void close() throws SQLException

BFILEをクローズします。

BFILEのオープン

JDBCアプリケーションは、oracle.sql.BFILEクラスに定義されているOPENメソッドを使用してBFILEをオープンできます。OPENメソッドの定義は次のとおりです。

/**
* Open a external LOB in the read-only mode. It is an error
* to open the same LOB twice.
*/
public void open () throws SQLException

/**
* Open a external LOB in the indicated mode. Valid modes include
* MODE_READONLY only. It is an error to open the same
* LOB twice.
*/
public void open (int mode) throws SQLException

MODEパラメータに指定可能な値は次のとおりです。

public static final int MODE_READONLY

OPENをコールするたびにBFILEがオープンします。次に例を示します。

BFILE bfile = ...
bfile.open ();

BFILEがオープンしているかどうかの確認

JDBCアプリケーションでBFILEがオープンしているかどうかを確認するには、oracle.sql.BFILEで定義されているisOpenメソッドを使用します。戻されたブール値は、以前にBFILEがオープンされているかどうかを示します。isOpenメソッドは次のように定義します。

/**
* Check whether the BFILE is opened.
* @return true if the LOB is opened.
*/
public boolean isOpen () throws SQLException

次に例を示します。

BFILE bfile = ...
// See if the BFILE is opened
boolean isOpen = bfile.isOpen ();

BFILEのクローズ

JDBCアプリケーションは、oracle.sql.BFILEに定義されているCLOSEメソッドを使用してBFILEをクローズできます。CLOSE APIの定義は次のとおりです。

/**
* Close a previously opened BFILE.
*/
public void close () throws SQLException

次に例を示します。

BFILE bfile = ...
// close the BFILE
bfile.close ();

使用例(OpenCloseLob.java)

/*
* This sample shows how to open/close BLOB and CLOB.
*/

// You must import the java.sql package to use JDBC
import java.sql.*;

// You must import the oracle.sql package to use oracle.sql.BLOB
import oracle.sql.*;

class OpenCloseLob
{
public static void main (String args [])
throws SQLException
{
// Load the Oracle JDBC driver
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());

String url = "jdbc:oracle:oci8:@";
try {
String url1 = System.getProperty("JDBC_URL");
if (url1 != null)
url = url1;
} catch (Exception e) {
// If there is any security exception, ignore it
// and use the default
}

// Connect to the database
Connection conn =
DriverManager.getConnection (url, "scott", "password");
// It is faster when auto commit is off
conn.setAutoCommit (false);

// Create a Statement
Statement stmt = conn.createStatement ();

try
{
stmt.execute ("drop table basic_lob_table");
}
catch (SQLException e)
{
// An exception could be raised here if the table did not exist.
}

// Create a table containing a BLOB and a CLOB
stmt.execute ("create table basic_lob_table (x varchar2 (30), b blob, c clob)");

// Populate the table
stmt.execute (
"insert into basic_lob_table values"
+ " ('one', '010101010101010101010101010101', 'onetwothreefour')");

// Select the lobs
ResultSet rset = stmt.executeQuery ("select * from basic_lob_table");
while (rset.next ())
{
// Get the lobs
BLOB blob = (BLOB) rset.getObject (2);
CLOB clob = (CLOB) rset.getObject (3);

// Open the lobs
System.out.println ("Open the lobs");
blob.open (BLOB.MODE_READWRITE);
clob.open (CLOB.MODE_READWRITE);

// Check if the lobs are opened
System.out.println ("blob.isOpen()="+blob.isOpen());
System.out.println ("clob.isOpen()="+clob.isOpen());

// Close the lobs
System.out.println ("Close the lobs");
blob.close ();
clob.close ();

// Check if the lobs are opened
System.out.println ("blob.isOpen()="+blob.isOpen());
System.out.println ("clob.isOpen()="+clob.isOpen());
}

// Close the ResultSet
rset.close ();

// Close the Statement
stmt.close ();

// Close the connection
conn.close ();
}
}

JDBCを使用したLOBの切捨て

Oracle DatabaseのJDBCドライバには、永続LOBを切り捨てるためのAPIが含まれています。これによって、以前のDBMS_LOB.trim()を使用する必要がなくなります。

JDBC: BLOBの切捨て

oracle.sql.BLOBクラスは、標準JDBCのjava.sql.BlobインタフェースをOracle JDBCドライバに実装したものです。表13-57は、oracle.sql.BLOBでBLOBを切り捨てるためのOracle拡張APIを示しています。

表13-57 JDBC: BLOBの切捨て

メソッド

説明

public void truncate(long newlen) throws SQLException

BLOBを切り捨てます。

TRUNCATE APIの定義は次のとおりです。

/**
*Truncate the value of the BLOB to the length you specify in the newlen parameter.
* @param newlen the new length of the BLOB.
*/
public void truncate (long newlen) throws SQLException

newlenパラメータにBLOBの新しい長さを指定します。

JDBC: CLOBの切捨て

oracle.sql.CLOBクラスは、標準JDBCのjava.sql.ClobインタフェースをOracle JDBCドライバに実装したものです。表13-58は、oracle.sql.CLOBでCLOBを切り捨てるためのOracle拡張APIを示しています。

表13-58 JDBC: CLOBの切捨て

メソッド

説明

public void truncate(long newlen) throws SQLException

CLOBを切り捨てます。

TRUNCATE APIの定義は次のとおりです。

/**
*Truncate the value of the CLOB to the length you specify in the newlen parameter.
* @param newlen the new length of the CLOB.
*/
public void truncate (long newlen) throws SQLException

newlenパラメータにCLOBの新しい長さを指定します。

関連項目:
例は、「LOBデータの切捨て」を参照してください。

JDBC BLOBストリーミングAPI

データベースに用意されているJDBCインタフェースには、要求された位置でJavaストリームからのLOBの読取りおよび書込みを行うためのLOBストリーミングAPIが含まれています。

oracle.sql.BLOBクラスは、標準JDBCのjava.sql.Blobインタフェースを実装したものです。表13-59は、BLOBストリーミングAPIを示しています。

表13-59 JDBC: BLOBストリーミングAPI

メソッド

説明

public java.io.OutputStream

setBinaryStream (long pos) throws SQLException

JDBC 3.0: このBlobオブジェクトが表すBLOB値に、posの位置から書き込むために使用できるストリームを取り出します。

public java.io.InputStream

getBinaryStream() throws SQLException

JDBC 3.0: このBlobオブジェクトが表すBLOB値を、最初から読み取るために使用できるストリームを取り出します。

public java.io.InputStream

getBinaryStream(long pos) throws SQLException

Oracle拡張機能: このBlobオブジェクトが表すBLOB値を、posの位置から読み取るために使用できるストリームを取り出します。

これらのAPIの定義は次のとおりです。

/**
* Write to the BLOB from a stream at the requested position.
*
* @param pos is the position data to be put.
* @return a output stream to write data to the BLOB
*/
public java.io.OutputStream setBinaryStream(long pos) throws SQLException

/**
* Read from the BLOB as a stream at the requested position.
*
* @param pos is the position data to be read.
* @return a output stream to write data to the BLOB
*/
public java.io.InputStream getBinaryStream(long pos) throws SQLException

JDBC CLOBストリーミングAPI

oracle.sql.CLOBクラスは、標準JDBCのjava.sql.ClobインタフェースをOracle JDBCドライバに実装したものです。表13-60は、CLOBストリーミングAPIを示しています。

表13-60 JDBC: CLOBストリーミングAPI

メソッド

説明

public java.io.OutputStream

setAsciiStream (long pos) throws SQLException

JDBC 3.0: このClobオブジェクトが表すCLOB値に、posの位置からASCII文字を書き込むために使用するストリームを取り出します。

public java.io.Writer

setCharacterStream (long pos) throws SQLException

JDBC 3.0: このClobオブジェクトが表すCLOB値に、posの位置からUnicode文字を書き込むために使用できるストリームを取り出します。

public java.io.InputStream

getAsciiStream() throws SQLException

JDBC 3.0: このClobオブジェクトが表すCLOB値のASCII文字を、最初から読み取るために使用できるストリームを取り出します。

public java.io.InputStream

getAsciiStream(long pos) throws SQLException

Oracle拡張機能: このClobオブジェクトが表すCLOB値のASCII文字を、posの位置から読み取るために使用できるストリームを取り出します。

public java.io.Reader

getCharacterStream() throws SQLException

JDBC 3.0: このClobオブジェクトが表すCLOB値のUnicode文字を、最初から読み取るために使用できるストリームを取り出します。

public java.io.Reader

getCharacterStream(long pos) throws SQLException

Oracle拡張機能: このClobオブジェクトが表すCLOB値のUnicode文字を、posの位置から読み取るために使用できるストリームを取り出します。

これらのAPIの定義は次のとおりです。

/**
* Write to the CLOB from a stream at the requested position.
* @param pos is the position data to be put.
* @return a output stream to write data to the CLOB
*/
public java.io.OutputStream setAsciiStream(long pos) throws SQLException

/**

* Write to the CLOB from a stream at the requested position.
* @param pos is the position data to be put.
* @return a output stream to write data to the CLOB
*/
public java.io.Writer setCharacterStream(long pos) throws SQLException

/**
* Read from the CLOB as a stream at the requested position.
* @param pos is the position data to be put.
* @return a output stream to write data to the CLOB
*/
public java.io.InputStream getAsciiStream(long pos) throws SQLException

/**
* Read from the CLOB as a stream at the requested position.
* @param pos is the position data to be put.
* @return a output stream to write data to the CLOB
*/
public java.io.Reader getCharacterStream(long pos) throws SQLException

BFILEストリーミングAPI

oracle.sql.BFILEクラスは、データベースBFILEをラップします。表13-61は、oracle.sql.BFILEでBFILEの内容を、要求された位置から読み取るOracle拡張APIを示しています。

表13-61 JDBC: BFILEストリーミングAPI

メソッド

説明

public java.io.InputStream

getBinaryStream(long pos)throws SQLException

BFILEからストリームとして読み取ります。

これらのAPIの定義は次のとおりです。

/**
* Read from the BLOB as a stream at the requested position.
*
* @param pos is the position data to be read.
* @return a output stream to write data to the BLOB
*/
public java.io.InputStream getBinaryStream(long pos) throws SQLException

JDBC BFILEストリーミングの例(NewStreamLob.java)

/*
* This sample shows how to read/write BLOB and CLOB as streams.
*/

import java.io.*;

// You must import the java.sql package to use JDBC
import java.sql.*;

// You must import the oracle.sql package to use oracle.sql.BLOB
import oracle.sql.*;

class NewStreamLob
{
public static void main (String args [])  throws Exception
{
// Load the Oracle JDBC driver
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());

String url = "jdbc:oracle:oci8:@";
try {
String url1 = System.getProperty("JDBC_URL");
if (url1 != null)
url = url1;
} catch (Exception e) {
// If there is any security exception, ignore it
// and use the default
}

// Connect to the database
Connection conn =
DriverManager.getConnection (url, "scott", "password");
// It is faster when auto commit is off
conn.setAutoCommit (false);

// Create a Statement
Statement stmt = conn.createStatement ();

try
{
stmt.execute ("drop table basic_lob_table");
}
catch (SQLException e)
{
// An exception could be raised here if the table did not exist.
}

// Create a table containing a BLOB and a CLOB
stmt.execute (
"create table basic_lob_table"
+ "(x varchar2 (30), b blob, c clob)");

// Populate the table
stmt.execute (
"insert into basic_lob_table values"
+ "('one', '010101010101010101010101010101', 'onetwothreefour')");

System.out.println ("Dumping lobs");

// Select the lobs
ResultSet rset = stmt.executeQuery ("select * from basic_lob_table");
while (rset.next ())
{
// Get the lobs
BLOB blob = (BLOB) rset.getObject (2);
CLOB clob = (CLOB) rset.getObject (3);

// Print the lob contents
dumpBlob (conn, blob, 1);
dumpClob (conn, clob, 1);

// Change the lob contents
fillClob (conn, clob, 11, 50);
fillBlob (conn, blob, 11, 50);
}
rset.close ();

System.out.println ("Dumping lobs again");

rset = stmt.executeQuery ("select * from basic_lob_table");
while (rset.next ())
{
// Get the lobs
BLOB blob = (BLOB) rset.getObject (2);
CLOB clob = (CLOB) rset.getObject (3);

// Print the lobs contents
dumpBlob (conn, blob, 11);
dumpClob (conn, clob, 11);
}
// Close all resources
rset.close();
stmt.close();
conn.close();
}

// Utility function to dump Clob contents
static void dumpClob (Connection conn, CLOB clob, long offset)
throws Exception
{
// get character stream to retrieve clob data
Reader instream = clob.getCharacterStream(offset);

// create temporary buffer for read
char[] buffer = new char[10];

// length of characters read
int length = 0;

// fetch data
while ((length = instream.read(buffer)) != -1)
{
System.out.print("Read " + length + " chars: ");

for (int i=0; i<length; i++)
System.out.print(buffer[i]);
System.out.println();
}

// Close input stream
instream.close();
}

// Utility function to dump Blob contents
static void dumpBlob (Connection conn, BLOB blob, long offset)
throws Exception
{
// Get binary output stream to retrieve blob data
InputStream instream = blob.getBinaryStream(offset);
// Create temporary buffer for read
byte[] buffer = new byte[10];
// length of bytes read
int length = 0;
// Fetch data
while ((length = instream.read(buffer)) != -1)
{
System.out.print("Read " + length + " bytes: ");

for (int i=0; i<length; i++)
System.out.print(buffer[i]+" ");
System.out.println();
}

// Close input stream
instream.close();
}

// Utility function to put data in a Clob
static void fillClob (Connection conn, CLOB clob, long offset, long length)
throws Exception
{
Writer outstream = clob.setCharacterStream(offset);

int i = 0;
int chunk = 10;

while (i < length)
{
outstream.write("aaaaaaaaaa", 0, chunk);

i += chunk;
if (length - i < chunk)
chunk = (int) length - i;
}
outstream.close();
}

// Utility function to put data in a Blob
static void fillBlob (Connection conn, BLOB blob, long offset, long length)
throws Exception
{
OutputStream outstream = blob.setBinaryStream(offset);

int i = 0;
int chunk = 10;

byte [] data = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };

while (i < length)
{
outstream.write(data, 0, chunk);

i += chunk;
if (length - i < chunk)
chunk = (int) length - i;
}
outstream.close();
}
}

JDBCおよび空のLOB

oracle.sql.BLOBにある次のAPIを使用すると、空のBLOBを作成できます。

public static BLOB empty_lob () throws SQLException

同様に、oracle.sql.CLOBにある次のAPIを使用すると、空のCLOBを作成できます。

public static CLOB empty_lob () throws SQLException

JDBCドライバを使用すると、データベースをラウンドトリップさせることなく、空のLOBインスタンスを作成できます。空のLOBは、次の場合に使用できます。

- PreparedStatementの「設定」API

- 更新可能な結果セットの「更新」API

- STRUCTの属性値

- ARRAYの要素値

注意:
空のLOBは特別なマーカーとしてのLOBであり、実際のLOB値ではありません。

JDBCアプリケーションでは、前述のAPIから作成された空のLOBに対する読取りまたは書込みを実行できません。アプリケーションが空のLOBに対する読取りまたは書込みを実行しようとすると、ORA-17098「空のLOBに対する操作は無効です」が表示されます。

Oracle Provider for OLE DB(OraOLEDB)

OraOLEDBは、OLE DBおよびADOの開発者に高いパフォーマンス、およびOracleデータへの効率的なアクセスを提供します。COM、C++または任意のCOMクライアントを使用してプログラムを作成する開発者は、OraOLEDBを使用してOracleデータベースにアクセスできます。

OraOLEDBは、OracleのためのOLE DBプロバイダです。これは、高いパフォーマンス、およびLOBなどのOracleデータへの効率的なアクセスを提供します。また、これを使用して特定のLOB型に更新することもできます。

OraOLEDBは、次のLOB型をサポートします。

- 永続LOBの場合。行セット全体でのREAD/WRITE。

- BFILEの場合。行セット全体での読取り専用

- 一時LOBは行セット全体ではサポートされません。

関連項目:
『Oracle Provider for OLE DB開発者ガイド』

Oracle Data Provider for .NET(ODP.NET)の概要

Oracle Data Provider for .NET(ODP.NET)は、Oracleデータベース用のデータ・プロバイダの実装です。ODP.NETでは、Oracle固有のAPIを使用した.NETアプリケーションからOracleのデータおよび機能への、高速で信頼性の高いアクセスが提供されます。また、ODP.NETは、Microsoft .NET Framework Class Libraryで使用可能なクラスとインタフェースを使用し、継承します。ODP.NETでは、LOB(BLOB、CLOB、NCLOBおよびBFILE)が.NETを使用する固有のデータ型としてサポートされます。

COMおよび.NETは補足的な開発テクノロジです。Microsoftでは、新規開発にはCOMではなく.NET Framworkを使用することを開発者に薦めています。

関連項目:
『Oracle Data Provider for .NET開発者ガイド』

14 パフォーマンスのガイドライン

この章の内容は次のとおりです。

- LOBパフォーマンスのガイドライン

- スレッド環境におけるLOBへのデータの移動

- LOBアクセス統計

LOBパフォーマンスのガイドライン

この項では、LOBデータ型を使用するアプリケーションのパフォーマンスに関するガイドラインについて説明します。

チャンク・サイズ

チャンクとは1つまたは複数のOracleブロックです。LOBを含む表を作成する場合に、LOB用のチャンク・サイズを指定できます。これは、LOB値に対してアクセスまたは変更を行うときに、Oracle Databaseが使用するデータ・サイズに対応します。チャンクの一部はシステム関連の情報を格納し、残りはLOB値を格納します。使用するAPIには、LOBチャンク内で使用され、LOB値を格納している領域の量を戻すファンクションがあります。PL/SQLでは、DBMS_LOB.GETCHUNKSIZEを使用します。OCIでは、OCILobGetChunkSize()を使用します。SecureFilesの場合は、表領域のブロック・サイズの使用可能なデータ領域が戻されます。

サイズの小さいBasicFiles LOBのパフォーマンスに関するガイドライン

データベース表内のほとんどのLOBのサイズが小さく(8KB以下)、8KBを超えるLOBを含む行が少ない場合は、次のガイドラインに従ってデータベースのパフォーマンスを最大化します。

- ENABLE STORAGE IN ROWを使用します。

- DB_BLOCK_SIZE初期化パラメータを8KBに設定し、8KBのチャンク・サイズを使用します。

- CACHE、PCTVERSION、LOBセグメント用のCHUNKなど、他のパラメータのチューニングについては、「LOB記憶域パラメータ」を参照してください。

BasicFiles LOBの一般的なパフォーマンスに関するガイドライン

次のガイドラインを使用して、BasicFiles LOBでのパフォーマンスを最適化します。

- 大きなデータ・チャンクでは一度に読取り/書込みをする(可能な場合): LOBは大きいため、大きなピースのLOB値を一度に読取りおよび書込みすることによりパフォーマンスを最適化できます。これは次の点で有効です。

1. クライアント側からLOBにアクセスし、クライアントがサーバーと異なるノードにある場合、大量の読取りおよび書込みを行うことでネットワーク・オーバーヘッドが削減されます。

2. NOCACHEオプションを使用する場合、少量の読取りおよび書込みを行うたびにI/Oが発生します。大量に読取りおよび書込みを行うことでI/Oが削減されます。

3. LOBに書込みを行うと、新しいバージョンのLOBチャンクが作成されます。そのため、一度の書込み量が少ないと、書込みが行われるたびに新しいバージョンを作成するコストがかかります。ロギングが有効な場合、チャンクはREDOログにも格納されます。

- データのスモール・チャンクの読取り/書込みにLOBバッファリングを使用: クライアントでチャンクの小さいLOBデータの読取りおよび書込みを行う必要がある場合、LOBバッファリングを使用します。OCILobEnableBuffering()、OCILobDisableBuffering()、OCILobFlushBuffer()、OCILobWrite2()およびOCILobRead2()を参照してください。基本的に、LOBバッファリングは、チャンクの小さいLOBデータの読取り/書込みを行う前にオンにします。

関連項目:
LOBバッファリングの詳細は、「LOBバッファリング・サブシステム(LBS)」を参照してください。

- コールバックでOCILobRead2()および OCILobWrite2()を使用: これによりLOBとの間でデータがストリーミングされます。入力時に、amountパラメータに書込み全体の長さが設定されていることを確認してください。可能な場合は、LOBチャンク・サイズの倍数のサイズの読取りおよび書込みを行います。

- LOBのチェックアウト/チェックイン・モデルを使用: LOBは次の操作のために最適化されます。

- LOB値全体を置換するSQLのUPDATE。

- クライアントにLOBデータ全体をコピーし、そのLOBデータをクライアント側で変更し、LOBデータ全体をデータベースに再度コピーする操作。これは、ストリームのあるOCILobRead2()およびOCILobWrite2()を使用して行われます。

- 頻繁に変更をコミットします。

一時LOBパフォーマンスのガイドライン

前述の一般的なLOBパフォーマンスに関するガイドライン「LOBパフォーマンスのガイドライン」に加えて、一時LOBの使用に対するガイドラインを次に示します。

- デフォルトのシステム表領域のかわりに、一時LOB記憶域に別の一時表領域を使用します。これによって、データを永続LOBから一時LOBにコピーする場合のデバイスの競合を回避します。
新しく提供された拡張SQLセマンティクス機能をアプリケーションで使用する場合、以前よりさらに多くの一時LOBがSQLおよびPL/SQLで暗黙的に作成されます。これらの一時LOBを格納するための一時表領域が、使用しているアプリケーションに対して十分大きいことを確認してください。特に、これらの一時LOBが暗黙的に作成されるのは、次の事項を使用または実行する場合です。

- LOBに対するSQLファンクション

- LOBに対するPL/SQL組込み文字ファンクション

- VARCHAR2からCLOB、RAWからBLOBへの変数割当て

- LONGからLOBへの移行

- PL/SQLでは、可能なかぎりNOCOPYを使用して、参照によって一時LOBパラメータを渡します。参照によるパラメータの受渡しおよびパラメータのエイリアシングの詳細は、『Oracle Database PL/SQL言語リファレンス』を参照してください。

- 一時LOBに対してバッファ・キャッシュを利用します。CACHEパラメータをTRUEに設定して作成した一時LOBは、バッファ・キャッシュを介して移動できます。CACHEパラメータを設定しなかった場合、一時LOBの読取りおよび書込みはディスクから直接行われます。

- 最適なパフォーマンスを実現するために、一時LOBでは、読取り時参照、書込み時コピーのセマンティクスが使用されます。一時LOBロケータが別のロケータに割り当てられる場合、物理LOBデータはコピーされません。どちらかのLOBロケータを使用する以降のREAD操作では、同じ物理LOBデータが参照されます。割当て後の最初のWRITE操作では、LOB値のセマンティクスを保ち、各ロケータが確実に一意のLOB値を指すように、物理LOBデータがコピーされます。このパフォーマンスの考慮事項は、主としてPL/SQL環境とOCI環境に適用されます。

PL/SQLでは、読取り時参照、書込み時コピーのセマンティクスは次のように示されます。

LOCATOR1 BLOB;
LOCATOR2 BLOB;
DBMS_LOB.CREATETEMPORARY (LOCATOR1,TRUE,DBMS_LOB.SESSION);

-- LOB data is not copied in this assignment operation:
LOCATOR2 := LOCATOR;
-- These read operations refer to the same physical LOB copy:
DBMS_LOB.READ(LOCATOR1, ...);
DBMS_LOB.GETLENGTH(LOCATOR2, ...);

-- A physical copy of the LOB data is made on WRITE:
DBMS_LOB.WRITE(LOCATOR2, ...);

OCIでは、LOBロケータおよびデータの値セマンティクスを保証するために、OCILobLocatorAssign()を使用してLOBデータと一時LOBロケータがコピーされます。OCILobLocatorAssign()の場合、サーバーへのラウンドトリップは発生しません。物理的な一時LOBコピーは、次のように、LOB更新APIと同じラウンドトリップでLOBの更新が発生する場合に実行されます。

OCILobLocator *LOC1;
OCILobLocator *LOC2;
OCILobCreateTemporary(... LOC1, ... TRUE,OCI_DURATION_SESSION);

/* No round-trip is incurred in the following call. */
OCILobLocatorAssign(... LOC1, LOC2);

/* Read operations refer to the same physical LOB copy. */
OCILobRead2(... LOC1 ...)

/* One round-trip is incurred to make a new copy of the
* LOB data and to write to the new LOB copy.
*/
OCILobWrite2(... LOC1 ...)

/* LOC2 does not see the same LOB data as LOC1. */
OCILobRead2(... LOC2 ...)

LOB値セマンティクスを意図していない場合は、次のように、Cのポインタにより参照セマンティクスを使用できます。

OCILobLocator *LOC1;
OCILobLocator *LOC2;
OCILobCreateTemporary(... LOC1, ... TRUE,OCI_DURATION_SESSION);

/* Pointer is copied. LOC1 and LOC2 refer to the same LOB data. */
LOC2 = LOC1;

/* Write to LOC2. */
OCILobWrite2(...LOC2...)

/* LOC1 sees the change made to LOC2. */
OCILobRead2(...LOC1...)

- 一時LOBに対してOCI_OBJECTモードを使用します。
LOB割当てでの一時LOBのパフォーマンスを向上させるには、OCILobLocatorAssign()に対してOCI_OBJECTモードを使用します。OCI_OBJECTモードでは、データベースはディープ・コピー回数を最小限にしようとします。そのため、OCI_OBJECTモードでソース一時LOBに対してOCILobLocatorAssign()が実行された後、ソース・ロケータおよび宛先ロケータは、いずれかのLOBロケータにより変更されるまで同一LOBを指すようになります。

- SQL問合せおよびPL/SQLプログラムから戻された一時LOBを解放します。

PL/SQL、C(OCI)、Javaおよび他のプログラム・インタフェースでは、SQL問合せの結果またはPL/SQLプログラムの実行によって、LOBのオペレーション・コールおよびファンクション・コールに対して一時LOBが戻されます。次に例を示します。

SELECT substr(CLOB_Column, 4001, 32000) FROM ...

PL/SQLで問合せが実行される場合、戻された一時LOBは、PL/SQLプログラム・ブロックの終了時に自動的に解放されます。任意の時点で、明示的に一時LOBを解放することもできます。OCIおよびJavaでは、戻された一時LOBを明示的に解放する必要があります。

SQL問合せから戻された一時LOBの割当てを適切に解除しないと、一時表領域が一杯となり、パフォーマンスが低下します。

SQLセマンティクスとLOBのパフォーマンスに関する考慮事項

LOBでSQLセマンティクスを使用する場合、次のパフォーマンスの問題に注意してください。

- 一時表領域が、アウトラインに格納されたLOBに対して十分な大きさであることを確認してください。サイズが約4000バイトを超える永続LOBは、LOB列の外に格納されます。

- 可能なかぎり、不要な一時LOBインスタンスを解放します。一時LOBインスタンスを明示的に解放しないと、アプリケーションの実行中もLOBがそのまま存在します。さらに、LOBが宣言されたスコープの実行中もインスタンスが存在します。

関連項目:
LOBに対するSQLセマンティクスのサポートの詳細は、第16章「SQLセマンティクスとLOB」を参照してください。

スレッド環境におけるLOBへのデータの移動

スレッド環境では、LOBへのデータの移動に使用できる手順が2つありますが、その1つは適切ではありません。

推奨手順

注意:

- この手順では、空のLOBを作成する必要はありません。

- INSERT/UPDATE文にRETURNING句を使用することで、ロックされたLOBロケータを戻すことができます。これによって、前述の手順3のSELECT-FOR-UPDATEを行う必要がなくなります。

推奨手順は次のとおりです。

1. 空のLOBをINSERTし、LOBロケータをRETURNINGします。

2. このロケータを使用してデータをLOBに移動します。

3. COMMITします。これでROWロックが解放され、LOBデータが永続になります。

また、LOB列またはLOB属性の4000バイトを超えるデータを直接挿入できます。

不適切な手順

スレッド環境を使用する場合に新規の接続が必要となる次の手順は、パフォーマンスに悪影響を与えるため、お薦めしません。

1. 空の(NULLでない)LOBを作成します。

2. 空のLOBを使用してINSERTを実行します

3. 入力直後の行をSELECT-FOR-UPDATEします。

4. データをLOBに移動します。

5. COMMITします。これでROWロックが解放され、LOBデータが永続になります。

LOBアクセス統計

Oracle Database 10gリリース2から、LOB固有の3つのセッションレベルの統計、LOB読取り、LOB書込みおよび未調整LOB書込みが提供されています。セッション統計は、V$MYSTAT、V$SESSTATおよびV$SYSSTATの動的パフォーマンス・ビューからアクセスできます。これらのビューに対して問合せを行うには、SELECT_CATALOG_ROLE、SELECT ON SYS.V_$MYSTATビューおよびSELECT ON SYS.V_$STATNAMEビューの権限が必要です。

LOB読取りは、セッションまたはシステム内で実行されるLOB APIの読取り操作の合計として定義されています。単一のLOB API読取りが、物理または論理ディスク・ブロックへの複数の読取りに対応する場合もあります。

LOB書込みは、セッションまたはシステム内で実行されるLOB APIの書込み操作の合計として定義されています。単一のLOB API書込みが、物理または論理ディスク・ブロックへの複数の書込みに対応する場合もあります。

未調整LOB書込みは、開始オフセットまたはバッファ・サイズが、LOBの内部チャンク・サイズに揃えられていないLOB API書込み操作の数として定義されています。チャンクの境界に揃えられた書込みが、最も効率のよい書込み操作です。LOBの内部チャンク・サイズは、LOB API(たとえば、PL/SQLを使用する場合は DBMS_LOB.GETCHUNKSIZE())を使用して取得できます。

次の簡単な例は、LOBの読取りまたは書込み操作時に、LOBセッション統計が更新される様子を示しています。

セッション統計は、単一セッション中にアクセスされたすべてのLOBに対する操作を総計した統計です。統計はオブジェクトごと(表、列、セグメント、オブジェクト番号など)に分離または分類されていません。

この例では、各デモごとにデータベースに再接続してV$MYSTATをクリアします。これは、同一セッションで実行された過去のLOB操作の結果を不明瞭にすることなく、テスト対象の操作によりLOB統計がどのように変化するかを確認できるようにするためです。

関連項目:
『Oracle Databaseリファレンス』の付録E「統計の説明」

LOBアクセス統計の取得の例

次の例は、LOBアクセス統計を取得するために作成されたものです。

rem
rem Set up the user
rem

CONNECT / AS SYSDBA;
SET ECHO ON;
GRANT SELECT_CATALOG_ROLE TO pm;
GRANT SELECT ON sys.v_$mystat TO pm;
GRANT SELECT ON sys.v_$statname TO pm;

rem
rem Create a simplified view for statistics queries
rem

CONNECT pm;
SET ECHO ON;

DROP VIEW mylobstats;
CREATE VIEW mylobstats
AS
SELECT  SUBSTR(n.name,1,20) name,
m.value             value
FROM    v$mystat    m,
v$statname  n
WHERE   m.statistic# = n.statistic#
AND n.name LIKE 'lob%';

rem
rem Create a test table
rem

DROP TABLE t;
CREATE TABLE t (i NUMBER, c CLOB)
lob(c) STORE AS (DISABLE STORAGE IN ROW);

rem
rem Populate some data
rem
rem This should result in unaligned writes, one for
rem each row/lob populated.
rem

CONNECT pm
SELECT * FROM mylobstats;
INSERT INTO t VALUES (1, 'a');
INSERT INTO t VALUES (2, rpad('a',4000,'a'));
COMMIT;
SELECT * FROM mylobstats;

rem
rem Get the lob length
rem
rem Computing lob length does not read lob data, no change
rem in read/write stats.
rem

CONNECT pm;
SELECT * FROM mylobstats;
SELECT LENGTH(c) FROM t;
SELECT * FROM mylobstats;

rem
rem Read the lobs
rem
rem Lob reads are performed, one for each lob in the table.
rem

CONNECT pm;
SELECT * FROM mylobstats;
SELECT * FROM t;
SELECT * FROM mylobstats;

rem
rem Read and manipulate the lobs (through temporary lobs)
rem
rem The use of complex operators like "substr()" results in
rem the implicit creation and use of temporary lobs. operations
rem on temporary lobs also update lob statistics.
rem

CONNECT pm;
SELECT * FROM mylobstats;
SELECT substr(c, length(c), 1) FROM t;
SELECT substr(c, 1, 1) FROM t;
SELECT * FROM mylobstats;

rem
rem Perform some aligned overwrites
rem
rem Only lob write statistics are updated because both the
rem byte offset of the write, and the size of the buffer
rem being written are aligned on the lob chunksize.
rem

CONNECT pm;
SELECT * FROM mylobstats;
DECLARE
loc     CLOB;
buf     LONG;
chunk   NUMBER;
BEGIN
SELECT c INTO loc FROM t WHERE i = 1
FOR UPDATE;

chunk := DBMS_LOB.GETCHUNKSIZE(loc);
buf   := rpad('b', chunk, 'b');

-- aligned buffer length and offset
DBMS_LOB.WRITE(loc, chunk, 1, buf);
DBMS_LOB.WRITE(loc, chunk, 1+chunk, buf);
COMMIT;
END;
/
SELECT * FROM mylobstats;

rem
rem Perform some unaligned overwrites
rem
rem Both lob write and lob unaligned write statistics are
rem updated because either one or both of the write byte offset
rem and buffer size are unaligned with the lob's chunksize.
rem

CONNECT pm;
SELECT * FROM mylobstats;
DECLARE
loc CLOB;
buf LONG;
BEGIN
SELECT c INTO loc FROM t WHERE i = 1
FOR UPDATE;

buf := rpad('b', DBMS_LOB.GETCHUNKSIZE(loc), 'b');

-- unaligned buffer length
DBMS_LOB.WRITE(loc, DBMS_LOB.GETCHUNKSIZE(loc)-1, 1, buf);

-- unaligned start offset
DBMS_LOB.WRITE(loc, DBMS_LOB.GETCHUNKSIZE(loc), 2, buf);

-- unaligned buffer length and start offset
DBMS_LOB.WRITE(loc, DBMS_LOB.GETCHUNKSIZE(loc)-1, 2, buf);

COMMIT;
END;
/
SELECT * FROM mylobstats;
DROP TABLE t;
DROP VIEW mylobstats;

CONNECT / AS SYSDBA
REVOKE SELECT_CATALOG_ROLE FROM pm;
REVOKE SELECT ON sys.v_$mystat FROM pm;
REVOKE SELECT ON sys.v_$statname FROM pm;

QUIT;

第IV部

LOBへのSQLアクセス

第IV部では、SQL環境とPL/SQL環境でサポートされるLOBのSQLセマンティクスについて説明します。

この部の構成は、次のとおりです。

- 第15章「LOBに対するDDL文とDML文」

- 第16章「SQLセマンティクスとLOB」

- 第17章「LOBに対するPL/SQLセマンティクス」

- 第18章「LONGからLOBへの列の移行」

15 LOBに対するDDL文とDML文

この章の内容は次のとおりです。

- 1つ以上のLOB列を含む表の作成

- LOBを含むネストした表の作成

- 別の表からのLOBの選択による行の挿入

- 表へのLOB値の挿入

- 初期化したLOBロケータ・バインド変数を使用した行の挿入

- EMPTY_CLOB()またはEMPTY_BLOB()を使用したLOBの更新

- 別の表からのLOBの選択による行の更新

関連項目:
4000バイトを超えるバインドが必要なときLOBにINSERTする方法は、次の「INSERT操作とUPDATE操作でのすべてのサイズのバインド」の項を参照してください。

1つ以上のLOB列を含む表の作成

この項では、1つ以上のLOB列を含む表の作成方法について説明します。

EMPTY_BLOB()およびEMPTY_CLOB()ファンクションを使用すると、LOBは初期化されますが、データは移入されません。また、空のLOBがNULLでないことにも注意してください。

関連項目:

次のものを含むCREATE TABLEおよびALTER TABLE文で、LOBを使用する場合の構文については、『Oracle Database SQL言語リファレンス』を参照してください。

- BLOB、CLOB、NCLOBおよびBFILE列

- EMPTY_BLOBおよびEMPTY_CLOBファンクション

- 埋込みオブジェクトのLOB属性および永続LOB列に対するLOB STORAGE句

使用例

この例では、次のサンプル・スキーマを使用します。

- 人事管理(HR)

- 注文入力(OE)

- 製品メディア(PM)

HRスキーマとOEスキーマを作成した後にPMスキーマを作成する必要があることに注意してください。各スキーマの詳細は、『Oracle Databaseサンプル・スキーマ』を参照してください。

注意:
SQL DDLを使用すると1つ以上のLOB列を含む表を直接作成できるため、DBMS_LOBパッケージを使用する必要はありません。

/*  Setup script for creating Print_media,
Online_media and associated structures
*/

DROP USER pm CASCADE;
DROP DIRECTORY ADPHOTO_DIR;
DROP DIRECTORY ADCOMPOSITE_DIR;
DROP DIRECTORY ADGRAPHIC_DIR;
DROP INDEX onlinemedia CASCADE CONSTRAINTS;
DROP INDEX printmedia CASCADE CONSTRAINTS;
DROP TABLE online_media CASCADE CONSTRAINTS;
DROP TABLE print_media CASCADE CONSTRAINTS;
DROP TYPE textdoc_typ;
DROP TYPE textdoc_tab;
DROP TYPE adheader_typ;
DROP TABLE adheader_typ;
CREATE USER pm;
GRANT CONNECT, RESOURCE to pm;

CREATE DIRECTORY ADPHOTO_DIR AS '/tmp/';
CREATE DIRECTORY ADCOMPOSITE_DIR AS '/tmp/';
CREATE DIRECTORY ADGRAPHIC_DIR AS '/tmp/';
CREATE DIRECTORY media_dir AS '/tmp/';
GRANT READ ON DIRECTORY ADPHOTO_DIR to pm;
GRANT READ ON DIRECTORY ADCOMPOSITE_DIR to pm;
GRANT READ ON DIRECTORY ADGRAPHIC_DIR to pm;
GRANT READ ON DIRECTORY media_dir to pm;

CONNECT pm/password  (or &pass);
COMMIT;

CREATE TABLE a_table (blob_col BLOB);

CREATE TYPE adheader_typ AS OBJECT (
header_name    VARCHAR2(256),
creation_date  DATE,
header_text    VARCHAR(1024),
logo           BLOB );

CREATE TYPE textdoc_typ AS OBJECT (
document_typ   VARCHAR2(32),
formatted_doc  BLOB);

CREATE TYPE Textdoc_ntab AS TABLE of textdoc_typ;

CREATE TABLE adheader_tab of adheader_typ (
Ad_finaltext DEFAULT EMPTY_CLOB(), CONSTRAINT
Take CHECK (Take IS NOT NULL),  DEFAULT NULL);

CREATE TABLE online_media
( product_id  NUMBER(6),
product_photo ORDSYS.ORDImage,
product_photo_signature ORDSYS.ORDImageSignature,
product_thumbnail ORDSYS.ORDImage,
product_video ORDSYS.ORDVideo,
product_audio ORDSYS.ORDAudio,
product_text CLOB,
product_testimonials ORDSYS.ORDDoc);

CREATE UNIQUE INDEX onlinemedia_pk
ON online_media (product_id);

ALTER TABLE online_media
ADD (CONSTRAINT onlinemedia_pk
PRIMARY KEY (product_id), CONSTRAINT loc_c_id_fk
FOREIGN KEY (product_id)  REFERENCES oe.product_information(product_id)
);

CREATE TABLE print_media
(product_id NUMBER(6),
ad_id NUMBER(6),
ad_composite BLOB,
ad_sourcetext CLOB,
ad_finaltext CLOB,
ad_fktextn NCLOB,
ad_testdocs_ntab textdoc_tab,
ad_photo BLOB,
ad_graphic BFILE,
ad_header adheader_typ,
press_release LONG) NESTED TABLE ad_textdocs_ntab STORE AS textdocs_nestedtab;

CREATE UNIQUE INDEX printmedia_pk
ON print_media (product_id, ad_id);

ALTER TABLE print_media
ADD (CONSTRAINT printmedia_pk
PRIMARY KEY (product_id, ad_id),
CONSTRAINT printmedia_fk FOREIGN KEY (product_id)
REFERENCES oe.product_information(product_id)
);

LOBを含むネストした表の作成

この項では、LOBを含むネストした表の作成方法について説明します。

LOB属性を含むオブジェクト型を作成してから、そのオブジェクト型を基にネストした表を作成する必要があります。次の例のPrint_media表には、textdoc_tab型を持つネストした表ad_textdoc_ntabが含まれます。この型は、次の2種類のLOBデータ型を使用しています。

- BFILE : 広告用のグラフィック

- CLOB: 広告用の記録

ネストした表の実際の埋込みは、その表を含む構造が定義されるときに行われます。この例では、次に示すように、Print_media表の作成時にNESTED TABLE文によって行われます。

/* Create type textdoc_typ as the base type
for the nested table textdoc_ntab,
where textdoc_ntab contains a LOB:
*/
CREATE TYPE textdoc_typ AS OBJECT
(
document_typ    VARCHAR2(32),
formatted_doc   BLOB
);
/

/* The type has been created. Now you need a */
/* nested table of that type to embed in */
/* table Print_media, so: */
CREATE TYPE textdoc_ntab AS TABLE of textdoc_typ;
/

CREATE TABLE textdoc_ntable (
id NUMBER,
ntab_col textdoc_ntab)
NESTED TABLE ntab_col STORE AS textdoc_nestedtab;

DROP TYPE textdoc_typ force;
DROP TYPE textdoc_ntab;
DROP TABLE textdoc_ntable;

関連項目:

- 「1つ以上のLOB列を含む表の作成」

- 『Oracle Database SQL言語リファレンス』の第7章「SQL文」のCREATE TABLEに関する項

別の表からのLOBの選択による行の挿入

この項では、LOBを含む行を選択して挿入する方法について説明します。

注意:
BFILEには参照セマンティクスが適用されますが、永続LOB型のBLOB、CLOBおよびNCLOBにはコピー・セマンティクスが使用されます。BLOB、CLOBまたはNCLOBが、ある行から同じ表または別の表の行にコピーされる場合は、LOBロケータのみでなく実際のLOB値がコピーされます。

LOBに関してオブジェクト・リレーショナル技法を使用すると、関連する表の共通テンプレートとして型を定義できるというメリットがあります。たとえば、アーカイブ・データを格納する表と、これらのライブラリを使用する作業表の両方が共通の構造を持つことになります。

たとえば、Print_mediaおよびOnline_mediaが同じスキーマを持つとします。この文は、表Print_mediaに新しいLOBロケータを作成します。また、Online_mediaから、表Print_mediaに挿入された新しいLOBロケータによって示される場所にLOBデータをコピーします。

次のコード・フラグメントは、表Online_mediaが、表Print_mediaのad_textdocs_ntab列によって参照されるPrint_mediaと同じタイプであるという事実に基づいています。ライブラリ表に値を挿入し、これと同じデータをSELECTによってPrint_mediaに挿入します。

/* Store records in the archive table Online_media: */
INSERT INTO Online_media
VALUES (3060, NULL, NULL, NULL, NULL,
'some text about this CRT Monitor', NULL);

/* Insert values into Print_media by selecting from Online_media: */
INSERT INTO Print_media (product_id, ad_id, ad_sourcetext)
(SELECT product_id, 11001, product_text
FROM Online_media WHERE product_id = 3060);

関連項目:

- 『Oracle Database SQL言語リファレンス』の第7章「SQL文」のINSERTに関する項

- この例で使用されるPMスキーマおよびPrint_media表の詳細は、『Oracle Databaseサンプル・スキーマ』を参照してください。

表へのLOB値の挿入

この項では、EMPTY_CLOB()またはEMPTY_BLOB()を使用して、LOBを挿入する方法について説明します。

使用上の注意

次に、LOB挿入のガイドラインを示します。

NULL以外のLOB列の作成

データを永続LOBに書き込む前に、LOB列および非NULLにします。つまり、LOB列に空または移入済のLOB値を指すロケータを含める必要があります。BLOB列の値を初期化するには、デフォルトの述語としてEMPTY_BLOB()ファンクションを使用します。同様に、CLOB列またはNCLOB列の値を初期化するには、EMPTY_CLOB()ファンクションを使用します。

サイズが4000バイト未満の文字列またはRAW文字列を含むLOB列も初期化できます。次に例を示します。

INSERT INTO Print_media (product_id, ad_id, ad_sourcetext)
VALUES (1, 1, 'This is a One Line Advertisement');

この初期化は、CREATE TABLE操作中でも実行できることに注意してください。詳細は、「1つ以上のLOB列を含む表の作成」を参照してください。

これらのファンクションは、Oracle SQLでは特別ファンクションとして使用できますが、DBMS_LOBパッケージには含まれていません。

/* In the new row of table Print_media,
the columns ad_sourcetext and ad_fltextn are initialized using EMPTY_CLOB(),
the columns ad_composite and ad_photo are initialized using EMPTY_BLOB(),
the column formatted-doc in the nested table is initialized using
EMPTY_BLOB(),
the column logo in the column object is initialized using EMPTY_BLOB(): */
INSERT INTO Print_media
VALUES (3060,11001, EMPTY_BLOB(), EMPTY_CLOB(),EMPTY_CLOB(),EMPTY_CLOB(),
textdoc_tab(textdoc_typ ('HTML', EMPTY_BLOB())), EMPTY_BLOB(), NULL,
adheader_typ('any header name', <any date>, 'ad header text goes here',
EMPTY_BLOB()),
'Press release goes here');

初期化したLOBロケータ・バインド変数を使用した行の挿入

この項では、初期化したLOBロケータ・バインド変数を使用して行を挿入する方法について説明します。

事前条件

この方法で行を挿入するには、次の条件を満たしている必要があります。

- ソース行を含む表が存在していること。

- 挿入先の表が存在していること。

LOB列を含む表の作成方法の詳細は、「LOB記憶域パラメータ」を参照してください。

使用上の注意

4000バイトを超えるバインドが関係する場合の、LOBを含む行の挿入および更新方法のガイドラインについては、「INSERT操作とUPDATE操作でのすべてのサイズのバインド」を参照してください。

構文

各プログラム環境でこの操作を使用する方法の詳細は、次のマニュアルを参照してください。

- SQL: 『Oracle Database SQL言語リファレンス』の第7章「SQL文」のINSERTに関する項

- C (OCI): 『Oracle Call Interfaceプログラマーズ・ガイド』の「その他のOCIリレーショナル関数」のLOB関数に関する項

- C++(OCCI): 『Oracle C++ Call Interfaceプログラマーズ・ガイド』

- COBOL (Pro*COBOL) 『Pro*COBOLプログラマーズ・ガイド』のLOBの詳細、LOB文の使用上の注意および「埋込みSQLおよびプリコンパイラ・ディレクティブ」のINSERTに関する項

- C/C++ (Pro*C/C++): 『Pro*C/C++プログラマーズ・ガイド』の付録F「埋込みSQL文およびディレクティブ」のINSERTに関する項

- COM(OO4Oオンライン・ヘルプ): ヘルプの「目次」タブから、「OO4Oオートメーション・サーバー・リファレンス」→「OO4Oサーバーのオブジェクト」→「Oradynaset」を選択

- Java (JDBC): 『Oracle Database JDBC開発者ガイドおよびリファレンス』の第7章「LOBとBFILEの操作」の「BLOBまたはCLOB列の作成と移入」

例

ここに示す例は、次のプログラム環境での例です。

- PL/SQL: 初期化したLOBロケータ・バインド変数を使用した行の挿入

- C(OCI): 初期化したLOBロケータ・バインド変数を使用した行の挿入

- C++(OCCI): 今回のリリースでは例は提供されません。

- COBOL(Pro*COBOL): 初期化したLOBロケータ・バインド変数を使用した行の挿入

- C/C++(Pro*C/C++): 初期化したLOBロケータ・バインド変数を使用した行の挿入

- COM(OO4O): 初期化したLOBロケータ・バインド変数を使用した行の挿入

- Java(JDBC): 初期化したLOBロケータ・バインド変数を使用した行の挿入

PL/SQL: 初期化したLOBロケータ・バインド変数を使用した行の挿入

/* This file is installed in the following path when you install */
/* the database: $ORACLE_HOME/rdbms/demo/lobs/plsql/linsert.sql */

/* inserting a row through an insert statement */

CREATE OR REPLACE PROCEDURE insertLOB_proc (Lob_loc IN BLOB) IS
BEGIN
/* Insert the BLOB into the row */
DBMS_OUTPUT.PUT_LINE('------------ LOB INSERT EXAMPLE ------------');
INSERT INTO print_media (product_id, ad_id, ad_photo)
values (3106, 60315, Lob_loc);
END;
/

C(OCI): 初期化したLOBロケータ・バインド変数を使用した行の挿入

/* This file is installed in the following path when you install */
/* the database: $ORACLE_HOME/rdbms/demo/lobs/oci/linsert.c */

/* Insert the Locator into table using Bind Variables. */
#include <oratypes.h>
#include <lobdemo.h>
void insertLOB_proc(OCILobLocator *Lob_loc, OCIEnv *envhp,
OCIError *errhp, OCISvcCtx *svchp, OCIStmt *stmthp)
{
int            product_id;
OCIBind       *bndhp3;
OCIBind       *bndhp2;
OCIBind       *bndhp1;
text          *insstmt =
(text *) "INSERT INTO Print_media (product_id, ad_id, ad_sourcetext) \
VALUES (:1, :2, :3)";

printf ("----------- OCI Lob Insert Demo --------------\n");
/* Insert the locator into the Print_media table with product_id=3060 */
product_id = (int)3060;

/* Prepare the SQL statement */
checkerr (errhp, OCIStmtPrepare(stmthp, errhp, insstmt, (ub4)
strlen((char *) insstmt),
(ub4) OCI_NTV_SYNTAX, (ub4)OCI_DEFAULT));

/* Binds the bind positions */
checkerr (errhp, OCIBindByPos(stmthp, &bndhp1, errhp, (ub4) 1,
(void *) &product_id, (sb4) sizeof(product_id),
SQLT_INT, (void *) 0, (ub2 *)0, (ub2 *)0,
(ub4) 0, (ub4 *) 0, (ub4) OCI_DEFAULT));

checkerr (errhp, OCIBindByPos(stmthp, &bndhp1, errhp, (ub4) 2,
(void *) &product_id, (sb4) sizeof(product_id),
SQLT_INT, (void *) 0, (ub2 *)0, (ub2 *)0,
(ub4) 0, (ub4 *) 0, (ub4) OCI_DEFAULT));

checkerr (errhp, OCIBindByPos(stmthp, &bndhp2, errhp, (ub4) 3,
(void *) &Lob_loc, (sb4) 0,  SQLT_CLOB,
(void *) 0, (ub2 *)0, (ub2 *)0,
(ub4) 0, (ub4 *) 0, (ub4) OCI_DEFAULT));

/* Execute the SQL statement */
checkerr (errhp, OCIStmtExecute(svchp, stmthp, errhp, (ub4) 1, (ub4) 0,
(CONST OCISnapshot*) 0, (OCISnapshot*) 0,
(ub4) OCI_DEFAULT));
}

COBOL(Pro*COBOL): 初期化したLOBロケータ・バインド変数を使用した行の挿入

* This file is installed in the following path when you install
* the database: $ORACLE_HOME/rdbms/demo/lobs/procob/linsert.pco

IDENTIFICATION DIVISION.
PROGRAM-ID. INSERT-LOB.
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.

01 BLOB1 SQL-BLOB.
01  USERID   PIC X(11) VALUES "PM/password".
EXEC SQL INCLUDE SQLCA END-EXEC.

PROCEDURE DIVISION.
INSERT-LOB.

EXEC SQL WHENEVER SQLERROR DO PERFORM SQL-ERROR END-EXEC.
EXEC SQL CONNECT :USERID END-EXEC.
* Initialize the BLOB locator
EXEC SQL ALLOCATE :BLOB1 END-EXEC.
* Populate the LOB
EXEC SQL WHENEVER NOT FOUND GOTO END-OF-BLOB END-EXEC.
EXEC SQL
SELECT AD_PHOTO INTO :BLOB1 FROM PRINT_MEDIA
WHERE PRODUCT_ID = 2268 AND AD_ID = 21001 END-EXEC.

* Insert the value with PRODUCT_ID of 3060
EXEC SQL
INSERT INTO PRINT_MEDIA (PRODUCT_ID, AD_PHOTO)
VALUES (3060, 11001, :BLOB1)END-EXEC.

* Free resources held by locator
END-OF-BLOB.
EXEC SQL WHENEVER NOT FOUND CONTINUE END-EXEC.
EXEC SQL FREE :BLOB1 END-EXEC.
EXEC SQL ROLLBACK WORK RELEASE END-EXEC.
STOP RUN.

SQL-ERROR.
EXEC SQL WHENEVER SQLERROR CONTINUE END-EXEC.
DISPLAY " ".
DISPLAY "ORACLE ERROR DETECTED:".
DISPLAY " ".
DISPLAY SQLERRMC.
EXEC SQL ROLLBACK WORK RELEASE END-EXEC.
STOP RUN.

注意:
この機能を簡単に説明するために、この例では、デプロイされたシステムで通常使用されるパスワード管理手法を実行していません。本番環境では、Oracle Databaseパスワード管理のガイドラインに従い、サンプル・アカウントをすべて無効化してください。パスワード管理のガイドラインおよびセキュリティに関するその他の推奨事項は、『Oracle Databaseセキュリティ・ガイド』を参照してください。

C/C++(Pro*C/C++): 初期化したLOBロケータ・バインド変数を使用した行の挿入

/* This file is installed in the following path when you install */
/* the database: $ORACLE_HOME/rdbms/demo/lobs/proc/linsert.pc */

#include <oci.h>
#include <stdio.h>
#include <sqlca.h>

void Sample_Error()
{
EXEC SQL WHENEVER SQLERROR CONTINUE;
printf("%.*s\n", sqlca.sqlerrm.sqlerrml, sqlca.sqlerrm.sqlerrmc);
EXEC SQL ROLLBACK WORK RELEASE;
exit(1);
}

void insertUseBindVariable_proc(Rownum, Lob_loc)
int Rownum, Rownum2;
OCIBlobLocator *Lob_loc;
{
EXEC SQL WHENEVER SQLERROR DO Sample_Error();
EXEC SQL INSERT INTO Print_media (product_id, ad_id, ad_photo)
VALUES (:Rownum, :Rownum2, :Lob_loc);
}
void insertBLOB_proc()
{
OCIBlobLocator *Lob_loc;

/* Initialize the BLOB Locator: */
EXEC SQL ALLOCATE :Lob_loc;

/* Select the LOB from the row where product_id = 2268 and ad_id=21001: */
EXEC SQL SELECT ad_photo INTO :Lob_loc
FROM Print_media WHERE product_id = 2268 AND ad_id = 21001;

/* Insert into the row where product_id = 3106 and ad_id = 13001: */
insertUseBindVariable_proc(3106, 13001, Lob_loc);

/* Release resources held by the locator: */
EXEC SQL FREE :Lob_loc;
}

void main()
{
char *samp = "pm/password";
EXEC SQL CONNECT :pm;
insertBLOB_proc();
EXEC SQL ROLLBACK WORK RELEASE;
}

COM(OO4O): 初期化したLOBロケータ・バインド変数を使用した行の挿入

' This file is installed in the following path when you install
' the database: $ORACLE_HOME/rdbms/demo/lobs/vb/linsert.bas

Dim OraDyn as OraDynaset, OraPhoto1 as OraBLOB, OraPhotoClone as OraBLOB
Set OraDyn = OraDb.CreateDynaset(
"SELECT * FROM Print_media ORDER BY product_id", ORADYN_DEFAULT)
Set OraPhoto1 = OraDyn.Fields("ad_photo").Value
'Clone it for future reference
Set OraPhotoClone = OraPhoto1

'Go to Next row
OraDyn.MoveNext
'Lets update the current row and set the LOB to OraPhotoClone
OraDyn.Edit
Set OraPhoto1 = OraPhotoClone
OraDyn.Update

Java(JDBC): 初期化したLOBロケータ・バインド変数を使用した行の挿入

/* This file is installed in the following path when you install */
/* the database: $ORACLE_HOME/rdbms/demo/lobs/java/linsert.java */

// Core JDBC classes:
import java.sql.DriverManager;
import java.sql.Connection;
import java.sql.Statement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

// Oracle Specific JDBC classes:
import oracle.sql.*;
import oracle.jdbc.driver.*;

public class linsert
{
public static void main (String args [])
throws Exception
{
// Load the Oracle JDBC driver
DriverManager.registerDriver (new oracle.jdbc.driver.OracleDriver ());
// Connect to the database:
Connection conn =
DriverManager.getConnection ("jdbc:oracle:oci8:@", "pm", "password");

// It's faster when auto commit is off:
conn.setAutoCommit (false);

// Create a Statement:
Statement stmt = conn.createStatement ();
try
{
ResultSet rset = stmt.executeQuery (
"SELECT ad_photo FROM Print_media WHERE product_id = 3106 AND ad_id = 13001");
if (rset.next())
{
// retrieve the LOB locator from the ResultSet
BLOB adphoto_blob = ((OracleResultSet)rset).getBLOB (1);
OraclePreparedStatement ops =
(OraclePreparedStatement) conn.prepareStatement(
"INSERT INTO Print_media (product_id, ad_id, ad_photo) VALUES (2268, "
+ "21001, ?)");
ops.setBlob(1, adphoto_blob);
ops.execute();
conn.commit();
conn.close();
}
}
catch (SQLException e)
{
e.printStackTrace();
}
}
}

EMPTY_CLOB()またはEMPTY_BLOB()を使用したLOBの更新

この項では、EMPTY_CLOB()またはEMPTY_BLOB()を使用してLOBを更新する方法について説明します。

注意:
EMPTY_CLOB()またはEMPTY_BLOB()のかわりに実際の値でLOBを更新するとパフォーマンスが改善されます。

事前条件

データを永続LOBに書き込む前に、LOB列および非NULLにします。つまり、LOB列に空または移入済のLOB値を指すロケータを含める必要があります。BLOB列の値を初期化するには、デフォルトの述語としてEMPTY_BLOB()ファンクションを使用します。同様に、CLOB列またはNCLOB列の値を初期化するには、EMPTY_CLOB()ファンクションを使用します。

サイズが4000バイト未満の文字列またはRAW文字列を含むLOB列も初期化できます。次に例を示します。

UPDATE Print_media
SET ad_sourcetext = 'This is a One Line Story'
WHERE product_id = 2268;

この初期化は、CREATE TABLEの操作中も実行可能です(「1つ以上のLOB列を含む表の作成」を参照)。また、この場合はINSERTを使用しても実行できます。

次の例では、EMPTY_CLOBを使用して様々なデータ型にLOBを更新する場合の一連の手続きを示します。

UPDATE Print_media SET ad_sourcetext = EMPTY_CLOB()
WHERE product_id = 3060 AND ad_id = 11001;

UPDATE Print_media SET ad_fltextn = EMPTY_CLOB()
WHERE product_id = 3060 AND ad_id = 11001;

UPDATE Print_media SET ad_photo = EMPTY_BLOB()
WHERE product_id = 3060 AND ad_id = 11001;

関連項目:
SQL: 『Oracle Database SQL言語リファレンス』の第7章「SQL文」のUPDATEに関する項

別の表からのLOBの選択による行の更新

この項では、SQL UPDATE AS SELECT文を使用し、別の表からLOBを選択してLOB列を含む行を更新する方法について説明します。

この方法を使用するには、参照を使用して更新する必要があります。たとえば、次のコードでは、online_mediaのデータが更新されます。

Rem Updating a row by selecting a LOB from another table (persistent LOBs)

UPDATE Print_media SET ad_sourcetext =
(SELECT * product_text FROM online_media WHERE product_id = 3060);
WHERE product_id = 3060 AND ad_id = 11001;

16 SQLセマンティクスとLOB

この章では、LOBをサポートするSQLセマンティクスについて説明します。この章で説明する技法では、一部の操作にLOB固有のAPIを使用するかわりに、SQLコードでLOBを直接使用できます。

この章の内容は次のとおりです。

- SQLでのLOBの使用

- LOBでの使用がサポートされるSQLファンクションおよび演算子

- SQLでのLOBデータ型の暗黙的な変換

- SQLでサポートされないLOBの使用

- LOBのVARCHAR2およびRAWセマンティクス

関連項目:
「SQLセマンティクスとLOBのパフォーマンスに関する考慮事項」

- リモートLOBおよびBFILE用の組込みファンクション

SQLでのLOBの使用

SQL文字列演算子やSQLファンクションなど、SQL VARCHAR2セマンティクスを使用して、CLOBデータ型とNCLOBデータ型にアクセスできます。(LENGTHファンクションは、CLOBおよびNCLOBデータ型と同様に、BLOBデータ型でも使用できます)。これらの技法にメリットがあるのは、次の場合です。

- 比較的小さいサイズ(約100KB以下)のLOBに対して操作を実行する場合。

- データベースをLONG列からLOBデータ型に移行した後も、既存のPL/SQLアプリケーションのSQL文字列関数がすべて引き続き機能する場合。

次の場合には、SQLセマンティクスをお薦めしません。

- ランダム・アクセスやピース単位のフェッチなど、高度な機能を使用する場合は、LOB APIを使用してください。

- 比較的大きいサイズ(1MBを超える場合)のLOBに対しSQLセマンティクスを使用して操作を実行すると、パフォーマンスが低下する可能性がある場合。この場合はLOB APIを使用することをお薦めします。

注意:
SQLセマンティクスは、永続LOBおよび一時LOBとともに使用されます。(BFILEは読取り専用データ型のため、BFILE列には適用されません。)

LOBでの使用がサポートされるSQLファンクションおよび演算子

引数としてVARCHAR2列を取る多数のSQL演算子およびファンクションは、LOB列も受け入れます。次のリストに、LOBでの使用がサポートされるSQLファンクションおよび演算子のカテゴリを示します。個々のファンクションおよび演算子の詳細は、表16-1を参照してください。

次のカテゴリのSQLファンクションおよび演算子は、LOBでの使用がサポートされます。

- 連結

- 比較
(一部の比較関数は、LOBでの使用がサポートされません。)

- 文字関数

- 変換
(一部の変換関数は、LOBでの使用がサポートされません。)

次のカテゴリのファンクションは、LOBでの使用がサポートされません。

- 集計関数
事前定義済の集計関数はLOBでの使用がサポートされませんが、ユーザー定義の集計関数を作成してLOBで使用できることに注意してください。ユーザー定義の集計関数の詳細は、『Oracle Databaseデータ・カートリッジ開発者ガイド』を参照してください。

- Unicodeファンクション

各ファンクションと演算子の詳細は表16-1のとおりです。この表には、オペランドまたは引数としてVARCHAR2型を取る、またはVARCHAR2値を戻すSQL演算子およびファンクションがリストされています。「SQL」列には、CLOBおよびNCLOBデータ型でサポートされるファンクションと演算子が示されています。(LENGTHファンクションは、BLOBデータ型でもサポートされます。)

Oracle Databaseで提供されるDBMS_LOB PL/SQLパッケージでは、表16-1の「PL/SQL」列に示すように、ほとんどのファンクションでLOBの使用がサポートされます。

注意:
表16-1の「SQL」列が「いいえ」となっている演算子およびファンクションは、PL/SQLブロックで使用されるSQL問合せには機能しません。ただし、一部の演算子およびファンクションの場合は、PL/SQLコードでの直接使用がサポートされます。

CLOB型からCHAR型への暗黙的な変換

表16-1の「SQL」列または「PL/SQL」列が「CNV」となっているファンクションは、CLOBからVARCHAR2などの文字データ型に変換することで実行されます。SQL環境ではCLOBの最初の4KBのみが変換されて操作に使用され、PL/SQL環境ではCLOBの最初の32KBのみが変換されて操作に使用されます。

表16-1 LOBでのSQL VARCHAR2ファンクションおよび演算子

カテゴリ

演算子およびファンクション

SQLの例/コメント

SQL

PL/SQL

連結

||、CONCAT()

Select clobCol || clobCol2 from tab;

はい

はい

比較

=、!=、>、>=、<、<=、<>、^=

if clobCol=clobCol2 then...

いいえ

はい

比較

IN、NOT IN

if clobCol NOT IN (clob1, clob2, clob3) then...

いいえ

はい

比較

SOME、ANY、ALL

if clobCol < SOME (select clobCol2 from...) then...

いいえ

利用不可

比較

BETWEEN

if clobCol BETWEEN clobCol2 and clobCol3 then...

いいえ

はい

比較

LIKE [ESCAPE]

if clobCol LIKE '%pattern%' then...

はい

はい

比較

IS [NOT] NULL

where clobCol IS NOT NULL

はい

はい

文字関数

INITCAP、NLS_INITCAP

select INITCAP(clobCol) from...

CNV

CNV

文字関数

LOWER、NLS_LOWER、UPPER、NLS_UPPER

...where LOWER(clobCol1) = LOWER(clobCol2)

はい

はい

文字関数

LPAD、RPAD

select RPAD(clobCol, 20, ' La') from...

はい

はい

文字関数

TRIM、LTRIM、RTRIM

...where RTRIM(LTRIM(clobCol,'ab'), 'xy') = 'cd'

はい

はい

文字関数

REPLACE

select REPLACE(clobCol, 'orig','new') from...

はい

はい

文字関数

SOUNDEX

...where SOUNDEX(clobCOl) = SOUNDEX('SMYTHE')

CNV

CNV

文字関数

SUBSTR

...where substr(clobCol, 1,4) = 'THIS'

はい

はい

文字関数

TRANSLATE

select TRANSLATE(clobCol, '123abc','NC') from...

CNV

CNV

文字関数

ASCII

select ASCII(clobCol) from...

CNV

CNV

文字関数

INSTR

...where instr(clobCol, 'book') = 11

はい

はい

文字関数

LENGTH

...where length(clobCol) != 7;

はい

はい

文字関数

NLSSORT

...where NLSSORT (clobCol,'NLS_SORT = German') > NLSSORT ('S','NLS_SORT = German')

CNV

CNV

文字関数

INSTRB、SUBSTRB、LENGTHB

この3つのファンクションは、シングルバイト・キャラクタ・セットを使用するCLOBの場合にのみサポートされます。(LENGTHBは、CLOBと同様、BLOBについてもサポートされます。)

はい

はい

文字関数: 正規表現

REGEXP_LIKE

このファンクションは、文字列内でパターンを検索します。このファンクションを問合せのWHERE句で使用すると、指定した正規表現と一致する行が戻されます。

正規表現用のSQLファンクションの構文の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。データベースでの正規表現の使用方法は、『Oracle Databaseアドバンスト・アプリケーション開発者ガイド』を参照してください。

はい

はい

文字関数: 正規表現

REGEXP_REPLACE

このファンクションは文字列内でパターンを検索し、そのパターンの各出現箇所を指定したパターンで置き換えます。

はい

はい

文字関数: 正規表現

REGEXP_INSTR

このファンクションは、指定した正規表現パターンの出現箇所を文字列内で検索します。検索する出現箇所と検索開始位置を指定します。文字列内で一致が検出された位置を示す整数が戻されます。

はい

はい

文字関数: 正規表現

REGEXP_SUBSTR

このファンクションは、指定した正規表現パターンと一致する実際の部分文字列を戻します。

はい

はい

変換

CHARTOROWID

CHARTOROWID(clobCol)

CNV

CNV

変換

COMPOSE

COMPOSE('string')

CHAR、VARCHAR2、CLOB、NCHAR、NVARCHAR2およびNCLOBデータ型の文字列を与えると、Unicode文字列が返されます。ウムラウト・コードポイントで修飾されたoコード・ポイントは、oウムラウト・コード・ポイントとして返されます。

CNV

CNV

変換

DECOMPOSE

DECOMPOSE('str' [CANONICAL | COMPATIBILITY] )

Unicode文字の引数で有効です。入力と同じキャラクタ・セットで分解後にUnicode文字列を戻します。o-umlautコード・ポイントは、oのコード・ポイントの後にウムラウトのコード・ポイントを続けて戻されます。

CNV

CNV

変換

HEXTORAW

HEXTORAW(CLOB)

いいえ

CNV

変換

CONVERT

select CONVERT(clobCol,'WE8DEC','WE8HP') from...

はい

CNV

変換

TO_DATE

TO_DATE(clobCol)

CNV

CNV

変換

TO_NUMBER

TO_NUMBER(clobCol)

CNV

CNV

変換

TO_TIMESTAMP

TO_TIMESTAMP(clobCol)

いいえ

CNV

変換

TO_MULTI_BYTE

TO_SINGLE_BYTE

TO_MULTI_BYTE(clobCol)

TO_SINGLE_BYTE(clobCol)

CNV

CNV

変換

TO_CHAR

TO_CHAR(clobCol)

はい

はい

変換

TO_NCHAR

TO_NCHAR(clobCol)

はい

はい

変換

TO_LOB

INSERT INTO... SELECT TO_LOB(longCol)...

TO_LOBは、LONG列を持つ表をSELECT FROMに指定して、LOB列を持つ表を作成またはその表に挿入する場合にのみ使用できることに注意してください。

利用不可

利用不可

変換

TO_CLOB

TO_CLOB(varchar2Col)

はい

はい

変換

TO_NCLOB

TO_NCLOB(varchar2Clob)

はい

はい

集計ファンクション

COUNT

select count(clobCol) from...

いいえ

利用不可

集計ファンクション

MAX、MIN

select MAX(clobCol) from...

いいえ

利用不可

集計ファンクション

GROUPING

select grouping(clobCol) from... group by cube (clobCol);

いいえ

利用不可

他のファンクション

GREATEST、LEAST

select GREATEST (clobCol1, clobCol2) from...

いいえ

CNV

他のファンクション

DECODE

select DECODE(clobCol, condition1, value1, defaultValue) from...

CNV

CNV

他のファンクション

NVL

select NVL(clobCol,'NULL') from...

はい

はい

他のファンクション

DUMP

select DUMP(clobCol) from...

いいえ

利用不可

他のファンクション

VSIZE

select VSIZE(clobCol) from...

いいえ

利用不可

Unicode

INSTR2、SUBSTR2、LENGTH2、LIKE2

これらのファンクションは、UCS2コード・ポイント・セマンティクスを使用します。

いいえ

CNV

Unicode

INSTR4、SUBSTR4、LENGTH4、LIKE4

これらのファンクションは、UCS4コード・ポイント・セマンティクスを使用します。

いいえ

CNV

Unicode

INSTRC、SUBSTRC、LENGTHC、LIKEC

これらのファンクションは、完全なキャラクタ・セマンティクスを使用します。

いいえ

CNV

Unicodeサポート

Unicodeサポート用に、INSTR、SUBSTR、LENGTHおよびLIKEファンクションのバリエーションが用意されています。(これらのバリエーションの場合は、表16-1の「カテゴリ」列が「Unicode」となっています。)

関連項目:

- 『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』

- 『Oracle Databaseアドバンスト・アプリケーション開発者ガイド』

- 『Oracle Database SQL言語リファレンス』

- 『Oracle Databaseグローバリゼーション・サポート・ガイド』

詳細は、UNICODEの機能に関する説明を参照してください。

コードポイント・セマンティクス

表16-1に示したINSTR、SUBSTR、LENGTHおよびLIKEファンクションのコードポイント・セマンティクスは、ファンクションに渡される引数のデータ型に応じて異なります。これらのファンクションでは、次のように、引数がVARCHAR2型かCLOB型かに応じて、異なるコードポイント・セマンティクスが使用されます。

- 引数がCLOBの場合は、すべてのキャラクタ・セットにUCS2コードポイント・セマンティクスが使用されます。

- 引数がVARCHAR2などのキャラクタ・タイプの場合は、指定のキャラクタ・セットにデフォルトのコードポイント・セマンティクスが使用されます。

- AL16UTF16およびUTF8キャラクタ・セットにはUCS2コードポイント・セマンティクスが使用されます。

- AL32UTF8など、他のすべてのキャラクタ・セットにはUCS4コードポイント・セマンティクスが使用されます。

- 文字データをCLOBまたはNCLOBに格納している場合、CLOBやNCLOBに対してデータの読取りまたは書込みを行うすべてのAPIの量パラメータとオフセット・パラメータが、UCS2コードポイントで指定されることに注意してください。一部のキャラクタ・セットには、完全な1文字が、サロゲート・ペアと呼ばれる1つ以上のUCS2コードポイントで構成されるものがあります。この場合、指定した量またはオフセットが、完全な1文字に分かれないようにする必要があります。これは、文字の部分的な読取りや書込みを回避するためです。

- 10gから、Oracle Databaseではこのような場合に、読取り/書込み境界で半サロゲート・ペアを検出できます。読取りの場合、オフセットと量が適宜調整されて半分の文字が返されないようになり、その場合、戻される量は要求より少なくなります。書込みの場合はエラーが発生し、宛先のCLOBまたはNCLOBに部分的な文字を上書きして既存のデータを破損しないようにします。

LOBのSQLセマンティクスの戻り値

LOBまたはVARCHAR2を取るファンクションまたは演算子の戻り型は、そのファンクションや演算子に渡された引数のデータ型と同じです。

CONCATなど、2つ以上の引数を取るファンクションは、1つ以上の引数がLOBであればLOBデータ型を戻します。たとえば、CONCAT(CLOB, VARCHAR2)はCLOBを戻します。

関連項目:
CONCATファンクションと連結演算子(||)の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

LOBインスタンスは、常にLOBロケータを介してアクセスおよび操作されます。これは戻り値の場合も同じで、SQLファンクションと演算子は、戻り値がLOBインスタンスであればLOBロケータを戻します。

SQLファンクションから戻されるLOBインスタンスは、すべて一時LOBインスタンスです。SQLファンクションが問合せのSELECT構文のリストに使用されている場合にも、そのファンクションにより表内のLOBインスタンス(永続LOB)が変更されることはありません。

LOBに対するLENGTHの戻り値

LENGTHファンクションの戻り値は、渡された引数がLOBであるか文字列であるかに応じて異なります。

- 長さ0(ゼロ)の文字列が入力されると、LENGTHはNULLを戻します。

- 長さ0(ゼロ)のCLOBの場合、またはEMPTY_CLOB()の戻り値のように空のロケータの場合、LENGTHおよびDBMS_LOB.GETLENGTHファンクションはFALSEを戻します。

SQLでのLOBデータ型の暗黙的な変換

一部のLOBデータ型では暗黙的な変換がサポートされ、型間の割当てやパラメータの受渡しなどの操作に使用できます。このような変換はSQLレイヤーで処理され、LOB型を使用するすべてのクライアント・インタフェースで実行できます。

SQLでのCLOBデータ型とNCLOBデータ型の間の暗黙的な変換

データベースでは、CLOBデータ型とNCLOBデータ型の間で、型間の割当てや型間でのパラメータの受渡しなどの操作を実行できます。これらの型間での暗黙的な変換は、キャラクタ・セット・フォーマットなどのプロパティを保つために必要に応じて実行されます。

暗黙的な変換が発生すると、必要に応じて変換元LOBの各文字が変換先LOBのキャラクタ・セットに変更されることに注意してください。この場合にデータのサイズが大きいと、パフォーマンスが低下する可能性があります。変換先と変換元のキャラクタ・セットが同一であれば、パフォーマンスは低下しません。

CLOB型とNCLOB型の間で暗黙的な変換が発生した後、変換先LOBが一時LOBとして暗黙的に作成されます。この新しい一時LOBは、変換元LOBに依存しません。SELECT文で定義操作の一部として暗黙的な変換が発生する場合、次の例に示すように、変換先LOBの変更はそのLOBが選択された表内の永続LOBには影響しません。

SQL> -- check lob length before update
SQL> select dbms_lob.getlength(ad_sourcetext) from Print_media
2       where product_id=3106 and ad_id = 13001;

DBMS_LOB.GETLENGTH(AD_SOURCETEXT)
---------------------------------
205

SQL>
SQL> declare
2   clob1 clob;
3   amt number:=10;
4  BEGIN
5    -- select a clob column into a clob, no implicit convesion
6    SELECT ad_sourcetext INTO clob1 FROM Print_media
7      WHERE product_id=3106 and ad_id=13001 FOR UPDATE;
8
9    dbms_lob.trim(clob1, amt); -- Trim the selected lob to 10 bytes
10  END;
11  /

PL/SQL procedure successfully completed.

SQL> -- Modification is performed on clob1 which points to the
SQL> -- clob column in the table
SQL> select dbms_lob.getlength(ad_sourcetext) from Print_media
2       where product_id=3106 and ad_id = 13001;

DBMS_LOB.GETLENGTH(AD_SOURCETEXT)
---------------------------------
10

SQL>
SQL> rollback;

Rollback complete.

SQL> -- check lob length before update
SQL> select dbms_lob.getlength(ad_sourcetext) from Print_media
2       where product_id=3106 and ad_id = 13001;

DBMS_LOB.GETLENGTH(AD_SOURCETEXT)
---------------------------------
205

SQL>
SQL> declare
2   nclob1 nclob;
3   amt number:=10;
4  BEGIN
5
6    -- select a clob column into a nclob, implicit conversion occurs
7    SELECT ad_sourcetext INTO nclob1 FROM Print_media
8      WHERE product_id=3106 and ad_id=13001 FOR UPDATE;
9
10    dbms_lob.trim(nclob1, amt); -- Trim the selected lob to 10 bytes
11  END;
12  /

PL/SQL procedure successfully completed.

SQL> -- Modification to nclob1 does not affect the clob in the table,
SQL> -- because nclob1 is a independent temporary LOB

SQL> select dbms_lob.getlength(ad_sourcetext) from Print_media
2       where product_id=3106 and ad_id = 13001;

DBMS_LOB.GETLENGTH(AD_SOURCETEXT)
---------------------------------
205

関連項目:

- CLOB型とVARCHAR2型の間の暗黙的な変換に対するPL/SQLセマンティクスのサポートの詳細は、「CLOBとVARCHAR2の間の暗黙的な変換」を参照してください。

- BILEからLOBをロードする際の暗黙的なキャラクタ・セット変換の詳細は、「LOBでの暗黙的なキャラクタ・セット変換」を参照してください。

- すべてのデータ型に対してサポートされる暗黙的な変換の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

SQLでサポートされないLOBの使用

表16-2に、LOB列でサポートされないSQL操作を示します。

表16-2 SQLでサポートされないLOBの使用

サポートされないSQL操作

サポートされない使用方法の例

SELECT DISTINCT

SELECT DISTINCT clobCol from...

SELECT句

ORDER BY

SELECT... ORDER BY clobCol

SELECT句

GROUP BY

SELECT avg(num) FROM...

GROUP BY clobCol

UNION、INTERSECT、MINUS

(UNION ALLは、LOBに対して有効であることに注意してください。)

SELECT clobCol1 from tab1 UNION SELECT clobCol2 from tab2;

問合せの結合

SELECT... FROM... WHERE tab1.clobCol = tab2.clobCol

列の索引付け

CREATE INDEX clobIndx ON tab(clobCol)...

LOBのVARCHAR2およびRAWセマンティクス

VARCHAR2データ型とRAWデータ型で使用される次のセマンティクスは、LOBにも適用されます。

- CLOBでのCHARバッファの定義
CLOB列に対してVARCHAR2を、BLOB列に対してRAWを定義できます。また、VARCHAR2列とRAW列に対してCLOB型とBLOB型を定義できます。

- CHARバッファまたはVARCHAR2へのCLOB列の選択
CLOB列がVARCHAR2変数に選択されると、CLOB列に格納されたデータが取り出され、CHARバッファに格納されます。バッファがすべてのCLOBデータを格納できるほど大きくない場合、切捨てエラーが発生し、データはバッファに書き込まれません。SELECT操作が正常に完了すると、VARCHAR2変数は正規の文字バッファとして保持されます。

対照的に、CLOB列がローカルのCLOB変数に選択された場合、CLOBロケータがフェッチされます。

- RAWへのBLOB列の選択
BLOB列がRAW変数に選択されると、BLOBデータがRAWバッファにコピーされます。BLOBのサイズがバッファのサイズを超える場合は、切捨てエラーが発生し、データはバッファに書き込まれません。

SQLファンクションから戻されるLOB

SQLファンクションからLOBが戻される場合、結果として戻されるのは一時LOBです。アプリケーションでは、一時LOBを、SELECT操作によって戻されたデータ用のローカル記憶域として、次のように参照する必要があります。

- PL/SQLでは、一時LOBの存続期間は、他のローカルPL/SQLプログラム変数と同じです。後続のSQLまたはPL/SQLのVARCHAR2ファンクションまたは問合せに、PL/SQLのローカル変数として渡すことができます。一時LOBは、プログラム・ブロックの最後にスコープから抜け、LOBが解放されます。これらは、PL/SQLのVARCHAR2変数と同じセマンティクスです。ただし、随時DBMS_LOB.FREETEMPORARY()コールを使用して、ローカルの一時LOBが使用したリソースを解放できます。

注意:
SQL文によりLOBが戻される場合、またはLOBがPL/SQLファンクションまたはプロシージャのOUTパラメータである場合は、一時LOBであるかどうかテストし、一時LOBである場合には操作完了後に解放する必要があります。

- OCIでは、SQL問合せから戻された一時LOBは、常にセッションの存続期間中は存続します。ただし、ユーザー定義の存続期間が存在する場合、一時LOBはユーザー定義の存続期間中に存続します。

注意:

一時表領域が、プログラムの問合せから戻されるすべての一時LOB結果を格納するために十分大きいことを確認してください。

次に、CLOB列をVARCHAR2に選択し、結果を、宣言したサイズのCHARバッファとして戻す例を示します。

DECLARE
vc1 VARCHAR2(32000);
lb1 CLOB;
lb2 CLOB;
BEGIN
SELECT clobCol1 INTO vc1 FROM tab WHERE colID=1;
-- lb1 is a temporary LOB
SELECT clobCol2 || clobCol3 INTO lb1 FROM tab WHERE colID=2;

lb2 := vc1|| lb1;
-- lb2 is a still temporary LOB, so the persistent data in the database
-- is not modified. An update is necessary to modify the table data.
UPDATE tab SET clobCol1 = lb2 WHERE colID = 1;

DBMS_LOB.FREETEMPORARY(lb2); -- Free up the space taken by lb2

<... some more queries ...>

END; -- at the end of the block, lb1 is automatically freed

VARCHAR2とCLOBでのIS NULLとIS NOT NULLの使用方法

LOB列でIS NULL演算子とIS NOT NULL演算子を使用できます。LOBで使用すると、この2つの演算子によってLOBロケータが行に格納されているかどうかが判別されます。

注意:
SQL 92標準では、長さ0(ゼロ)の文字列は、NULL文字列とは区別されます。IS NULLの戻り値は、LOBを渡すかVARCHAR2を渡すかに応じて異なります。

- IS NULL関数に長さ0(ゼロ)の初期化済LOBを渡すと、0(ゼロ、FALSE)が戻されます。これらのセマンティクスは、SQL標準に準拠しています。

- IS NULL関数に長さ0(ゼロ)のVARCHAR2を渡すと、TRUEが戻されます。

LOBでのWHERE句の使用方法

WHERE句の条件には、LOB値を比較するファンクションを除き、引数としてLOBを取るSQLファンクションを使用できます。たとえば、WHERE句の条件にLENGTHファンクションを含めることができます。

CREATE TABLE t (n NUMBER, c CLOB);
INSERT INTO t VALUES (1, 'abc');

SELECT * FROM t WHERE c IS NOT NULL;
SELECT * FROM t WHERE LENGTH(c) > 0;
SELECT * FROM t WHERE c LIKE '%a%';
SELECT * FROM t WHERE SUBSTR(c, 1, 2) LIKE '%b%';
SELECT * FROM t WHERE INSTR(c, 'b') = 2;

リモートLOBおよびBFILE用の組込みファンクション

ネストしたファンクションによって戻される最終値がLOBでないかぎり、ローカルLOBとBFILEでサポートされるすべてのSQL組込みファンクションおよびユーザー定義型ファンクションは、リモートLOBとBFILEでもサポートされます。これには、リモートの永続および一時LOBとBFILE用のファンクションも含みます。

リモート・サイトで実行されるSQL組込みファンクションは、SELECT、INSERT、UPDATEおよびDELETEと同様に、SQL文内に含めることができます。次に例を示します。

SELECT LENGTH(ad_sourcetext) FROM print_media@remote_site -- CLOB
SELECT LENGTH(ad_fltextn) FROM print_media@remote_site;   -- NCLOB
SELECT LENGTH(ad_composite) FROM print_media@remote_site; -- BLOB
SELECT product_id from print_media@remote_site WHERE LENGTH(ad_sourcetext) > 3;

UPDATE print_media@remote_site SET product_id = 2 WHERE LENGTH(ad_sourcetext) > 3;

SELECT TO_CHAR(foo@dbs2(...)) FROM dual@dbs2;
-- where foo@dbs2 returns a temporary LOB

SQLファンクションは、次のカテゴリに分類されます(ただし、必ずしもこれに限定されません)。

1. LOBでサポートされていないSQLファンクション。これらのファンクションは、CLOBにのみ関連します。たとえばDECODEなどです。
これらのファンクションは、ローカルのLOBでサポートされないため、リモートのLOBではサポートされません。

2. 1つのLOB引数のみ(その他の引数は他のデータ型)を受け入れ、LOBを戻さないファンクション。これらのファンクションは、CLOB、NCLOBおよびBLOBのみに該当します。たとえばLENGTHであり、これはサポートされています。次に例を示します。

SELECT LENGTH(ad_composite) FROM print_media@remote_site;
SELECT LENGTH(ad_header.logo) FROM print_media@remote_site; -- LOB in object

SELECT product_id from print_media@remote_site WHERE LENGTH(ad_sourcetext) > 3;

3. LOBを戻すファンクション。これらのファンクションは、すべてCLOBおよびNCLOBのみに該当します。これらのファンクションは、元のLOBを戻すか、または一時LOBを生成する場合があります。これらのファンクションは、ローカル・サイトに戻される結果がLOBでないかぎり、リモート・サイトで実行できます。
一時LOBを戻すファンクションには、REPLACE、SUBSTR、CONCAT、||、TRIM、LTRIM、RTRIM、LOWER、UPPER、NLS_LOWER、NLS_UPPER、LPADおよびRPADがあります。

元のLOBロケータを戻すファンクションには、NVL、DECODEおよびCASEがあります。現在、DECODEおよびCASEではLOBの操作はサポートされていませんが、他のデータ型を操作でき、LOBを戻すことができます。

たとえば、次の文がサポートされています。

SELECT TO_CHAR(CONCAT(ad_sourcetext, ad_sourcetext)) FROM
print_media@remote_site;

SELECT TO_CHAR(SUBSTR(ad_fltextnfs, 1, 3)) FROM
print_media@remote_site;

しかし、次の文はサポートされていません。

SELECT CONCAT(ad_sourcetext, ad_sourcetext) FROM
print_media@remote_site;

SELECT SUBSTR(ad_sourcetext, 1, 3) FROM print_media@remote_site;

4. 1つ以上のLOB引数を受け入れるファンクション。
これらには、INSTR、LIKE、REPLACE、CONCAT、||、SUBSTR、TRIM、LTRIM、RTRIM、LPADおよびRPADがあります。これらのファンクションは、すべてCLOBおよびNCLOBのみに該当します。

すべてのLOBが同じdblink内にあり、戻される値がLOBでない場合にのみ、これらのファンクションがサポートされます。たとえば、次がサポートされています。

SELECT TO_CHAR(CONCAT(ad_sourcetext, ad_sourcetext)) FROM
print_media@remote_site; -- CLOB

SELECT TO_CHAR(CONCAT(ad_fltextn, ad_fltextn)) FROM
print_media@remote_site; -- NCLOB

しかし、次はサポートされていません。

SELECT TO_CHAR(CONCAT(a.ad_sourcetext, b.ad_sourcetext)) FROM
print_media@db1 a, print_media@db2 b WHERE a.product_id = b.product_id;

17 LOBに対するPL/SQLセマンティクス

この章の内容は次のとおりです。

- PL/SQL文およびPL/SQL変数

- CLOBとVARCHAR2の間の暗黙的な変換

- 明示的な変換ファンクション

- PL/SQL CLOBの比較規則

- リモートLOBおよびBFILE用のPL/SQLファンクション

PL/SQL文およびPL/SQL変数

PL/SQLでは、セマンティクスが変更されました。

注意:
特に指定のないかぎり、CLOBおよびVARCHAR2に関する次の説明は、BLOBおよびRAWにも該当します。説明では、BLOBおよびRAWについては特に記載しません。

この項の内容は次のとおりです。

- CLOBとVARCHAR2の間の暗黙的な変換

- 明示的な変換ファンクション

- PL/SQL組込みファンクションでのVARCHAR2およびCLOB

- PL/SQL CLOBの比較規則

CLOBとVARCHAR2の間の暗黙的な変換

PL/SQLでは、CLOBからVARCHAR2およびVARCHAR2からCLOBへの暗黙的なデータ型変換が可能です。これらの変換により、アプリケーションで次の操作を実行できます。

- VARCHAR2 PL/SQL変数へのCLOB列の選択

- CLOB変数へのVARCHAR2列の選択

- CLOBとVARCHAR2間の割当ておよびパラメータの受渡し

PL/SQLにおけるVARCHAR2としてのCLOBへのアクセス

次の例は、CLOBがVARCHAR2として処理された場合のCLOBデータへのアクセス方法を示します。

declare
myStoryBuf VARCHAR2(4001);
BEGIN
SELECT ad_sourcetext INTO myStoryBuf FROM print_media WHERE ad_id = 12001;
-- Display Story by printing myStoryBuf directly
END;
/

PL/SQLにおけるVARCHAR2へのCLOBの割当て

declare
myLOB CLOB;
BEGIN
SELECT 'ABCDE' INTO myLOB FROM print_media WHERE ad_id = 11001;
-- myLOB is a temporary LOB.
-- Use myLOB as a lob locator
DBMS_OUTPUT.PUT_LINE('Is temp? '||DBMS_LOB.ISTEMPORARY(myLOB));
END;
/

明示的な変換ファンクション

SQLおよびPL/SQLでは、LONGからLOBへの移行時に、次の明示的な変換ファンクションにより他のデータ型とCLOB、NCLOBおよびBLOB間のデータ型の変更が行われます。

- TO_CLOB(): VARCHAR2、NVARCHAR2またはNCLOBからCLOBへの変換。

- TO_NCLOB: VARCHAR2、NVARCHAR2またはCLOBからNCLOBへの変換。

- TO_BLOB(): RAWからBLOBへの変換。

- TO_CHAR(): CLOBからCHAR型への変換。このファンクションを使用して文字LOBをデータベース・キャラクタ・セットに変換する際、変換するLOB値がターゲットのデータ型よりも大きいと、データベースからエラーが返されます。暗黙的な変換でも、LOBデータが適合しない場合はエラーが発生します。

- TO_NCHAR()はNCLOB型をNCHAR型に変換します。このファンクションを使用して文字LOBを各国語キャラクタ・セットに変換する際、変換するLOB値がターゲットのデータ型よりも大きいと、データベースからエラーが返されます。暗黙的な変換でも、LOBデータが適合しない場合はエラーが発生します。

- CASTは、いずれのLOBデータ型も直接はサポートしていません。CASTを使用してCLOB値を文字データ型に変換する場合、NCLOB値を各国語キャラクタ・データ型に変換する場合、またはBLOB値をRAWデータ型に変換する場合に、データベースが暗黙的にLOB値を文字データまたはRAWデータに変換し、結果の値を明示的にターゲットのデータ型にキャストします。結果の値がターゲットのデータ型よりも大きい場合、データベースからエラーが返されます。

TO_NUMBER()などの他の明示的な変換ファンクションは、サポートされていません(表16-1「LOBでのSQL VARCHAR2ファンクションおよび演算子」を参照)。変換ファンクションの詳細は、第18章「LONGからLOBへの表列の移行」を参照してください。

PL/SQL組込みファンクションでのVARCHAR2およびCLOB

CLOBおよびVARCHAR2は、2つの個別の型です。ただし、使用方法によってはCLOBをSQLおよびPL/SQL VARCHAR2組込みファンクションに渡し、VARCHAR2と同様に使用できます。または、変数をDBMS_LOB APIに渡して、LOBロケータと同様に動作させることができます。次の、「PL/SQLのCLOB変数」の複合的な例を参照してください。

PL/SQL VARCHAR2ファンクションおよび演算子は、CLOBを引数またはオペランドとして取得できます。

VARCHAR2変数のサイズが、CLOBを戻すファンクションの結果、またはCLOB列に対するSELECTの結果を含むために十分大きくない場合はエラーが発生し、操作は実行されません。これは、VARCHAR2セマンティクスと一貫性があります。

PL/SQLのCLOB変数

1 declare
2   myStory CLOB;
3   revisedStory CLOB;
4   myGist VARCHAR2(100);
5   revisedGist VARCHAR2(100);
6 BEGIN
7  -- select a CLOB column into a CLOB variable
8  SELECT Story INTO myStory FROM print_media WHERE product_id=10;
9  -- perform VARCHAR2 operations on a CLOB variable
10 revisedStory := UPPER(SUBSTR(myStory, 100, 1));
11 -- revisedStory is a temporary LOB
12 -- Concat a VARCHAR2 at the end of a CLOB
13 revisedStory := revisedStory || myGist;
14 -- The following statement raises an error because myStory is
15 -- longer than 100 bytes
16 myGist := myStory;
17 END;

「PL/SQLのCLOB変数」の10行目で一時CLOBが暗黙的に作成され、revisedStory CLOBロケータによって指されていることに注意してください。現行のインタフェースでは、この行を次のように展開できます。

buffer VARCHAR2(32000)
DBMS_LOB.CREATETEMPORARY(revisedStory);
buffer := UPPER(DBMS_LOB.SUBSTR(myStory,100,1));
DBMS_LOB.WRITE(revisedStory,length(buffer),1, buffer);

13行目では、myGistが一時LOBの終わりに追加されます。これは、次の文と同じ影響があります。

DBMS_LOB.WRITEAPPEND(revisedStory, myGist, length(myGist));

場合によっては、PL/SQL文で暗黙的に作成された一時LOBは、以前に定義したLOBロケータの表現を変更できます。次の例について考えてみます。

ロケータとデータのリンケージの変更

1 declare
2 myStory CLOB;
3 amt number:=100;
4 buffer VARCHAR2(100):='some data';
5 BEGIN
6 -- select a CLOB column into a CLOB variable
7 SELECT Story INTO myStory FROM print_media WHERE product_id=10;
8 DBMS_LOB.WRITE(myStory, amt, 1, buf);
9 -- write to the persistent LOB in the table
10
11 myStory:= UPPER(SUBSTR(myStory, 100, 1));
12 -- perform VARCHAR2 operations on a CLOB variable, temporary LOB created.
13 -- Changes are not reflected in the database table from this point on.
14
15 update print_media set Story = myStory WHERE product_id = 10;
16 -- an update is necessary to synchronize the data in the table.
17 END;

7行目以降、myStoryは、print_media内の永続LOBを表します。

8行目のDBMS_LOB.WRITE()コールは、データを直接表に書き込みます。

UPDATE文は不要です。続いて11行目で一時LOBが作成されてmyStoryに割り当てられます。これは、myStoryはローカルのVARCHAR2変数のように使用されているためです。LOBロケータmyStoryは現在、新しく作成された一時LOBを指しています。

したがって、myStoryへの変更は、これ以降はデータベースに反映されません。変更をデータベース表へ伝播するには、UPDATE文が必要になります。以前は、永続LOBにUPDATEが必要なかったことに注意してください。

SELECTまたは割当ての結果としてプログラム・ブロックで作成された一時LOBは、PL/SQLブロック、ファンクションまたはプロシージャの終了時に自動的に解放されます。また、DBMS_LOB.CREATETEMPORARYで作成された一時LOBを解放してシステム・リソースおよび一時表領域を再生する必要があります。このためには、CLOB変数上のDBMS_LOB.FREETEMPORARYをコールします。

注意:
SQL文によりLOBが戻される場合、またはLOBがPL/SQLファンクションまたはプロシージャのOUTパラメータである場合は、一時LOBであるかどうかテストし、一時LOBである場合には操作完了後に解放する必要があります。

一時LOBの自動的および手動による解放

declare
Story1 CLOB;
Story2 CLOB;
StoryCombined CLOB;
StoryLower CLOB;
BEGIN
SELECT Story INTO Story1 FROM print_media WHERE product_ID = 1;
SELECT Story INTO Story2 FROM print_media WHERE product_ID = 2;
StoryCombined := Story1 || Story2; -- StoryCombined is a temporary LOB
-- Free the StoryCombined manually to free up space taken
DBMS_LOB.FREETEMPORARY(StoryCombined);
StoryLower := LOWER(Story1) || LOWER(Story2);
END; -- At the end of block, StoryLower is freed.

PL/SQL CLOBの比較規則

VARCHAR2と同様に、CLOBを他のCLOBやVARCHAR2と比較する場合、一連の規則によって比較が制御されます。規則は通常、「照合順番」といいます。Oracleでは、CHARおよびVARCHAR2は、CHARの空白埋めのため、順序がわずかに異なります。

VARCHAR2の照合順番に従うCLOB

通常、CLOBは、VARCHAR2と同じ照合順番に従います。つまり、CLOBを比較するとき、CLOBデータの内容をVARCHAR2バッファに取り出し、そのVARCHAR2を比較する場合と結果が一貫しています。このルールはCLOBとCLOB、CLOBとVARCHAR2、CLOBとCHARの比較などすべての場合に適用されます。

注意:
CLOBをCHAR文字列と比較するときは、CLOBのcharacterデータが必ず文字列と比較されます。同様に、2つのCLOBを比較する場合は、そのLOBロケータではなく、2つのCLOBのデータ・コンテンツが比較されます。

CLOBを、文字以外のデータまたはBLOBと比較する必要はありません。比較した場合はエラーが発生します。

リモートLOBおよびBFILE用のPL/SQLファンクション

ネストしたファンクションによって戻される最終値がLOBでないかぎり、リモート・サイトで実行され、リモートLOBとBFILEを操作する、組込みおよびユーザー定義型PL/SQLファンクションを使用できます。次に例を示します。

SELECT product_id FROM print_media@dbs2 WHERE foo@dbs2(ad_sourcetext, 'aa') > 0;
-- foo is a user-define function returning a NUMBER

DELETE FROM print_media@dbs2 WHERE DBMS_LOB.GETLENGTH@dbs2(ad_graphic) = 0;

リモートのユーザー定義型ファンクションの制限

1. SQLファンクションに適用される制限はここにも適用されます。

関連項目:
「リモートLOBおよびBFILE用の組込みファンクション」

2. 1つのdblink内のファンクションは、他のdblink内のLOBデータを操作できません。たとえば、次の文はサポートされていません。

SELECT a.product_id FROM print_media@dbs1 a, print_media@dbs2 b WHERE
CONTAINS@dbs1(b.ad_sourcetext, 'aa') > 0;

3. 1つの問合せブロックに、異なるdblinkの表およびファンクションを含めることはできません。たとえば、次の文はサポートされていません。

SELECT a.product_id FROM print_media@dbs2 a, print_media@dbs3 b
WHERE CONTAINS@dbs2(a.ad_sourcetext, 'aa') > 0 AND
foo@dbs3(b.ad_sourcetext) > 0;
--  foo is a user-defined function in dbs3

4. PL/SQLからのSQL文の発行以外、PL/SQL内からのリモートLOB操作の実行(DBMS_LOB)はサポートされていません。

PL/SQL、OCIおよびJDBC内のリモート・ファンクション

PL/SQL、OCIおよびJDBC内から実行される場合、前述のSQL文はすべて同様に機能します。追加機能はありません。

18 LONGからLOBへの列の移行

この章では、LONGデータ型を使用する表からLOBデータ型へと移行する手法について説明します。この章の内容は次のとおりです。

- LONG列からLOB列に移行するメリット

- LONG列からLOB列に移行するための事前条件

- utldtree.sqlを使用したアプリケーションの変更部分の判断

- LONGデータ型からLOBデータ型への表の変換

- LONGからLOBへのアプリケーションの移行

関連項目:
各種のプログラミング環境におけるLOBデータ型のサポートの詳細は、次の各章を参照してください。

- 第16章「SQLセマンティクスとLOB」

- 第17章「LOBに対するPL/SQLセマンティクス」

- 第20章「永続LOB用のデータ・インタフェース」

LONG列からLOB列に移行するメリット

表列をLONGデータ型からLOBデータ型に移行すると、次のようなメリットがあります。

注意:
この章で説明する手法を使用すると、次のいずれの変換も可能になります。

- LONG型の列からCLOB列またはNCLOB列への変換

- LONG RAW型の列からBLOB型の列への変換

特に明記しないかぎり、この章のLONGからLOBへの変換に関する説明は、これら2つのデータ型変換に適用されます。

様々なアプリケーション開発の使用例におけるLONGデータ型とLOBデータ型のセマンティクスには、次のような違いがあります。

- LONG型の列の数には制限があります。特定の表に含めることができるLONG型の列は1つのみです。表に含めるLOB型の列の数には制限がありません。

- LOB用のデータ・インタフェースを使用すると、LONGまたはLONG RAW列を含む表をレプリケートできます。LOB列ではレプリケートが許可されますが、LONG列とLONG RAW列ではサポートされません。データベースでは、LONGデータ型とLONG RAWデータ型を含む列はレプリケートされた表から省略されます。
表がレプリケートされている場合、または表にマテリアライズド・ビューがある場合にLONG列をLOBに変更するときは、手動でレプリカを修正する必要があります。

注意:

LOBをLONGに変換することはサポートされません。LOBに変換する前に、LONGとして維持する必要のある列がないことを確認してください。

LONG列からLOB列に移行するための事前条件

この項では、LONG列をLOB列に変換する前に満たす必要のある事前条件について説明します。

関連項目:
表を変換する前に「LONGからLOBへのアプリケーションの移行」を参照し、LOB列の制限がLOBへの変換の妨げとなるかどうかを判断してください。

LOBへの変換前のLONG列のドメイン索引削除

LONG列のドメイン索引は、LONG列をLOB列に変換する前に削除する必要があります。詳細は、「LONGデータ型からLOBデータ型に変換された列の索引」を参照してください。

LOBデータ型に変換する表のREDO領域の生成防止

LONG列の変換処理中にREDO領域が生成されると、パフォーマンスが低下することがあります。変換処理中の表に対するREDOがログに記録されるのは、表にLOGGINGが指定されている場合のみです。

また、LONGからLOBへ変換中の列に対するREDOがログに記録されるのは、LOB列の記憶特性がLOGGINGに指定されている場合のみです。LOB列のロギング設定(LOGGINGまたはNOLOGGING)は、LOBが作成された表領域から継承されます。

移行中のREDO領域の生成を回避するには、表を移行する前に次の手順に従います(構文はBNFです)。

1. 次の文を実行します。ALTER TABLE Long_tab NOLOGGING;

2. 次の文を実行します。ALTER TABLE Long_tab MODIFY (long_col CLOB [DEFAULT <default_val>]) LOB (long_col) STORE AS (NOCACHE NOLOGGING);
STORE AS句にNOLOGGINGを指定する場合は、NOCACHEも指定する必要があることに注意してください。

3. 次の文を実行します。ALTER TABLE Long_tab MODIFY LOB (long_col) (CACHE);

4. 次の文を実行します。ALTER TABLE Long_tab LOGGING;

5. 表およびLOB列を含む表領域のバックアップを作成します。

utldtree.sqlを使用したアプリケーションの変更部分の判断

rdbms/admin/utldtree.sqlユーティリティを使用すると、表をLONG型からLOB型の列に移行する場合に、アプリケーションで変更が必要な部分を判断できます。このユーティリティを使用すると、指定のオブジェクトに依存するすべてのオブジェクトを再帰的に参照できます。たとえば、LONG列を含む表に依存するオブジェクトをすべて参照できます。参照できるのは、権限があるオブジェクトのみです。

utldtree.sqlの使用方法は、utldtree.sqlファイル内に記載されています。また、utldtree.sqlが必要となるのはPL/SQLの場合のみです。SQLおよびOCIの場合は、アプリケーションを変更する必要はありません。

LONGデータ型からLOBデータ型への表の変換

この項では、既存の表をLONGデータ型からLOBデータ型へ移行する方法を説明します。この項の内容は次のとおりです。

- ALTER TABLEを使用したLONG列からLOB列への変換

- TO_LOB演算子を使用したLONGからLOB列へのコピー

- LONG列を含む表のオンライン再定義(高可用性が重要な場合)

- Oracle Data Pumpを使用したデータベースの移行(このユーティリティを使用して変換が可能な場合)

ALTER TABLEを使用したLONG列からLOB列への変換

SQLのALTER TABLE文を使用すると、LONG列からLOB列に変換できます。そのためには、次の構文を使用します。

ALTER TABLE [<schema>.]<table_name>
MODIFY ( <long_column_name> { CLOB | BLOB | NCLOB }
[DEFAULT <default_value>]) [LOB_storage_clause];

たとえば、次のように作成された表があるとします。

CREATE TABLE Long_tab (id NUMBER, long_col LONG);

この例では、次のALTER TABLE文を使用して、Long_tab表のlong_col列をCLOBデータ型に変更できます。

ALTER TABLE Long_tab MODIFY ( long_col CLOB );

注意:
ALTER TABLE文は、表の内容を新しい領域にコピーし、操作の終了時に古い領域を解放します。このため、必要な領域が一時的に2倍になります。

ALTER TABLE文を使用してLONG列をLOB列に変換する場合、次のオプションのみが許可されていることに注意してください。

- DEFAULT: LOB列のデフォルト値を指定できます。

- LOB_storage_clause: 変換する列のLOB記憶特性を指定できます。このオプションはMODIFY句に指定できます。

LONG列をLOB型の列に変換する場合、ALTER TABLE文の他のオプションは使用できません。

移行時の問題

移行については、次の一般的な問題があります。

- 以前のLONG列に対するすべての制約は、新しいLOB列においても保持されます。LONG列で有効な制約は、NULLおよびNOT NULLのみです。これらの列に対する制約、またはこの表の他の列やプロパティを変更するには、移行後にALTER TABLE文を使用します。

- デフォルト値を指定しない場合、LONG列のデフォルト値がLOB列のデフォルト値となります。

- 表に対するほとんどの既存のトリガーは引き続き使用できますが、UPDATE OFトリガーで問題が発生する可能性があります。詳細は、「LONGからLOBへのアプリケーションの移行」を参照してください。

TO_LOB演算子を使用したLONGからLOB列へのコピー

前述のようにALTER TABLEを使用しない場合は、LONG列に対してTO_LOB演算子を使用し、LONG列をLOB列にコピーできます。CREATE TABLE AS SELECT文またはINSERT AS SELECT文でTO_LOB演算子を使用すると、LONG列からCLOB列またはNCLOB列に、またはLONG RAW列からBLOB列にデータをコピーできます。たとえば、LONG列を含む表が次のように作成されているとします。

CREATE TABLE Long_tab (id NUMBER, long_col LONG);

次の文を使用すると、列をLOB列にコピーできます。

CREATE TABLE Lob_tab (id NUMBER, clob_col CLOB);
INSERT INTO Lob_tab SELECT id, TO_LOB(long_col) FROM long_tab;
COMMIT;

INSERTがエラーを戻す場合は(UNDO用の領域がなかった場合)、WHERE句を使用してLONGデータを少しずつLOB列に移行できます。データが正確にコピーされていることを確認した後、元の表を削除し、次のどちらかの手順を使用して新しい表のビューまたはシノニムを作成できます。

DROP TABLE Long_tab;
CREATE VIEW Long_tab (id, long_col) AS SELECT * from Lob_tab;

または

DROP TABLE Long_tab;
CREATE SYNONYM Long_tab FOR Lob_tab;

この一連の操作は、Long_tab表のLong_col列のデータ型をLONGからCLOBに変更する操作と同じです。この方法を使用する場合は、新しい表の制約、トリガー、権限付与および索引を再作成する必要があります。

TO_LOB演算子の使用には、次のような制限事項があることに注意してください。

- TO_LOBを使用してデータをLOB列にコピーできますが、オブジェクト型のLOB属性にはコピーできません。

- TO_LOBはリモート表に使用できません。たとえば、次の文は機能しません。

INSERT INTO tb1@dblink (lob_col) SELECT TO_LOB(long_col) FROM tb2;
INSERT INTO tb1 (lob_col) SELECT TO_LOB(long_col) FROM tb2@dblink;
CREATE TABLE tb1 AS SELECT TO_LOB(long_col) FROM tb2@dblink;

- 索引構成表の作成時に、CREATE TABLE AS SELECT文でTO_LOB演算子を使用して、LONGまたはLONG RAW列をLOB列に変換することはできません。
この制限事項を回避するには、索引構成表を作成してから、TO_LOB演算子を使用してLONG列またはLONG RAW列のINSERT AS SELECTを実行します。

- どのPL/SQLブロックの中でもTO_LOBを使用できません。

LONG列を含む表のオンライン再定義

LONG列およびLONG RAW列を含む表は、表のオンライン再定義を使用して移行できます。この方法は、高可用性が重要なデータベース表のLONG列を移行する場合に適しています。

この方法を使用するには、次のように、再定義処理中にLONG列をLOB型に変換する必要があります。

- LONG列をCLOB列またはNCLOB列に変換します。

- LONG RAW列をBLOB列に変換します。

この変換を実行するには、DBMS_REDEFINITION.START_REDEF_TABLE()プロシージャの列マッピングにTO_LOB()演算子を使用します。

注意:
LONG列またはLONG RAW列を含む表のオンライン再定義を実行するには、この項で説明するように各列をLOB型に変換する必要があります。

次のリストに、オンライン再定義処理に関係する一般タスクを示します。LONG列とLONG RAW列の変換に固有の問題については、該当する箇所で説明します。ここで説明しないオンライン再定義処理の詳細は、この項の最後に示す関連マニュアルを参照してください。

- 空の仮表を作成します。再定義処理が完了すると、この表には移行済のデータが保持されます。この仮表で次の操作を行います。

- 移行元の表にあるLONG列ごとにCLOB列またはNCLOB列を定義します。

- 移行元の表にあるLONG RAW列ごとにBLOB列を定義します。

- 再定義処理を開始します。そのためには、次のように、DBMS_REDEFINITION.START_REDEF_TABLEをコールし、TO_LOB演算子を使用して列マッピングを渡します。

DBMS_REDEFINITION.START_REDEF_TABLE(
'schema_name',
'original_table',
'interim_table',
'TO_LOB(long_col_name) lob_col_name',
'options_flag',
'orderby_cols');

long_col_nameは元の表で変換するLONG列またはLONG RAW列の名前で、lob_col_nameは仮表のLOB列の名前です。このLOB列に変換後のデータが保持されます。

- DBMS_REDEFINITION.COPY_TABLE_DEPENDENTSプロシージャをコールします。詳細は、関連マニュアルを参照してください。

- DBMS_REDEFINITION.FINISH_REDEF_TABLEプロシージャをコールします。詳細は、関連マニュアルを参照してください。

パラレル・オンライン再定義

パラレル実行に十分なリソースがあるシステムでは、LONG列のLOB列への再定義は、次の条件下でパラレルに実行できます。

挿入先の表がパーティション化されていない場合:

- 挿入先の表にLOB列を格納するために使用されるセグメントが、自動セグメント領域管理(ASSM)が使用可能になっている(現在のデフォルト)ローカル管理表領域に属している。

- 1つのLONG列から1つのLOB列への単純なマッピングが存在し、挿入先の表には1つのLOB列のみがある。

挿入先の表がパーティション化されている場合、パーティション化に通常使用されるパラレル実行方法が適用されます。挿入先の表がパーティション化されている場合、オンライン再定義がパラレルに実行されます。

オンライン再定義の例

次の例に、LOB列を使用したオンライン再定義を示します。

REM Grant privileges required for online redefinition.
GRANT execute ON DBMS_REDEFINITION TO pm;
GRANT ALTER ANY TABLE TO pm;
GRANT DROP ANY TABLE TO pm;
GRANT LOCK ANY TABLE TO pm;
GRANT CREATE ANY TABLE TO pm;
GRANT SELECT ANY TABLE TO pm;

REM Privileges required to perform cloning of dependent objects.
GRANT CREATE ANY TRIGGER TO pm;
GRANT CREATE ANY INDEX TO pm;

connect pm/passwd

drop table cust;
create table cust(c_id   number primary key,
c_zip  number,
c_name varchar(30) default null,
c_long long
);
insert into cust values(1, 94065, 'hhh', 'ttt');

-- Creating Interim Table
-- There is no requirement to specify constraints because they are
-- copied over from the original table.
create table cust_int(c_id   number not null,
c_zip  number,
c_name varchar(30) default null,
c_long clob
);

declare
col_mapping varchar2(1000);
BEGIN
--  map all the columns in the interim table to the original table
col_mapping :=
'c_id             c_id  , '||
'c_zip            c_zip , '||
'c_name           c_name, '||
'to_lob(c_long)   c_long';

dbms_redefinition.start_redef_table('pm', 'cust', 'cust_int', col_mapping);
END;
/

declare
error_count pls_integer := 0;
BEGIN
dbms_redefinition.copy_table_dependents('pm', 'cust', 'cust_int',
1, true, true, true, false,
error_count);

dbms_output.put_line('errors := ' || to_char(error_count));
END;
/

exec  dbms_redefinition.finish_redef_table('pm', 'cust', 'cust_int');

-- Drop the interim table
drop table cust_int;

desc cust;

-- The following insert statement fails. This illustrates
-- that the primary key constraint on the c_id column is
-- preserved after migration.

insert into cust values(1, 94065, 'hhh', 'ttt');

select * from cust;

関連項目:
この項で前述した再定義処理の詳細は、次の関連マニュアルを参照してください。

- 表のオンライン再定義の手順の詳細および例については、『Oracle Database管理者ガイド』を参照してください。

- DBMS_REDEFINITIONパッケージ内のプロシージャの構文および使用方法の詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

Oracle Data Pumpを使用したデータベースの移行

新規データベースへの移行の一環としてデータをエクスポートする場合は、移行先データベースにLOB列を持つ表を作成し、データ・ポンプによりLONG-to-LOBファンクションを暗黙的にコールします。

Oracle Data Pumpの使用方法の詳細は、『Oracle Databaseユーティリティ』を参照してください。

LONGからLOBへのアプリケーションの移行

この項では、アプリケーションの移行計画に影響したり、アプリケーションの変更を必要とする、LONGデータ型とLOBデータ型の違いについて説明します。

PL/SQL環境とOCI環境でLONGデータ型に使用するほとんどのAPIは、LOBデータ型にも使用できるように拡張されています。これらのAPIをまとめて、永続LOB用のデータ・インタフェースまたは単にデータ・インタフェースと呼びます。データ・インタフェースには、特に次のようなメリットがあります。

- LONGデータ型からLOBデータ型に変換された列を含む表を使用するPL/SQLおよびOCIアプリケーションでは、アプリケーションの変更が最小限ですみます。

- LOBロケータを扱わずにアプリケーションでLOBデータ型を使用できます。

関連項目:

- データ・インタフェースに組み込まれているPL/SQL APIとOCI APIの詳細は、第20章「永続LOB用のデータ・インタフェース」を参照してください。

- LOBデータ型に対してサポートされるSQL構文の詳細は、第16章「SQLセマンティクスとLOB」を参照してください。

- LOBデータ型に対してサポートされるPL/SQL構文の詳細は、第17章「LOBに対するPL/SQLセマンティクス」を参照してください。

クラスタ化表で使用できないLOB列

クラスタ化表には、LOB列は作成できませんが、LONGは作成できます。表がクラスタの一部である場合、LONG列またはLONG RAW列はLOB列に変更できません。

AFTER UPDATE OFトリガーに使用できないLOB列

AFTER UPDATE OFトリガーのUPDATE OFリストには、LOB列を作成できません。LONG列は、この種のトリガーに作成できます。たとえば、次のCREATE TRIGGER文は無効です。

CREATE TABLE t(lobcol CLOB);
CREATE TRIGGER trig AFTER UPDATE OF lobcol ON t ...;

他のすべてのトリガーはLOB列で機能します。

LONGデータ型からLOBデータ型に変換された列の索引

移行する表の列の索引は、LONG列をLOB列に変換した後に手動で再作成する必要があります。これには、ファンクション索引が含まれます。

LONG列のファンクション索引は、変換処理中は使用できなくなり、変換後に再作成する必要があります。ファンクション索引を使用するアプリケーション・コードは、変換後もそのまま動作します。

LONG列のドメイン索引は、LONG列をLOB列に変換する前に削除する必要があることに注意してください。変換後にドメイン索引を再作成できます。

変換後に索引を再作成する手順は、次のとおりです。

1. 次のように、元の表から索引を選択します。

SELECT index_name FROM user_indexes WHERE table_name='LONG_TAB';

注意:
この問合せでは、表名を大文字で指定する必要があります。

2. 選択した索引に対して次のコマンドを使用します。

ALTER INDEX <index> REBUILD

空のLOBとNULLまたは長さが0(ゼロ)のLONGの違い

LOB列には、空のLOBを保持できます。空のLOBとは、完全に初期化済でデータが移入されていないLOBロケータです。LONGデータ型ではロケータが使用されないため、LONGデータ型には「空」という概念が適用されません。

LOB列値とLONG列値はどちらも、初期値としてNULLまたは空の文字列リテラルが挿入された場合は、NULL値を持ちます。そのため、LONG列にNULLまたは長さ0(ゼロ)の値を使用するアプリケーション・コードは、列をLOB型に変換した後も同様に動作します。

対照的に、空として初期化されたLOBは、次の例に示すようにNULL以外の値を持ちます。

CREATE TABLE long_tab(id NUMBER, long_col LONG);
CREATE TABLE lob_tab(id NUMBER, lob_col CLOB);

INSERT INTO long_tab values(1, NULL);

REM     A zero length string inserts a NULL into the LONG column:
INSERT INTO long_tab values(1, '');

INSERT INTO lob_tab values(1, NULL);

REM     A zero length string inserts a NULL into the LOB column:
INSERT INTO lob_tab values(1, '');

REM     Inserting an empty LOB inserts a non-NULL value:
INSERT INTO lob_tab values(1, empty_clob());

DROP TABLE long_tab;
DROP TABLE lob_tab;

アンカー型でのオーバーロード

アンカー型を使用したアプリケーションでは、LOBへの変換中に、オーバーロードされた変数が別のターゲットに解決される場合があります。たとえば、pプロシージャが指定1および2でオーバーロードされるとします。

procedure p(l long) is ...;       -- (specification 1)
procedure p(c clob) is ...;       -- (specification 2)

また、次のプロシージャ・コールが使用されるとします。

declare
var  longtab.longcol%type;
BEGIN
...
p(var);
...
END;

LONG列からLOB列に移行する前に、このコールにより指定1に解決されます。longtabがLOB列に移行すると、このコールは指定2に解決されます。これは、指定1のパラメータの型がCHAR、VARCHAR2、RAW、LONG RAWの場合も同じであることに注意してください。

表をLONG列からLOB列に移行した後、アプリケーションを手動で検査し、オーバーロードされたプロシージャの変更が必要かどうかを判断する必要があります。

移行前にLOB引数を取るオーバーロードされたプロシージャが含まれていたアプリケーションは、正常に動作しなくなる場合があります。これには、LONGのアンカー型を使用しないアプリケーションも含まれます。たとえば、pプロシージャに対する次の指定(1および2)とプロシージャ・コールを考えてみます。

procedure p(n number) is ...;       -- (1)
procedure p(c clob) is ...;         -- (2)

p('123');                 -- procedure call

移行前には、CHARからNUMBERへの変換のみが可能であったため、指定1が選択されていました。移行後では、両方の変換が可能なため、コールの解釈が不明確になり、オーバーロード・エラーが発生します。

LOBデータ型に対してサポートされない一部の暗黙的変換

PL/SQLでは、NUMBER、DATE、ROW_ID、BINARY_INTEGERおよびPLS_INTEGERデータ型からLONGへの暗黙的な変換が許可されますが、これらのデータ型からLOBへの暗黙的な変換は許可されません。

アプリケーションでこの種の暗黙的な変換を使用する場合、文字データにはTO_CHAR演算子、バイナリ・データにはTO_RAW演算子を使用して、これらの型を明示的に変換する必要があります。たとえば、アプリケーションに次のような割当て操作があるとします。

number_var := long_var;  -- The RHS is a LOB variable after converting.

この場合は、コードを次のように変更する必要があります。

number_var := TO_CHAR(long_var);
-- Assuming that long_var is of type CLOB after conversion

LOB型の場合、次の変換はサポートされません。

- BLOBからVARCHAR2、CHARまたはLONG

- CLOBからRAWまたはLONG RAW

これは、暗黙的な変換が発生する操作すべてに適用されます。たとえば、アプリケーションに次のようなSELECT文があるとします。

SELECT long_raw_column INTO my_varchar2 VARIABLE FROM my_table

この場合、表の変換後にlong_raw_columnがBLOBになると、SELECT文でエラーが生成されます。この変換を機能させるには、次のように、TO_RAW演算子を使用してBLOBをRAWに明示的に変換する必要があります。

SELECT TO_RAW(long_raw_column) INTO my_varchar2 VARIABLE FROM my_table

CLOBをRAW変数に選択する場合、CLOBをRAWに割り当てる場合、およびBLOBをVARCHAR2に割り当てる場合も同様です。

第V部

LOB APIの使用

第V部では、サポートされている環境におけるLOB APIの使用方法の詳細を説明します。LOB APIの使用例も示します。

この部の構成は、次のとおりです。

- 第19章「永続LOBに固有の操作と一時LOBに固有の操作」

- 第20章「永続LOB用のデータ・インタフェース」

- 第22章「LOB APIの使用」

- 第21章「BFILE操作用のLOB API」

19 永続LOBに固有の操作と一時LOBに固有の操作

この章では、永続LOBインスタンスと一時LOBインスタンスの間で異なるLOB操作について説明します。この章の内容は次のとおりです。

- 永続LOBの操作

- 一時LOBの操作

- PL/SQLにおける永続LOBと一時LOBの作成

- OCIでの一時LOBの解放

関連項目:

- 第22章「LOB APIの使用」では、一時LOBまたは永続LOBで使用できるLOB APIの詳細と使用例を示します。

- 第21章「BFILE操作用のLOB API」では、BFILEを操作するLOB APIの詳細と使用例を示します。

永続LOBの操作

この項では、永続LOBにのみ適用される操作について説明します。

表へのLOBの挿入

第15章「LOBに対するDDL文とDML文」で説明した任意のメソッドを使用して、永続LOB列にLOBインスタンスを挿入できます。

表からのLOBの選択

他のデータ型の場合と同様に、永続LOBを表から選択できます。次の例では、様々な型の永続LOBインスタンスがPL/SQL変数に選択されます。

declare
blob1 BLOB;
blob2 BLOB;
clob1 CLOB;
nclob1 NCLOB;
BEGIN
SELECT ad_photo INTO blob1 FROM print_media WHERE Product_id = 2268
FOR UPDATE;
SELECT ad_photo INTO blob2 FROM print_media WHERE Product_id = 3106;

SELECT ad_sourcetext INTO clob1 FROM Print_media
WHERE product_id=3106 and ad_id=13001 FOR UPDATE;

SELECT ad_fltextn INTO nclob1 FROM Print_media
WHERE product_id=3060 and ad_id=11001 FOR UPDATE;

END;
/
show errors;

一時LOBの操作

この項では、一時LOBインスタンスにのみ適用される操作について説明します。

一時LOBの作成と解放

一時LOBインスタンスを作成するには、指定したLOBデータ型の変数を宣言し、その変数をCREATETEMPORARY APIに渡す必要があります。一時LOBインスタンスは、スコープ外になるか、セッションが終了するか、またはインスタンスを明示的に解放するまで、アプリケーションに存在します。システム・リソースを解放するために、一時LOBインスタンスを解放することをお薦めします。

次の例に、PL/SQL環境でDBMS_LOBパッケージを使用して一時LOBを作成し、解放する方法を示します。

declare
blob1 BLOB;
blob2 BLOB;
clob1 CLOB;
nclob1 NCLOB;
BEGIN
-- create temp LOBs
DBMS_LOB.CREATETEMPORARY(blob1,TRUE, DBMS_LOB.SESSION);
DBMS_LOB.CREATETEMPORARY(blob2,TRUE, DBMS_LOB.SESSION);
DBMS_LOB.CREATETEMPORARY(clob1,TRUE, DBMS_LOB.SESSION);
DBMS_LOB.CREATETEMPORARY(nclob1,TRUE, DBMS_LOB.SESSION);

-- fill with data
writeDataToLOB_proc(blob1);
writeDataToLOB_proc(blob2);

-- CHAR->LOB conversion
clob1 := 'abcde';
nclob1 := TO_NCLOB(clob1);

-- Other APIs
call_lob_apis(blob1, blob2, clob1, nclob1);

-- free temp LOBs
DBMS_LOB.FREETEMPORARY(blob1);
DBMS_LOB.FREETEMPORARY(blob2);
DBMS_LOB.FREETEMPORARY(clob1);
DBMS_LOB.FREETEMPORARY(nclob1);

END;
/
show errors;

PL/SQLにおける永続LOBと一時LOBの作成

次のコード例に、PL/SQLで永続LOBと一時LOBを作成する方法を示します。このコードは次のデモ・ファイルに含まれています。

$ORACLE_HOME/rdbms/demo/lobs/plsql/lobdemo.sql

このデモ・ファイルは、他のLOB APIの使用方法を示す別のPL/SQLファイル内のプロシージャもコールします。これらのファイルのリストと関連LOB APIの詳細情報の参照先については、「PL/SQLのLOBデモ・ファイル」を参照してください。

-----------------------------------------------------------------------------
-------------------------  Persistent LOB operations ------------------------
-----------------------------------------------------------------------------

declare
blob1 BLOB;
blob2 BLOB;
clob1 CLOB;
nclob1 NCLOB;
BEGIN
SELECT ad_photo INTO blob1 FROM print_media WHERE Product_id = 2268
FOR UPDATE;
SELECT ad_photo INTO blob2 FROM print_media WHERE Product_id = 3106;

SELECT ad_sourcetext INTO clob1 FROM Print_media
WHERE product_id=3106 and ad_id=13001 FOR UPDATE;

SELECT ad_fltextn INTO nclob1 FROM Print_media
WHERE product_id=3060 and ad_id=11001 FOR UPDATE;

call_lob_apis(blob1, blob2, clob1, nclob1);
rollback;
END;
/
show errors;

-----------------------------------------------------------------------------
-------------------------  Temporary LOB operations ------------------------
-----------------------------------------------------------------------------

declare
blob1 BLOB;
blob2 BLOB;
clob1 CLOB;
nclob1 NCLOB;
BEGIN
-- create temp LOBs
DBMS_LOB.CREATETEMPORARY(blob1,TRUE, DBMS_LOB.SESSION);
DBMS_LOB.CREATETEMPORARY(blob2,TRUE, DBMS_LOB.SESSION);
DBMS_LOB.CREATETEMPORARY(clob1,TRUE, DBMS_LOB.SESSION);
DBMS_LOB.CREATETEMPORARY(nclob1,TRUE, DBMS_LOB.SESSION);

-- fill with data
writeDataToLOB_proc(blob1);
writeDataToLOB_proc(blob2);

-- CHAR->LOB conversion
clob1 := 'abcde';
nclob1 := TO_NCLOB(clob1);

-- Other APIs
call_lob_apis(blob1, blob2, clob1, nclob1);

-- free temp LOBs
DBMS_LOB.FREETEMPORARY(blob1);
DBMS_LOB.FREETEMPORARY(blob2);
DBMS_LOB.FREETEMPORARY(clob1);
DBMS_LOB.FREETEMPORARY(nclob1);

END;
/
show errors;

OCIでの一時LOBの解放

OCIプログラムがSQLまたはPL/SQLからLOBロケータを取得するたびに、ロケータが一時的なものであることを確認します。一時的なものである場合は、アプリケーションがロケータの使用を完了したら、そのロケータを解放します。ロケータは、アウトバインドまたは選択中の定義から取得されます。一時LOB期間は、クライアント側に送信されると常にセッションにアップグレードされます。アプリケーションでは、そのロケータが次の行のロケータによって上書きされる前に、次の処理が必要です。

OCILobIsTemporary(env, err, locator, is_temporary);
if(is_temporary)
OCILobFreeTemporary(svc, err, locator);

関連項目:
『Oracle Call Interfaceプログラマーズ・ガイド』の第16章のLOB関数に関する項

20 永続LOB用のデータ・インタフェース

この章の内容は次のとおりです。

- 永続LOB用のデータ・インタフェースの概要

- 永続LOB用のデータ・インタフェースを使用するメリット

- PL/SQLにおける永続LOB用のデータ・インタフェースの使用

- OCIにおける永続LOB用のデータ・インタフェースの使用

- Javaにおける永続LOB用のデータ・インタフェースの使用

- リモートLOB用データ・インタフェースの使用

永続LOB用のデータ・インタフェースの概要

永続LOB用のデータ・インタフェースには、LOBデータ型を処理するように拡張された一連のJava API、PL/SQL APIおよびOCI APIが組み込まれています。これらのAPIは、当初はLONG、LONG RAWおよびVARCHAR2などのレガシー・データ型用に設計されましたが、表20-1と表20-2に示す対応するLOBデータ型にも使用できます。この2つの表で、「バインド型または定義型」列はレガシー・データ型を示し、「LOB列の型」列は対応するサポート対象のLOBデータ型を示します。LOB用のデータ・インタフェースを使用すると、対応するレガシー・データ型に格納されている場合と同様に、文字データとバイナリ・データをLOB列に格納して操作できます。

注意:
データ・インタフェースは、オブジェクトの属性であるLOBのみでなくLOB列に対しても機能します。この章では、「LOB列」とはLOB列およびLOB属性を意味します。
配列のバインドおよび定義インタフェースを使用すると、複数の行を1回のラウンドトリップで挿入および選択できます。

簡潔にするために、この章では文字データ型を中心に説明しますが、表20-1と表20-2に示す文字データ型とバイナリ・データ型のフル・セットにも同じ概念が適用されます。これらの表では、CLOBはNCLOBも意味しています。

表20-1 SQLとPL/SQLでの対応するLONGデータ型とLOBデータ型

バインド型または定義型

LOB列の型

格納するデータ

CHAR

CLOB

文字データ

LONG

CLOB

文字データ

VARCHAR2

CLOB

文字データ

LONG RAW

BLOB

バイナリ・データ

RAW

BLOB

バイナリ・データ

表20-2 OCIでの対応するLONGデータ型とLOBデータ型

バインド型または定義型

LOB列の型

格納するデータ

SQLT_AFC(n)

CLOB

文字データ

SQLT_CHR

CLOB

文字データ

SQLT_LNG

CLOB

文字データ

SQLT_VCS

CLOB

文字データ

SQLT_BIN

BLOB

バイナリ・データ

SQLT_LBI

BLOB

バイナリ・データ

SQLT_LVB

BLOB

バイナリ・データ

永続LOB用のデータ・インタフェースを使用するメリット

永続LOB用のデータ・インタフェースを使用すると、次のメリットがあります。

- アプリケーションでLONGデータ型を使用する場合は、既存のアプリケーションへの変更をまったく、またはほとんど必要とせずにLOBデータ型で同じアプリケーションを使用できます。そのためには、第18章「LONGからLOBへの列の移行」で説明しているように、単に表のLONGデータ型列をLOBデータ型列に変換します。

- 逐次アクセス技法を使用するOCIアプリケーションの場合は、パフォーマンスが向上します。データ・インタフェースを使用してピース単位のINSERTまたはフェッチを実行すると、OCILobRead2()やOCILobWrite2()などのOCI関数を使用する場合と同様のパフォーマンスが得られます。データ・インタフェースを使用すると、1回のOCIコールでLOBに4KBを超えるデータを挿入できるため、サーバーへのラウンドトリップを削減できます。

- 最初にLOBロケータをフェッチしてからOCILobRead2()をコールするかわりに、1回のOCIStmtFetch()コールでLOBデータを読み取ることができます。これにより、LOBデータを最初から読み取る場合のパフォーマンスが向上します。

- 配列のバインドおよび定義インタフェースを使用すると、LOBを含む複数の行を1回のラウンドトリップで挿入および選択できます。

PL/SQLにおける永続LOB用のデータ・インタフェースの使用

このデータ・インタフェースを使用すると、表20-1に示すLONGデータ型とLOBデータ型を使用して、PL/SQLで次の操作を実行できます。

- VARCHAR2、CHARまたはLONGなどのデータ型で格納された文字データをCLOB列にINSERTまたはUPDATEします。

- RAWまたはLONG RAWなどのデータ型で格納されたバイナリ・データをBLOB列にINSERTまたはUPDATEします。

- CLOB列でSELECT文を使用して、データをCHAR、LONGまたはVARCHAR2などの文字バッファ変数に選択します。

- BLOB列でSELECT文を使用して、データをRAWやLONG RAWなどのバイナリ・バッファ変数に選択します。

- CLOBとVARCHAR2、CHARまたはLONG変数の間で型間の割当て(暗黙的な型変換)を実行します。

- BLOBとRAWまたはLONG RAW変数の間で型間の割当て(暗黙的な型変換)を実行します。

- LONGデータ型を受け入れるように定義されたファンクションにLOBデータ型を渡すか、LOBデータ型を受け入れるように定義されたファンクションにLONGデータ型を渡します。たとえば、VARCHAR2、CHARまたはLONGなど、他のキャラクタ・タイプを受け入れるように定義されたファンクションに、CLOBインスタンスを渡すことができます。

- INSTRやSUBSTRなどのVARCHAR2引数を受け入れる他のPL/SQLファンクションおよび演算子とともにCLOBを使用します。詳細なリストは、「SQLおよびPL/SQL組込みファンクションへのCLOBの受渡し」を参照してください。

注意:
PL/SQLでLOB用のデータ・インタフェースをSELECT文とともに使用する場合、読み取る量は指定できません。指定できるのは、バッファ長のみです。バッファ長がLOBデータより短い場合は、データベースで例外が発生します。

関連項目:

- SQL文でのLOBサポートの詳細は、第16章「SQLセマンティクスとLOB」を参照してください。

- 「LOBデータ型に対してサポートされない一部の暗黙的変換」

SQLとPL/SQLでデータ・インタフェースを使用してLOB列にアクセスする際のガイドライン

この項では、永続LOB用のデータ・インタフェースを使用してLOB列またはLOB属性にアクセスする方法について説明します。

CLOBおよびBLOB列または属性からのデータは、INSERT、UPDATE、SELECTなどの通常のSQL文によって参照できます。

PL/SQLには、ピース単位のINSERT、UPDATEまたはフェッチ用のルーチンがありません。そのため、LOB列またはLOB属性からアクセスできるデータ量は、文字バッファ・サイズの最大値によって制限されます。PL/SQLは文字バッファ・サイズを32KB - 1(32767バイト)までサポートします。このため、PL/SQLアプリケーションで永続LOB用のデータ・インタフェースを使用してアクセスできるLOBは、32KB未満に制限されます。

データ・インタフェースを使用して32KB - 1を超えるデータにアクセスする場合は、PL/SQLコードからOCIコールを実行して、ピース単位挿入およびフェッチ用のAPIを使用する必要があります。

データ・インタフェースを使用してLOB列またはLOB属性にアクセスする場合は、次のガイドラインに従ってください。

- INSERT操作
VALUES句の通常のINSERT文を使用して、LOB列またはLOB属性を含む表にINSERTできます。LOB列のフィールドは、リテラル、文字データ型、バイナリ・データ型またはLOBロケータです。

- UPDATE操作
LOB列またはLOB属性は、UPDATE... SET文によって全体を更新できます。SET句では、新しい値にリテラル、文字データ型、バイナリ・データ型またはLOBロケータを使用できます。

- 16進からRAWおよびRAWから16進への変換に関する4000バイトの制限
サイズが4000バイトを超えるデータの場合、データベースでは16進からRAWまたはRAWから16進への暗黙的な変換は実行されません。バッファのサイズが4000バイトを超える場合、文字データのバッファはバイナリ・データ型の列にバインドできず、バイナリ・データのバッファは文字データ型の列にバインドできません。この種のバインドを試みると、列データが4000バイトで切り捨てられます。

たとえば、サイズが4000バイトを超えるVARCHAR2バッファはLONG RAW列またはBLOB列にバインドできません。同様に、サイズが4000バイトを超えるRAWバッファはLONG列またはCLOB列にバインドできません。

- SELECT操作
PL/SQLでは、LOB列またはLOB属性を選択して文字バッファまたはバイナリ・バッファに格納できます。LOB列またはLOB属性がバッファ・サイズより大きい場合、データはバッファに格納されず、例外が発生します。LOB列またはLOB属性は、LOBロケータとしても選択できます。

暗黙的な割当ておよびパラメータの受渡し

LOB列の場合は、暗黙的な割当てとパラメータの受渡しがサポートされます。表20-1および表20-2に示したデータ型の場合は、永続LOB用のデータ・インタフェースを使用して、キャラクタ・タイプを別のキャラクタ・タイプに、またはバイナリ型を他のバイナリ型に渡したり割り当てることができます。

暗黙的な割当ては、次の例に示すように、明示的に宣言された変数と、%TYPE属性を使用して既存の列の型を参照することで宣言された変数に対して機能します。この例では、t表のlong_col列がLONGからCLOB列に移行されたものとします。

CREATE TABLE t (long_col LONG); -- Alter this table to change LONG column to LOB
DECLARE
a VARCHAR2(100);
b t.long_col%type; -- This variable changes from LONG to CLOB
BEGIN
SELECT * INTO b FROM t;
a := b;  -- This changes from "VARCHAR2 := LONG to VARCHAR2 := CLOB
b := a;  -- This changes from "LONG := VARCHAR2 to CLOB := VARCHAR2
END;

ファンクションとプロシージャの間で暗黙的なパラメータの受渡しが可能です。たとえば、仮パラメータがVARCHAR2として定義されているファンクションまたはプロシージャにCLOBを渡すことができます。

注意:
LOB変数にVARCHAR2バッファを割り当てると、VARCHAR2をLONG変数に割り当てるより効率が悪くなります。これは、前者で一時LOBの作成が伴うためです。したがって、PL/SQLユーザーは、アプリケーションで若干のパフォーマンス低下を感じます。

SQLおよびPL/SQL組込みファンクションへのCLOBの受渡し

暗黙的なパラメータの受渡しは、文字データを受け入れるPL/SQL組込みファンクションの場合もサポートされます。たとえば、INSTRには、他の文字データのみでなくCLOBも使用できます。

VARCHAR2を受け入れるSQLまたはPL/SQL組込みファンクションは、すべて引数としてCLOBを受け入れることができます。同様に、LOBロケータを取るパラメータについては、どのDBMS_LOB APIにもVARCHAR2変数を渡すことができます。

関連項目:
第16章「SQLセマンティクスとLOB」

明示的な変換ファンクション

PL/SQLでは、次の明示的な変換ファンクションにより、他のデータ型がCLOBおよびBLOBデータ型に変換されます。

- TO_CLOB()は、LONG、VARCHAR2およびCHARをCLOBに変換します。

- TO_BLOB()は、LONG RAWおよびRAWをBLOBに変換します。

変換ファンクションTO_CHAR()がCLOBをCHAR型に変換できることにも注意してください。

SQLからのPL/SQLプロシージャおよびCプロシージャのコール

SQLからPL/SQLプロシージャまたはCプロシージャをコールする場合、4000バイトを超えるデータを含むバッファは許可されません。

PL/SQLからのPL/SQLプロシージャおよびCプロシージャのコール

PL/SQLまたはCのプロシージャをPL/SQLからコールできます。CHRを仮パラメータ、CLOBを実パラメータとして渡すことも、その逆も可能です。BLOBとRAWについても、これは同様です。

これにはどのような場合があるかというと、たとえば、仮パラメータまたは実パラメータがアンカー型の場合、つまり変数がtable_name.column_name%type構文を使用して宣言されている場合です。

PL/SQLプロシージャまたはファンクションには、CLOBまたはVARCHAR2を仮パラメータとして指定できます。たとえば、PL/SQLプロシージャは次のいずれかのように指定できます。

- 仮パラメータがCLOBの場合:

CREATE OR REPLACE PROCEDURE get_lob(table_name IN VARCHAR2, lob INOUT
CLOB) AS
...
BEGIN
...
END;
/

- 仮パラメータがVARCHAR2の場合:

CREATE OR REPLACE PROCEDURE get_lob(table_name IN VARCHAR2, lob INOUT
VARCHAR2) AS
...
BEGIN
...
END;
/

コールするファンクションは次のいずれかのタイプです。

- 実パラメータがCHRの場合:

create procedure ...
declare
c VARCHAR2[200];
BEGIN
get_lob('table_name', c);
END;

- 実パラメータがCLOBの場合:

create procedure ...
declare
c CLOB;
BEGIN
get_lob('table_name', c);
END;

INSERT操作とUPDATE操作でのすべてのサイズのバインド

LOB列に対するINSERT操作とUPDATE操作では、すべてのサイズのバインドがサポートされます。1つのINSERT文またはUPDATE文で、任意のサイズの複数のバインドが可能です。

注意:
表の作成時には、LOB列のデフォルト値に指定できる長さが4000バイトに制限されています。

SQL演算子の結果に対する4000バイトの制限

4000バイトを超えるデータをBLOBまたはCLOBにバインドし、そのデータがSQL演算子で構成される場合、結果のサイズは最大4000バイトに制限されます。

次の文では、LPADの結果が4000バイトに制限されているため、4000バイトのみ挿入されます。

INSERT INTO print_media (ad_sourcetext) VALUES (lpad('a', 5000, 'a'));

次の文は2000バイトしか挿入しません。LPADの結果は4000バイトに制限されており、16進からRAWへ暗黙的に変換すると、RAWデータの2000バイトが変換されるためです。

INSERT INTO print_media (ad_photo) VALUES (lpad('a', 5000, 'a'));

SQL演算子の結果に対する4000バイトの制限の例

次の例に、SQL演算子の結果が4000バイトに制限されることを示します。

/* The following command inserts only 4000 bytes because the result of
* LPAD is limited to 4000 bytes */
INSERT INTO print_media(product_id, ad_id, ad_sourcetext)
VALUES (2004, 5, lpad('a', 5000, 'a'));
SELECT LENGTH(ad_sourcetext) FROM print_media
WHERE product_id=2004 AND ad_id=5;
ROLLBACK;

/* The following command inserts only 2000 bytes because the result of
* LPAD is limited to 4000 bytes, and the implicit hex to raw conversion
* converts it to 2000 bytes of RAW data. */
INSERT INTO print_media(product_id, ad_id, ad_composite)
VALUES (2004, 5, lpad('a', 5000, 'a'));
SELECT LENGTH(ad_composite) from print_media
WHERE product_id=2004 AND ad_id=5;
ROLLBAACK;

4000バイトを超えるバインドに対する制限

4000バイトを超えるバインドに対する制限事項を次に示します。

- 表にLONG列とLOB列の両方がある場合、LONG列またはLOB列のいずれかに4000バイトを超えるデータをバインドできますが、同一の文で両方にバインドすることはできません。

- INSERT AS SELECT操作では、どのような長さのデータもLOB列にバインドできません。

LOBに対するパラレルDMLのサポート

LOB列を含む表に対する次のDML操作のパラレル実行がサポートされています。これらの操作がパラレル実行モードで実行されるのは、パーティション表に対して実行する場合のみです。LOB列を含む非パーティション表のDML文は、引き続きシリアル実行モードで実行されます。

- INSERT AS SELECT

- CREATETABLEASSELECT

- DELETE

- UPDATE

- MERGE(条件付きUPDATEおよびINSERT)

- 複数表INSERT

関連項目:
『Oracle Database管理者ガイド』のパラレルSQL実行プロセスの管理に関する項を参照してください。

例: PL/SQL: INSERTおよびUPDATEでの4000バイトを超えるバインドの使用

DECLARE
bigtext VARCHAR2(32767);
smalltext VARCHAR2(2000);
bigraw RAW (32767);
BEGIN
bigtext := LPAD('a', 32767, 'a');
smalltext := LPAD('a', 2000, 'a');
bigraw := utl_raw.cast_to_raw (bigtext);

/* Multiple long binds for LOB columns are allowed for INSERT: */
INSERT INTO print_media(product_id, ad_id, ad_sourcetext, ad_composite)
VALUES (2004, 1, bigtext, bigraw);

/* Single long bind for LOB columns is allowed for INSERT: */
INSERT INTO print_media (product_id, ad_id, ad_sourcetext)
VALUES (2005, 2, smalltext);

bigtext := LPAD('b', 32767, 'b');
smalltext := LPAD('b', 20, 'a');
bigraw := utl_raw.cast_to_raw (bigtext);

/* Multiple long binds for LOB columns are allowed for UPDATE: */
UPDATE print_media SET ad_sourcetext = bigtext, ad_composite = bigraw,
ad_finaltext = smalltext;

/* Single long bind for LOB columns is allowed for UPDATE: */
UPDATE print_media SET ad_sourcetext = smalltext, ad_finaltext = bigtext;

/* The following is NOT allowed because we are trying to insert more than
4000 bytes of data in a LONG and a LOB column: */
INSERT INTO print_media(product_id, ad_id, ad_sourcetext, press_release)
VALUES (2030, 3, bigtext, bigtext);

/* Insert of data into LOB attribute is allowed */
INSERT INTO print_media(product_id, ad_id, ad_header)
VALUES (2049, 4, adheader_typ(null, null, null, bigraw));

/* The following is not allowed because we try to perform INSERT AS
SELECT data INTO LOB */
INSERT INTO print_media(product_id, ad_id, ad_sourcetext)
SELECT 2056, 5, bigtext FROM dual;

END;
/

LOB用のデータ・インタフェースを使用したINSERT、UPDATEおよびSELECT操作

LOBに対するINSERT文およびUPDATE文の使用方法は、LONGに対する使用方法と同じです。次に例を示します。

DECLARE
ad_buffer VARCHAR2(100);
BEGIN
INSERT INTO print_media(product_id, ad_id, ad_sourcetext)
VALUES(2004, 5, 'Source for advertisement 1');
UPDATE print_media SET ad_sourcetext= 'Source for advertisement 2'
WHERE product_id=2004 AND ad_id=5;
/* This retrieves the LOB column if it is up to 100 bytes, otherwise it
* raises an exception */
SELECT ad_sourcetext INTO ad_buffer FROM print_media
WHERE product_id=2004 AND ad_id=5;
END;
/

LOB用のデータ・インタフェースを使用した割当てとパラメータの受渡し

LOB用のデータ・インタフェースを使用すると、次の例に示すように暗黙的な割当てとパラメータの受渡しが可能です。

CREATE TABLE t (clob_col CLOB, blob_col BLOB);
INSERT INTO t VALUES('abcdefg', 'aaaaaa');

DECLARE
var_buf VARCHAR2(100);
clob_buf CLOB;
raw_buf RAW(100);
blob_buf BLOB;
BEGIN
SELECT * INTO clob_buf, blob_buf FROM t;
var_buf := clob_buf;
clob_buf:= var_buf;
raw_buf := blob_buf;
blob_buf := raw_buf;
END;
/

CREATE OR REPLACE PROCEDURE FOO ( a IN OUT CLOB) IS
BEGIN
-- Any procedure body
a := 'abc';
END;
/

CREATE OR REPLACE PROCEDURE BAR (b IN OUT VARCHAR2) IS
BEGIN
-- Any procedure body
b := 'xyz';
END;
/

DECLARE
a VARCHAR2(100) := '1234567';
b CLOB;
BEGIN
FOO(a);
SELECT clob_col INTO b FROM t;
BAR(b);
END;
/

LOB用のデータ・インタフェースを使用したPL/SQL組込みファンクション

この例では、LOB用のデータ・インタフェースを使用した、PL/SQL組込みファンクションでのCLOBの使用を示します。

DECLARE
my_ad CLOB;
revised_ad CLOB;
myGist VARCHAR2(100):= 'This is my gist.';
revisedGist VARCHAR2(100);
BEGIN
INSERT INTO print_media (product_id, ad_id, ad_sourcetext)
VALUES (2004, 5, 'Source for advertisement 1');

-- select a CLOB column into a CLOB variable
SELECT ad_sourcetext INTO my_ad FROM print_media
WHERE product_id=2004 AND ad_id=5;

-- perform VARCHAR2 operations on a CLOB variable
revised_ad := UPPER(SUBSTR(my_ad, 1, 20));

-- revised_ad is a temporary LOB
-- Concat a VARCHAR2 at the end of a CLOB
revised_ad := revised_ad || myGist;

-- The following statement raises an error if my_ad is
-- longer than 100 bytes
myGist := my_ad;
END;
/

OCIにおける永続LOB用のデータ・インタフェースの使用

この項では、永続LOB用のデータ・インタフェースに組み込まれているOCI関数について説明します。この種のOCI関数は、LONGデータ型の場合と同様にLOBデータ型にも機能します。この種の関数を使用すると、文字データまたはバイナリ・データを格納する他のデータ型に使用するのと同じ方法で、OCIでLOBに対してINSERT、UPDATE、フェッチ、バインドおよび定義操作を実行できます。

注意:
配列のバインドおよび定義インタフェースを使用すると、LOBを含む複数の行を1回のラウンドトリップで挿入および選択できます。

関連項目:
『Oracle Call Interfaceプログラマーズ・ガイド』のOCIでのランタイム・データの割当てとピース単位操作に関する項

OCIでのLOBデータ型のバインド

次の操作でLOBデータ型をバインドできます。

- INSERT操作およびUPDATE操作に対する標準、ピース単位およびコールバックのバインド

- INSERT操作およびUPDATE操作に対する配列のバインド

- PL/SQLとOCIの境界でのパラメータの受渡し

ピース単位操作は、ポーリングまたはコールバックによって実行できます。これらの操作をサポートするために、次のOCI関数は表20-2に示すLONGデータ型とLOBデータ型を受け入れます。

- OCIBindByName()およびOCIBindByPos()
これらの関数を使用して、INSERT操作およびUPDATE操作用にSQL文またはPL/SQLブロック内のプログラム変数とプレースホルダ間の対応付けを行います。

- OCIBindDynamic()
このコールを使用して、INSERT操作またはUPDATE操作用に動的にデータを割り当てるためのコールバックを登録します。

- OCIStmtGetPieceInfo()およびOCIStmtSetPieceInfo()
これらのコールを使用して、ピース単位操作のためのピース情報を取得または設定します。

OCIでのLOBデータ型の定義

永続LOB用のデータ・インタフェースを使用すると、次のOCI関数で表20-2に示すLONGデータ型とLOBデータ型を受け入れることができます。

- OCIDefineByPos()
このコールを使用して、SELECTリストにある項目を型および出力データ・バッファに対応付けます。

- OCIDefineDynamic()
このコールを使用して、OCIDefineByPos()関数のコールでOCI_DYNAMIC_FETCHモードが選択された場合、SELECT操作に対してユーザー・コールバックを登録します。

これらの関数をLOB型に使用すると、LOBロケータではなくLOBデータがバッファに選択されます。OCIでは、LOB用のデータ・インタフェースを使用して読み取る量を指定できないことに注意してください。指定できるのは、バッファ長のみです。バッファに収まる量のデータのみが読み取られ、データが切り捨てられます。

LOB用データ・インタフェースでのOCIのマルチバイト・キャラクタ・セットの併用

クライアントのキャラクタ・セットがマルチバイト形式の場合、データ・インタフェースに組み込まれている関数は、次のように、LONGデータ型の場合と同様にLOBデータ型を操作します。

- マルチバイト・キャラクタ・セットでのピース単位フェッチの場合、マルチバイト文字が途中で切れることがあり、一部のバイトが1つのバッファの最後に、残りのバイトが次のバッファに入ることがあります。

- 通常のフェッチの場合、最後の文字のバイトの一部をバッファで保持できない場合には、バッファに収まるかぎりのバイトが戻されるため、部分的な文字にしかなりません。

OCI関数を使用したLOB列のINSERTまたはUPDATEの実行

この項では、データ・インタフェースを使用してLOB列またはLOB属性のINSERT操作またはUPDATE操作を実行する各種の方法について説明します。この項で説明する操作は、OCI環境を初期化して必要なハンドルをすべて割当て済であることを前提としています。

1つのピースでの標準のINSERTまたはUPDATE

永続LOB用のデータ・インタフェースを使用して、1つのピースで単純なINSERT操作またはUPDATE操作を実行する手順は、次のとおりです。

1. OCIStmtPrepare()をOCI_DEFAULTモードでコールして、文を準備します。

2. OCIBindByName()またはOCIBindbyPos()をOCI_DEFAULTモードでコールして、LOBを文字データまたはバイナリ・データとしてバインドするためにプレースホルダをバインドします。

3. OCIStmtExecute()をコールして、実際のINSERT操作またはUPDATE操作を実行します。

ポーリングによるピース単位のINSERTおよびUPDATE

永続LOB用のデータ・インタフェースを使用して、ポーリングによりピース単位のINSERT操作またはUPDATE操作を実行する手順は、次のとおりです。

1. OCIStmtPrepare()をOCI_DEFAULTモードでコールして、文を準備します。

2. OCIBindByName()またはOCIBindbyPos()をOCI_DATA_AT_EXECモードでコールして、LOBを文字データまたはバイナリ・データとしてバインドします。

3. OCIStmtExecute()をデフォルト・モードでコールします。OCIStmtExecute()から戻される値がOCI_NEED_DATAの間は、ループ内で次の各手順を実行します。OCIStmtExecute()から値OCI_SUCCESSが戻された場合は、ループを終了します。

- OCIStmtGetPieceInfo()をコールして、挿入するピースの情報を取り出します。

- OCIStmtSetPieceInfo()をコールして、挿入するピースの情報を設定します。

コールバックによるピース単位のINSERTおよびUPDATE

永続LOB用のデータ・インタフェースを使用して、コールバックによりピース単位のINSERT操作またはUPDATE操作を実行する手順は、次のとおりです。

1. OCIStmtPrepare()をOCI_DEFAULTモードでコールして、文を準備します。

2. OCIBindByName()またはOCIBindbyPos()をOCI_DATA_AT_EXECモードでコールして、LOB列を文字データまたはバイナリ・データとしてバインドするためにプレースホルダをバインドします。

3. OCIBindDynamic()をコールしてコールバックを指定します。

4. OCIStmtExecute()をデフォルト・モードでコールします。

配列のINSERT操作およびUPDATE操作

永続LOB用のデータ・インタフェースを使用して配列のINSERT操作またはUPDATE操作を実行するには、この項で説明する方法のいずれかをOCIBindArrayOfStruct()とともに使用する方法と、OCIStmtExecute()のコールで反復回数(iter)のiter値を2以上に指定する方法があります。

データ・インタフェースを使用したOCIでのLOBデータのフェッチ

この項では、永続LOB用のデータ・インタフェースを使用して、OCIでLOB列またはLOB属性からデータをフェッチする方法について説明します。

1つのピースでの標準のフェッチ

永続LOB用のデータ・インタフェースを使用し、1つのピースでLOBに対して単純なフェッチ操作を実行する手順は、次のとおりです。

1. OCIStmtPrepare()をOCI_DEFAULTモードでコールして、SELECT文を準備します。

2. OCIDefineByPos()をOCI_DEFAULTモードでコールして、LOBを文字データまたはバイナリ・データとして定義するために、選択リストの位置を定義します。

3. OCIStmtExecute()をコールしてSELECT文を実行します。

4. OCIStmtFetch()をコールして実際のフェッチを実行します。

ポーリングによるピース単位のフェッチ

LOB用のデータ・インタフェースを使用し、LOB列に対してポーリングによるピース単位フェッチ操作を実行する手順は、次のとおりです。

1. OCIStmtPrepare()をOCI_DEFAULTモードでコールして、SELECT文を準備します。

2. OCIDefineByPos()をOCI_DYNAMIC_FETCHモードでコールして、LOB列を文字データまたはバイナリ・データとして定義するために、選択リストの位置を定義します。

3. OCIStmtExecute()をコールしてSELECT文を実行します。

4. OCIStmtFetch()をデフォルト・モードでコールします。OCIStmtFetch()から戻される値がOCI_NEED_DATAである間、ループで次の各手順を実行します。OCIStmtFetch()で戻される値がOCI_SUCCESSになると、ループは停止します。

- OCIStmtGetPieceInfo()をコールして、フェッチするピースの情報を取り出します。

- OCIStmtSetPieceInfo()をコールして、フェッチするピースの情報を設定します。

コールバックによるピース単位のフェッチ

永続LOB用のデータ・インタフェースを使用し、LOB列に対してコールバックによるピース単位フェッチ操作を実行する手順は、次のとおりです。

1. OCIStmtPrepare()をOCI_DEFAULTモードでコールして、文を準備します。

2. OCIDefineByPos()をOCI_DYNAMIC_FETCHモードでコールして、LOB列を文字データまたはバイナリ・データとして定義するために、選択リストの位置を定義します。

3. OCIStmtExecute()をコールしてSELECT文を実行します。

4. OCIDefineDynamic()をコールしてコールバックを指定します。

5. OCIStmtFetch()をデフォルト・モードでコールします。

配列のフェッチ

永続LOB用のデータ・インタフェースを使用してOCIで配列フェッチを実行するには、この項で説明する方法のいずれかをOCIDefineArrayOfStruct()とともに使用する方法と、OCIStmtExecute()のコールで反復回数(iter)のiter値を2以上に指定する方法があります。

OCIからのPL/SQLバインドおよびCバインド

OCIからPL/SQLプロシージャをコールして、インバインドまたはアウトバインド(あるいはその両方)を行う場合、次のいずれかを行えます。

- PL/SQLプロシージャの仮パラメータがSQLT_CLOBである場合、変数をSQLT_CHRまたはSQLT_LNGとしてバインドする。

- 仮パラメータがSQLT_BLOBである場合、変数をSQLT_BINまたはSQLT_LBIとしてバインドする。

次に、有効な2つの例を示します。

begin foo(:1); end;形式でのPL/SQLアウトバインドのコール

begin foo(:1); end;形式でPL/SQLアウトバインドをコールする例を次に示します。

text *sqlstmt = (text *)"BEGIN get_lob(:c); END; " ;

call foo(:1);形式でのPL/SQLアウトバインドのコール

call foo(:1);形式でPL/SQLアウトバインドをコールする例を次に示します。

text *sqlstmt = (text *)"CALL get_lob(:c);" ;

どちらの例でも、プログラムの後半には次の文が含まれます。

OCIStmtPrepare(stmthp, errhp, sqlstmt, (ub4)strlen((char *)sqlstmt),
(ub4) OCI_NTV_SYNTAX, (ub4) OCI_DEFAULT);
curlen = 0;
OCIBindByName(stmthp, &bndhp[3], errhp,
(text *) ":c", (sb4) strlen((char *) ":c"),
(dvoid *) buf5, (sb4) LONGLEN, SQLT_CHR,
(dvoid *) 0, (ub2 *) 0, (ub2 *) 0,
(ub4) 1, (ub4 *) &curlen, (ub4) OCI_DATA_AT_EXEC);

PL/SQLプロシージャget_lob()を次に示します。

procedure get_lob(c INOUT CLOB) is  -- This might have been column%type
BEGIN
... /* The procedure body could be in PL/SQL or C*/
END;

例: C(OCI): INSERTおよびUPDATEでの4000バイトを超えるバインド

void insert3()
{
/* Insert of data into LOB attributes is allowed. */
ub1 buffer[8000];
text *insert_sql = (text *)"INSERT INTO Print_media (ad_header) \
VALUES (adheader_typ(NULL, NULL, NULL,:1))";
OCIStmtPrepare(stmthp, errhp, insert_sql, strlen((char*)insert_sql),
(ub4) OCI_NTV_SYNTAX, (ub4) OCI_DEFAULT);
OCIBindByPos(stmthp, &bindhp[0], errhp, 1, (dvoid *)buffer, 2000,
SQLT_LNG, 0, 0, 0, 0, 0, (ub4) OCI_DEFAULT);
OCIStmtExecute(svchp, stmthp, errhp, 1, 0, (const OCISnapshot*) 0,
(OCISnapshot*)0, OCI_DEFAULT);
}

LOB用データ・インタフェースを使用したLOBに対するOCIからのPL/SQLバインド

LOB用のデータ・インタフェースを使用すると、OCIからのLOBのPL/SQLバインドを次のように使用できます。OCIからPL/SQLプロシージャをコールして、IN、OUTまたはIN OUTバインドを実行すると、PL/SQLプロシージャの仮パラメータがSQLT_CLOBである場合、変数をSQLT_CHRとしてバインドできます。

注意:
CプロシージャはPL/SQLスタブにラップされています。そのため、OCIアプリケーションは常にPL/SQLスタブをコールします。

OCIをコールするプログラムでは、次のような場合が考えられます。

begin foo(:1); end;形式でのPL/SQLアウトバインドのコール

次に例を示します。

text *sqlstmt = (text *)"BEGIN PKG1.P5 (:c); END; " ;

call foo(:1);形式でのPL/SQLアウトバインドのコール

次に例を示します。

text *sqlstmt = (text *)"CALL PKG1.P5( :c );" ;

どちらの例でも、プログラムの後半は次のようになります。

OCIStmtPrepare(stmthp, errhp, sqlstmt, (ub4)strlen((char *)sqlstmt),
(ub4) OCI_NTV_SYNTAX, (ub4) OCI_DEFAULT);
curlen = 0;

OCIBindByName(stmthp, &bndhp[3], errhp,
(text *) ":c4", (sb4) strlen((char *) ":c"),
(dvoid *) buf5, (sb4) LONGLEN, SQLT_CHR,
(dvoid *) 0, (ub2 *) 0, (ub2 *) 0,
(ub4) 1, (ub4 *) &curlen, (ub4) OCI_DATA_AT_EXEC);

OCIStmtExecute(svchp, stmthp, errhp,(ub4) 0,(ub4) 0, (const OCISnapshot*) 0,
(OCISnapshot*) 0,(ub4) OCI_DEFAULT);

PL/SQLプロシージャPKG1.P5を次に示します。

CREATE OR REPLACE PACKAGE BODY pkg1 AS
...
procedure p5 (c OUT CLOB) is
-- This might have been table%rowtype (so it   is CLOB now)
BEGIN
...
END p5;

END pkg1;

4000バイトを超えるバインドでのLOB列に対するLONGデータのバインド

次の例に、LOB列の文字データのバインドを示します。

void simple_insert()
{
word buflen;
text buf[5000];
text *insstmt = (text *) "INSERT INTO Print_media(Product_id, Ad_id,\
Ad_sourcetext) VALUES (2004, 1, :SRCTXT)";

OCIStmtPrepare(stmthp, errhp, insstmt, (ub4)strlen((char *)insstmt),
(ub4) OCI_NTV_SYNTAX, (ub4) OCI_DEFAULT);

OCIBindByName(stmthp, &bndhp[0], errhp,
(text *) ":SRCTXT", (sb4) strlen((char *) ":SRCTXT"),
(dvoid *) buf, (sb4) sizeof(buf), SQLT_CHR,
(dvoid *) 0, (ub2 *) 0, (ub2 *) 0,
(ub4) 0, (ub4 *) 0, (ub4) OCI_DEFAULT);

memset((void *)buf, (int)'A', (size_t)5000);
OCIStmtExecute(svchp, stmthp, errhp, (ub4) 1, (ub4) 0,
(const OCISnapshot*) 0, (OCISnapshot*) 0, (ub4) OCI_DEFAULT);
}

ポーリングによるピース単位INSERTを使用したLOB列へのLONGデータのバインド

次の例に、LOB用のデータ・インタフェースとともにポーリングによるピース単位INSERTを使用する例を示します。

void piecewise_insert()
{
text *sqlstmt = (text *)"INSERT INTO Print_media(Product_id, Ad_id,\
Ad_sourcetext) VALUES (:1, :2, :3)";
ub2 rcode;
ub1 piece, i;
word product_id = 2004;
word ad_id = 2;
ub4 buflen;
char buf[5000];

OCIStmtPrepare(stmthp, errhp, sqlstmt, (ub4)strlen((char *)sqlstmt),
(ub4) OCI_NTV_SYNTAX, (ub4) OCI_DEFAULT);
OCIBindByPos(stmthp, &bndhp[0], errhp, (ub4) 1,
(dvoid *) &product_id, (sb4) sizeof(product_id), SQLT_INT,
(dvoid *) 0, (ub2 *)0, (ub2 *)0,
(ub4) 0, (ub4 *) 0, (ub4) OCI_DEFAULT);
OCIBindByPos(stmthp, &bndhp[1], errhp, (ub4) 2,
(dvoid *) &ad_id, (sb4) sizeof(ad_id), SQLT_INT,
(dvoid *) 0, (ub2 *)0, (ub2 *)0,
(ub4) 0, (ub4 *) 0, (ub4) OCI_DEFAULT);
OCIBindByPos(stmthp, &bndhp[2], errhp, (ub4) 3,
(dvoid *) 0, (sb4) 15000, SQLT_LNG,
(dvoid *) 0, (ub2 *)0, (ub2 *)0,
(ub4) 0, (ub4 *) 0, (ub4) OCI_DATA_AT_EXEC);

i = 0;
while (1)
{
i++;
retval = OCIStmtExecute(svchp, stmthp, errhp, (ub4) 1, (ub4) 0,
(CONST OCISnapshot*) 0, (OCISnapshot*) 0,
(ub4) OCI_DEFAULT);
switch(retval)
{
case OCI_NEED_DATA:
memset((void *)buf, (int)'A'+i, (size_t)5000);
buflen = 5000;
if (i == 1) piece = OCI_FIRST_PIECE;
else if (i == 3) piece = OCI_LAST_PIECE;
else piece = OCI_NEXT_PIECE;

if (OCIStmtSetPieceInfo((dvoid *)bndhp[2],
(ub4)OCI_HTYPE_BIND, errhp, (dvoid *)buf,
&buflen, piece, (dvoid *) 0, &rcode))
{
printf("ERROR: OCIStmtSetPieceInfo: %d \n", retval);
break;
}

break;
case OCI_SUCCESS:
break;
default:
printf( "oci exec returned %d \n", retval);
report_error(errhp);
retval = OCI_SUCCESS;
} /* end switch */
if (retval == OCI_SUCCESS)
break;
} /* end while(1) */
}

コールバックによるピース単位INSERTを使用したLOB列へのLONGデータのバインド

次の例に、コールバックによるピース単位INSERTを使用する場合の、LOB列へのLONGデータのバインドを示します。

void callback_insert()
{
word buflen = 15000;
word product_id = 2004;
word ad_id = 3;
text *sqlstmt = (text *) "INSERT INTO Print_media(Product_id, Ad_id,\
Ad_sourcetext) VALUES (:1, :2, :3)";
word pos = 3;

OCIStmtPrepare(stmthp, errhp, sqlstmt, (ub4)strlen((char *)sqlstmt),
(ub4) OCI_NTV_SYNTAX, (ub4) OCI_DEFAULT)

OCIBindByPos(stmthp, &bndhp[0], errhp, (ub4) 1,
(dvoid *) &product_id, (sb4) sizeof(product_id), SQLT_INT,
(dvoid *) 0, (ub2 *)0, (ub2 *)0,
(ub4) 0, (ub4 *) 0, (ub4) OCI_DEFAULT);
OCIBindByPos(stmthp, &bndhp[1], errhp, (ub4) 2,
(dvoid *) &ad_id, (sb4) sizeof(ad_id), SQLT_INT,
(dvoid *) 0, (ub2 *)0, (ub2 *)0,
(ub4) 0, (ub4 *) 0, (ub4) OCI_DEFAULT);
OCIBindByPos(stmthp, &bndhp[2], errhp, (ub4) 3,
(dvoid *) 0, (sb4) buflen, SQLT_CHR,
(dvoid *) 0, (ub2 *)0, (ub2 *)0,
(ub4) 0, (ub4 *) 0, (ub4) OCI_DATA_AT_EXEC);

OCIBindDynamic(bndhp[2], errhp, (dvoid *) (dvoid *) &pos,
insert_cbk, (dvoid *) 0, (OCICallbackOutBind) 0);

OCIStmtExecute(svchp, stmthp, errhp, (ub4) 1, (ub4) 0,
(const OCISnapshot*) 0, (OCISnapshot*) 0,
(ub4) OCI_DEFAULT);
} /* end insert_data() */

/* Inbind callback to specify input data. */
static sb4 insert_cbk(dvoid *ctxp, OCIBind *bindp, ub4 iter, ub4 index,
dvoid **bufpp, ub4 *alenpp, ub1 *piecep, dvoid **indpp)
{
static int a = 0;
word   j;
ub4    inpos = *((ub4 *)ctxp);
char   buf[5000];

switch(inpos)
{
case 3:
memset((void *)buf, (int) 'A'+a, (size_t) 5000);
*bufpp = (dvoid *) buf;
*alenpp = 5000 ;
a++;
break;
default: printf("ERROR: invalid position number: %d\n", inpos);
}

*indpp = (dvoid *) 0;
*piecep = OCI_ONE_PIECE;
if (inpos == 3)
{
if (a<=1)
{
*piecep = OCI_FIRST_PIECE;
printf("Insert callback: 1st piece\n");
}
else if (a<3)
{
*piecep = OCI_NEXT_PIECE;
printf("Insert callback: %d'th piece\n", a);
}
else {
*piecep = OCI_LAST_PIECE;
printf("Insert callback: %d'th piece\n", a);
a = 0;
}
}
return OCI_CONTINUE;
}

配列のINSERTを使用したLOB列へのLONGデータのバインド

次の例に、配列のINSERT操作を使用したLOB列への文字データのバインドを示します。

void array_insert()
{
ub4 i;
word buflen;
word arrbuf1[5];
word arrbuf2[5];
text arrbuf3[5][5000];
text *insstmt = (text *)"INSERT INTO Print_media(Product_id, Ad_id,\
Ad_sourcetext) VALUES (:PID, :AID, :SRCTXT)";

OCIStmtPrepare(stmthp, errhp, insstmt,
(ub4)strlen((char *)insstmt), (ub4) OCI_NTV_SYNTAX,
(ub4) OCI_DEFAULT);

OCIBindByName(stmthp, &bndhp[0], errhp,
(text *) ":PID", (sb4) strlen((char *) ":PID"),
(dvoid *) &arrbuf1[0], (sb4) sizeof(arrbuf1[0]), SQLT_INT,
(dvoid *) 0, (ub2 *)0, (ub2 *) 0,
(ub4) 0, (ub4 *) 0, (ub4) OCI_DEFAULT);

OCIBindByName(stmthp, &bndhp[1], errhp,
(text *) ":AID", (sb4) strlen((char *) ":AID"),
(dvoid *) &arrbuf2[0], (sb4) sizeof(arrbuf2[0]), SQLT_INT,
(dvoid *) 0, (ub2 *)0, (ub2 *) 0,
(ub4) 0, (ub4 *) 0, (ub4) OCI_DEFAULT);

OCIBindByName(stmthp, &bndhp[2], errhp,
(text *) ":SRCTXT", (sb4) strlen((char *) ":SRCTXT"),
(dvoid *) arrbuf3[0], (sb4) sizeof(arrbuf3[0]), SQLT_CHR,
(dvoid *) 0, (ub2 *) 0, (ub2 *) 0,
(ub4) 0, (ub4 *) 0, (ub4) OCI_DEFAULT);

OCIBindArrayOfStruct(bndhp[0], errhp sizeof(arrbuf1[0]),
indsk, rlsk, rcsk);
OCIBindArrayOfStruct(bndhp[1], errhp, sizeof(arrbuf2[0]),
indsk, rlsk, rcsk);
OCIBindArrayOfStruct(bndhp[2], errhp, sizeof(arrbuf3[0]),
indsk, rlsk, rcsk);

for (i=0; i<5; i++)
{
arrbuf1[i] = 2004;
arrbuf2[i] = i+4;
memset((void *)arrbuf3[i], (int)'A'+i, (size_t)5000);
}
OCIStmtExecute(svchp, stmthp, errhp, (ub4) 5, (ub4) 0,
(const OCISnapshot*) 0, (OCISnapshot*) 0,
(ub4) OCI_DEFAULT);

}

単純フェッチを使用したLONGバッファへのLOB列の選択

次の例に、単純フェッチを使用したLOB列の選択を示します。

void simple_fetch()
{
word retval;
text buf[15000];
text *selstmt = (text *) "SELECT Ad_sourcetext FROM Print_media WHERE\
Product_id = 2004";

OCIStmtPrepare(stmthp, errhp, selstmt, (ub4)strlen((char *)selstmt),
(ub4) OCI_NTV_SYNTAX, (ub4) OCI_DEFAULT);

retval = OCIStmtExecute(svchp, stmthp, errhp, (ub4) 0, (ub4) 0,
(const OCISnapshot*) 0, (OCISnapshot*) 0,
(ub4) OCI_DEFAULT);
while (retval == OCI_SUCCESS || retval == OCI_SUCCESS_WITH_INFO)
{
OCIDefineByPos(stmthp, &defhp, errhp, (ub4) 1, (dvoid *) buf,
(sb4) sizeof(buf), (ub2) SQLT_CHR, (dvoid *) 0,
(ub2 *) 0, (ub2 *) 0, (ub4) OCI_DEFAULT);
retval = OCIStmtFetch(stmthp, errhp, (ub4) 1,
(ub4) OCI_FETCH_NEXT, (ub4) OCI_DEFAULT);
if (retval == OCI_SUCCESS || retval == OCI_SUCCESS_WITH_INFO)
printf("buf = %.*s\n", 15000, buf);
}
}

ポーリングによるピース単位フェッチを使用したLONGバッファへのLOB列の選択

次の例に、ポーリングによるピース単位フェッチを使用した、LONGバッファへのLOB列の選択を示します。

void piecewise_fetch()
{
text buf[15000];
ub4 buflen=5000;
word retval;
text *selstmt = (text *) "SELECT Ad_sourcetext FROM Print_media
WHERE Product_id = 2004 AND Ad_id = 2";

OCIStmtPrepare(stmthp, errhp, selstmt,
(ub4) strlen((char *)selstmt),
(ub4) OCI_NTV_SYNTAX, (ub4) OCI_DEFAULT);

OCIDefineByPos(stmthp, &dfnhp, errhp, (ub4) 1,
(dvoid *) NULL, (sb4) 100000, SQLT_LNG,
(dvoid *) 0, (ub2 *) 0,
(ub2 *) 0, (ub4) OCI_DYNAMIC_FETCH);

retval = OCIStmtExecute(svchp, stmthp, errhp, (ub4) 0, (ub4) 0,
(CONST OCISnapshot*) 0, (OCISnapshot*) 0,
(ub4) OCI_DEFAULT);

retval = OCIStmtFetch(stmthp, errhp, (ub4) 1 ,
(ub2) OCI_FETCH_NEXT, (ub4) OCI_DEFAULT);

while (retval != OCI_NO_DATA && retval != OCI_SUCCESS)
{
ub1 piece;
ub4 iter;
ub4 idx;

genclr((void *)buf, 5000);
switch(retval)
{
case OCI_NEED_DATA:
OCIStmtGetPieceInfo(stmthp, errhp, &hdlptr, &hdltype,
&in_out, &iter, &idx, &piece);
buflen = 5000;
OCIStmtSetPieceInfo(hdlptr, hdltype, errhp,
(dvoid *) buf, &buflen, piece,
(CONST dvoid *) &indp1, (ub2 *) 0);
retval = OCI_NEED_DATA;
break;
default:
printf("ERROR: piece-wise fetching, %d\n", retval);
return;
} /* end switch */
retval = OCIStmtFetch(stmthp, errhp, (ub4) 1 ,
(ub2) OCI_FETCH_NEXT, (ub4) OCI_DEFAULT);
printf("Data : %.5000s\n", buf);
} /* end while */
}

コールバックによるピース単位フェッチを使用したLONGバッファへのLOB列の選択

次の例に、コールバックによるピース単位フェッチを使用した、LOBバッファへのLONG列の選択を示します。

char buf[5000];
void callback_fetch()
{
word outpos = 1;
text *sqlstmt = (text *) "SELECT Ad_sourcetext FROM Print_media WHERE
Product_id = 2004 AND Ad_id = 3";

OCIStmtPrepare(stmthp, errhp, sqlstmt, (ub4)strlen((char *)sqlstmt),
(ub4) OCI_NTV_SYNTAX, (ub4) OCI_DEFAULT);
OCIDefineByPos(stmthp, &dfnhp[0], errhp, (ub4) 1,
(dvoid *) 0, (sb4)3 * sizeof(buf), SQLT_CHR,
(dvoid *) 0, (ub2 *)0, (ub2 *)0,
(ub4) OCI_DYNAMIC_FETCH);

OCIDefineDynamic(dfnhp[0], errhp, (dvoid *) &outpos,
(OCICallbackDefine) fetch_cbk);

OCIStmtExecute(svchp, stmthp, errhp, (ub4) 1, (ub4) 0,
(const OCISnapshot*) 0, (OCISnapshot*) 0,
(ub4) OCI_DEFAULT);
buf[ 4999 ] = '\0';
printf("Select callback: Last piece: %s\n", buf);
}

/* -------------------------------------------------------------- */
/* Fetch callback to specify buffers. */
/* -------------------------------------------------------------- */
static sb4 fetch_cbk(dvoid *ctxp, OCIDefine *dfnhp, ub4 iter, dvoid **bufpp,
ub4 **alenpp, ub1 *piecep, dvoid **indpp, ub2 **rcpp)
{
static int a = 0;
ub4 outpos = *((ub4 *)ctxp);
ub4 len = 5000;
switch(outpos)
{
case 1:
a ++;
*bufpp = (dvoid *) buf;
*alenpp = &len;
break;
default:
*bufpp = (dvoid *) 0;
*alenpp = (ub4 *) 0;
printf("ERROR: invalid position number: %d\n", outpos);
}
*indpp = (dvoid *) 0;
*rcpp = (ub2 *) 0;

buf[len] = '\0';
if (a<=1)
{
*piecep = OCI_FIRST_PIECE;
printf("Select callback: 0th piece\n");
}
else if (a<3)
{
*piecep = OCI_NEXT_PIECE;
printf("Select callback: %d'th piece: %s\n", a-1, buf);
}
else {
*piecep = OCI_LAST_PIECE;
printf("Select callback: %d'th piece: %s\n", a-1, buf);
a = 0;
}
return OCI_CONTINUE;
}

配列フェッチを使用したLONGバッファへのLOB列の選択

次の例に、配列フェッチを使用した、LONGバッファへのLOB列の選択を示します。

void array_fetch()
{
word i;
text arrbuf[5][5000];
text *selstmt = (text *) "SELECT Ad_sourcetext FROM Print_media WHERE
Product_id = 2004 AND Ad_id >=4";

OCIStmtPrepare(stmthp, errhp, selstmt, (ub4)strlen((char *)selstmt),
(ub4) OCI_NTV_SYNTAX, (ub4) OCI_DEFAULT);

OCIStmtExecute(svchp, stmthp, errhp, (ub4) 0, (ub4) 0,
(const OCISnapshot*) 0, (OCISnapshot*) 0, (ub4) OCI_DEFAULT);

OCIDefineByPos(stmthp, &defhp1, errhp, (ub4) 1,
(dvoid *) arrbuf[0], (sb4) sizeof(arrbuf[0]),
(ub2) SQLT_CHR, (dvoid *) 0,
(ub2 *) 0, (ub2 *) 0, (ub4) OCI_DEFAULT);

OCIDefineArrayOfStruct(dfnhp1, errhp, sizeof(arrbuf[0]), indsk,
rlsk, rcsk);

retval = OCIStmtFetch(stmthp, errhp, (ub4) 5,
(ub4) OCI_FETCH_NEXT, (ub4) OCI_DEFAULT);
if (retval == OCI_SUCCESS || retval == OCI_SUCCESS_WITH_INFO)
{
printf("%.5000s\n", arrbuf[0]);
printf("%.5000s\n", arrbuf[1]);
printf("%.5000s\n", arrbuf[2]);
printf("%.5000s\n", arrbuf[3]);
printf("%.5000s\n", arrbuf[4]);
}
}

Javaにおける永続LOB用のデータ・インタフェースの使用

CLOBデータおよびBLOBデータの読取りおよび書込みは、LONGデータおよびLONG RAWデータの場合と同じストリーミング・メカニズムを使用して行うこともできます。読み取る場合は、列でdefineColumnType(nn, Types.LONGVARCHAR)またはdefineColumnType(nn, Types.LONGVARBINARY)を使用します。これにより、LONGまたはLONG RAW列の場合と同様に、データに直接ストリームが生成されます。PreparedStatementへの入力には、BLOBまたはCLOBパラメータに対してsetBinaryStream()、setCharacterStream()またはsetAsciiStream()を使用できます。これらの方法では、ストリーム・インタフェースを使用して、ストリーム内のデータからデータベース内にLOBを作成します。これら両方の技法によってデータベースのラウンドトリップが削減され、場合によってはパフォーマンスが向上します。適用される大幅な制限については、http://www.oracle.com/technology/でストリーム・データに関するJavadocを参照してください。

『Oracle JDBC開発者ガイドおよびリファレンス』で、次の内容を参照してください。

関連項目:

- 『Oracle Database JDBC開発者ガイドおよびリファレンス』の「LOBとBFILEの操作」、LOB用のデータ・インタフェースに関する項

- 『Oracle Database JDBC開発者ガイドおよびリファレンス』の「JDBC標準サポート」

リモートLOB用データ・インタフェースの使用

リモートLOBの挿入、更新および選択を行うためのデータ・インタフェース(dblinkを介したアクセス)は、Oracle Database 10gリリース2以上でサポートされています。次の項に示す例は、2つのスキーマ、dbs1およびdbs2で作成されたprint_media表についてのものです。例で使用されている表のCLOB列は、ad_finaltextです。次の項に示すPL/SQL、OCIおよびJavaについての例では、この1つの列に対してバインドおよび定義を使用していますが、複数の列にアクセスすることも可能です。次に、サポートされている機能とその制限を示します。

- CLOBをCHARまたはNCHARとして、NCLOBをCHARまたはNCHARとして定義できます。CLOBおよびNCLOBは、LONGとして定義できます。BLOBは、RAWまたはLONG RAWとして定義できます。

- 配列のバインドおよび定義はサポートされています。

関連項目:
「PL/SQLにおけるリモート・データ・インタフェースの例」およびその次の項

サポートされない構文

- 複数のデータベースを使用する問合せはサポートされていません。

SELECT t1.lobcol, a2.lobcol FROM t1, t2.lobcol@dbs2 a2 WHERE
LENGTH(t1.lobcol) = LENGTH(a2.lobcol);

次の問合せもサポートされていません(PL/SQLブロック内)。

SELECT t1.lobcol INTO varchar_buf1 FROM t1@dbs1
UNION ALL
SELECT t2.lobcol INTO varchar_buf2 FROM t2@dbs2;

- リモートの永続LOB列に移動するデータに対するバインドおよび定義のみがサポートされているため、リモートLOBに対してCHARデータがバインドまたは定義されているPL/SQLで渡されるパラメータは、サポートされていないリモートの一時LOBが発生する可能性があるので許可されません。次の文ではすべて、エラーが生成されます。

SELECT foo() INTO varchar_buf FROM table1@dbs2; -- foo returns a LOB

SELECT foo()@dbs INTO char_val FROM DUAL; -- foo returns a LOB

SELECT XMLType().getclobval INTO varchar_buf FROM table1@dbs2;

- リモート・オブジェクトが次のようなビューである場合。

CREATE VIEW v AS SELECT foo() a FROM ... ; -- foo returns a LOB
/* The local database then tries to get the CLOB data and returns an error */
SELECT a INTO varchar_buf FROM v@dbs2;

これによってサポートされていないリモートの一時LOBが発生するため、エラーが戻されます。

- RETURNING INTOでは、CHARとCLOBの間の暗黙的な変換はサポートされていません。

- 実引数がLOB型であり、リモート引数がVARCHAR2、NVARCHAR2、CHAR、NCHARまたはRAWである場合、PL/SQLパラメータの受渡しは許可されません。

PL/SQLにおけるリモート・データ・インタフェースの例

PL/SQLにおけるデータ・インタフェースでは、サイズが32KB未満のデータのみがサポートされています。次にPL/SQLの例を示します。

CONNECT pm
declare
my_ad varchar(6000) := lpad('b', 6000, 'b');
BEGIN
INSERT INTO print_media@dbs2(product_id, ad_id, ad_finaltext)
VALUES (10000, 10, my_ad);
-- Reset the buffer value
my_ad := 'a';
SELECT ad_finaltext INTO my_ad FROM print_media@dbs2
WHERE product_id = 10000;
END;
/

ad_finaltextがCLOBではなくBLOB列である場合、my_adはRAW型である必要があります。LOBのサイズが32KB - 1を超えている場合、PL/SQLでは切捨てエラーが発生し、バッファの内容は未定義になります。

OCIにおけるリモート・データ・インタフェースの例

OCIにおけるデータ・インタフェースでは、サイズが2GB未満(sb4として宣言された変数の可能な最大値)のデータのみがサポートされています。次の疑似コードは、OCIプログラムの一部として拡張できます。

...
text *sql = (text *)"insert into print_media@dbs2
(product_id, ad_id, ad_finaltext)
values (:1, :2, :3)";
OCIStmtPrepare(...);
OCIBindByPos(...); /* Bind data for positions 1 and 2
* which are independent of LOB */
OCIBindByPos(stmthp, &bndhp[2], errhp, (ub4) 3,
(dvoid *) charbuf1, (sb4) len_charbuf1, SQLT_CHR,
(dvoid *) 0, (ub2 *)0, (ub2 *)0, 0, 0, OCI_DEFAULT);
OCIStmtExecute(...);

...

text *sql = (text *)"select ad_finaltext from print_media@dbs2
where product_id = 10000";
OCIStmtPrepare(...);
OCIDefineByPos(stmthp, &dfnhp[2], errhp, (ub4) 1,
(dvoid *) charbuf2, (sb4) len_charbuf2, SQLT_CHR,
(dvoid *) 0, (ub2 *)0, (ub2 *)0, OCI_DEFAULT);
OCIStmtExecute(...);
...

ad_finaltextがCLOBではなくBLOBである場合、SQLT_BIN型を使用してバインドおよび定義します。LOBのサイズが2GB - 1を超えている場合、OCIでは切捨てエラーが発生し、バッファの内容は未定義になります。

JDBCにおけるリモート・データ・インタフェースの例

次のコード例は、3つのJDBCドライバ(データベース内のOCI、Thinおよびkprb)のすべてで機能します。

バインド:

非ストリーミング・モードの場合:

...
String sql = "insert into print_media@dbs2 (product_id, ad_id, ad_final_text)" +
" values (:1, :2, :3)";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setInt( 1, 2 );
pstmt.setInt( 2, 20);
pstmt.setString( 3, "Java string" );
int rows = pstmt.executeUpdate();
...

ストリーミング・モードの場合、前述と同じコードが機能しますが、setString()文は次のいずれかで置き換えられます。

pstmt.setCharacterStream( 3, new LabeledReader(), 1000000 );
pstmt.setAsciiStream( 3, new LabeledAsciiInputStream(), 1000000 );

ここで、LabeledReader()およびLabeledAsciiInputStream()により、それぞれ文字ストリームおよびASCIIストリームが生成されます。ad_finaltextがCLOBではなくBLOB列である場合、前述の例は、バインドがRAW型である場合に機能します。

pstmt.setBytes( 3, <some byte[] array> );

pstmt.setBinaryStream( 3, new LabeledInputStream(), 1000000 );

ここで、LabeledInputStream()によってバイナリ・ストリームが生成されます。

定義:

非ストリーミング・モードの場合:

OracleStatement stmt = (OracleStatement)(conn.createStatement());
stmt.defineColumnType( 1, Types.VARCHAR );
ResultSet rst = stmt.executeQuery("select ad_finaltext from print_media@dbs2" );
while( rst.next() )
{
String s = rst.getString( 1 );
System.out.println( s );
}

ストリーミング・モードの場合:

OracleStatement stmt = (OracleStatement)(conn.createStatement());
stmt.defineColumnType( 1, Types.LONGVARCHAR );
ResultSet rst = stmt.executeQuery("select ad_finaltext from print_media@dbs2" );
while( rst.next() )
{
Reader reader = rst.getCharacterStream( 1 );
while( reader.ready() )
{
System.out.print( (char)(reader.next()) );
}
System.out.println();
}

ad_finaltextがCLOBではなくBLOB列である場合、前述の例は、定義がLONGVARBINARY型である場合に機能します。

...
OracleStatement stmt = (OracleStatement)conn.createStatement();

stmt.defineColumnType( 1, Types.INTEGER );
stmt.defineColumnType( 2, Types.LONGVARBINARY );

ResultSet rset = stmt.executeQuery("SELECT ID, LOBCOL FROM LOBTAB@MYSELF");

while(rset.next())
{
/* using getBytes() */
/*
byte[] b = rset.getBytes("LOBCOL");
System.out.println("ID: " + rset.getInt("ID") + "  length: " + b.length);
*/

/* using getBinaryStream() */
InputStream byte_stream = rset.getBinaryStream("LOBCOL");
byte [] b = new byte [100000];
int b_len = byte_stream.read(b);
System.out.println("ID: " + rset.getInt("ID") + "  length: " + b_len);

byte_stream.close();
}
...

関連項目:
『Oracle Database JDBC開発者ガイドおよびリファレンス』の「LOBとBFILEの操作」、CLOBデータを挿入および取得するためのショートカットに関する項

21 BFILE操作用のLOB API

この章では、BFILEを使用する操作のためのAPIについて説明します。この章で説明するAPIのリストは、表21-1を参照してください。

この章では、操作ごとに次の項目について説明します。

- 「使用上の注意」では、特定のプログラム環境またはデータ型に固有の情報など、実装に関するガイドラインを示します。

- 「構文」では、サポートされているプログラム環境ごとに構文の参照先マニュアルを示します。

- 「例」では、サンプルの実行に必要な設定タスクについて説明します。掲載されているデモ・ファイルは、$ORACLE_HOME/rdbms/demo/lobs/のplsql、oci、vbおよびjavaという名前のサブディレクトリにあります。ドライバ・プログラムlobdemo.sqlは/plsqlにあり、ドライバ・プログラムlobdemo.cは/ociにあります。

注意:
LOB APIでは、BFILEへのデータのロードはサポートされません。BFILEにデータをロードする方法の詳細は、「SQL*Loaderを使用したLOBのロード」を参照してください。

この章の内容は次のとおりです。

- BFILE APIについてサポートされている環境

- BFILEへのアクセス

- ディレクトリ・オブジェクト

- BFILENAMEと初期化

- BFILEデータ型の特性

- BFILEセキュリティ

- LOBへのBFILEデータのロード

- OPENを使用したBFILEのオープン

- FILEOPENを使用したBFILEのオープン

- ISOPENを使用した、BFILEがオープンしているかどうかの確認

- FILEISOPENを使用した、BFILEがオープンしているかどうかの確認

- BFILEデータの表示

- BFILEからのデータの読取り

- SUBSTRを使用した、BFILEデータの一部の読取り

- 2つのBFILEの全体または一部の比較

- INSTRを使用した、BFILEにパターンが存在するかどうかの確認

- BFILEが存在するかどうかの確認

- BFILEの長さの取得

- BFILEロケータの割当て

- BFILEのディレクトリ・オブジェクト名とファイル名の取得

- 初期化したBFILEロケータを使用したBFILEの更新

- FILECLOSEを使用したBFILEのクローズ

- CLOSEを使用したBFILEのクローズ

- FILECLOSEALLを使用したオープン中のすべてのBFILEのクローズ

- BFILEを含む行の挿入

BFILE APIについてサポートされている環境

表21-1「BFILE APIについてサポートされている環境」に、この章で説明するAPIについてサポートされているプログラム環境を示します。第1列は、APIで実行される操作を示します。その他の列は、そのAPIがPL/SQL、OCI、COBOL、Pro*C/C++、COMおよびJDBCでサポートされているかどうかに応じて、「はい」または「いいえ」となっています。

表21-1 BFILE APIについてサポートされている環境

操作

PL/SQL

OCI

COBOL

Pro*C/C++

COM

JDBC

BFILEを含む行の挿入

はい

はい

はい

はい

はい

はい

LOBへのBFILEデータのロード

はい

はい

はい

はい

はい

はい

FILEOPENを使用したBFILEのオープン

はい

はい

いいえ

いいえ

いいえ

はい

OPENを使用したBFILEのオープン

はい

はい

はい

はい

はい

はい

ISOPENを使用した、BFILEがオープンしているかどうかの確認

はい

はい

はい

はい

はい

はい

FILEISOPENを使用した、BFILEがオープンしているかどうかの確認

はい

はい

いいえ

いいえ

いいえ

はい

BFILEデータの表示

はい

はい

はい

はい

はい

はい

BFILEからのデータの読取り

はい

はい

はい

はい

はい

はい

SUBSTRを使用した、BFILEデータの一部の読取り

はい

いいえ

はい

はい

はい

はい

2つのBFILEの全体または一部の比較

はい

いいえ

はい

はい

はい

はい

INSTRを使用した、BFILEにパターンが存在するかどうかの確認

はい

いいえ

はい

はい

いいえ

はい

BFILEが存在するかどうかの確認

はい

はい

はい

はい

はい

はい

BFILEの長さの取得

はい

はい

はい

はい

はい

はい

BFILEロケータの割当て

はい

はい

はい

はい

いいえ

はい

BFILEのディレクトリ・オブジェクト名とファイル名の取得

はい

はい

はい

はい

はい

はい

初期化したBFILEロケータを使用したBFILEの更新

はい

はい

はい

はい

はい

はい

FILECLOSEを使用したBFILEのクローズ

はい

はい

いいえ

いいえ

はい

はい

CLOSEを使用したBFILEのクローズ

はい

はい

はい

はい

はい

はい

FILECLOSEALLを使用したオープン中のすべてのBFILEのクローズ

はい

はい

はい

はい

はい

はい

BFILEへのアクセス

BFILEにアクセスするには、次のインタフェースのいずれかを使用します。

- OCI

- PL/SQL(DBMS_LOBパッケージ)

- Pro*C/C++やPro*COBOLなどのプリコンパイラ

- Oracle Objects for OLE (OO4O)

- Java(JDBC)

関連項目:
BFILEへのアクセス用にサポートされている環境の詳細は、第13章「LOB APIの概要」を参照してください。

ディレクトリ・オブジェクト

ディレクトリ・オブジェクトを使用すると、BFILEデータ型のアクセスと使用方法を管理できます。ディレクトリ・オブジェクトには、アクセスするファイルがあるデータベース・サーバー・ファイルシステム上の物理ディレクトリの論理的な別名を指定します。サーバーのファイルシステム内にあるファイルへは、ディレクトリ・オブジェクトに対する必要なアクセス権限が付与されている場合にかぎり、アクセスできます。Enterprise ManagerのWebコンソールを使用して、ディレクトリ・オブジェクトを管理することもできます。

関連項目:

- 『Oracle Database SQL言語リファレンス』のCREATE DIRECTORYに関する項

- 『Oracle Database 2日でデータベース管理者』を参照してください。WebベースのOracle Enterprise Manager Database Controlの説明を参照してください。

BFILEロケータの初期化

ディレクトリ・オブジェクトを使用すると、ファイルの位置を柔軟に扱えるようになり、アプリケーション内の物理ファイルの絶対パス名をハードコードしなくてもすみます。ディレクトリ・オブジェクト名は、BFILEロケータの初期化の際に、BFILENAMEファンクション(SQLおよびPL/SQL)またはOCILobFileSetName()(OCI)で使用されます。

注意:

データベースは、指定したディレクトリおよびパス名が実際に存在するかどうかは検証しません。ご使用のOSで有効なディレクトリを指定するよう注意してください。オペレーティング・システムがパス名の大/小文字を区別している場合は、必ず正しい形式でディレクトリを指定してください。最後のスラッシュを指定する必要はありません(たとえば、/tmp/ではなく、/tmpでもかまいません)。

ディレクトリの指定時には、「..」をパス内に含めることはできません(たとえば、/abc/def/hij..のようには指定できません)。

BFILEへのOSファイルの対応付け

OSファイルをBFILEに対応付けるために、まずOSファイルへのフルパス名の別名であるディレクトリ・オブジェクトを作成する必要があります。

既存のOSファイルを特定の表の関連するデータベース・レコードに対応付けるには、OracleのSQL DMLを使用します。次に例を示します。

- BFILEの列がサーバーのファイルシステム内の既存ファイルを参照するようにBFILEを初期化するには、INSERTを使用します。

- BFILEの参照ターゲットを変更するには、UPDATEを使用します。

- BFILENAMEファンクションを使用して、BFILEをNULLに初期化してから、後でOSファイルを参照するように更新します。

- OCIユーザーの場合、OCILobFileSetName()を使用して、INSERT文のVALUES句で使用されるBFILEロケータ変数を初期化することもできます。

ディレクトリの例

次の文では、ファイルImage1.gifおよびimage2.gifをそれぞれkey_valueが21および22のレコードに対応付けます。'IMGは、Image1.gifおよびimage2.gifが格納される物理ディレクトリを示すディレクトリ・オブジェクトです。

次のようなデータ構造を設定しないと機能しない場合もあります。

CREATE TABLE Lob_table (
Key_value NUMBER NOT NULL,
F_lob BFILE)
INSERT INTO Lob_table VALUES
(21,  BFILENAME('IMG', 'Image1.gif'));
INSERT INTO Lob_table VALUES
(22, BFILENAME('IMG', 'image2.gif'));

次のUPDATE文は、key_valueが22の行の場合にターゲット・ファイルをimage3.gifに変更します。

UPDATE Lob_table SET f_lob = BFILENAME('IMG', 'image3.gif')
WHERE Key_value = 22;

注意:

データベースは、ディレクトリ・オブジェクトで指定された環境変数、またはBFILEロケータのファイル名を拡張しません。たとえば、次のように指定するとします。

BFILENAME('WORK_DIR', '$MY_FILE')

MY_FILEは、オペレーティング・システムで定義された環境変数であり、無効です。

BFILENAMEと初期化

BFILENAMEは、BFILE列が外部ファイルを参照するようにBFILEを初期化するために使用する組込みファンクションです。

SQL DMLを使用して物理ファイルがレコードに対応付けられると、BFILEに対するその後の読取り操作は、PL/SQLのDBMS_LOBパッケージおよびOCIを使用して実行できます。ただし、これらのファイルは、BFILEを介してアクセスされる場合は読取り専用であるため、BFILEによる更新または削除はできません。

BFILEは参照セマンティクスであるため、同一レコード内または異なるレコード内に、同じファイルを参照する複数のBFILE列を持つことができます。たとえば、次のUPDATE文は、lob_table内でkey_valueが21の行を持つBFILEが、key_valueが22の行と同じファイルを参照するように設定します。

UPDATE lob_table
SET f_lob = (SELECT f_lob FROM lob_table WHERE key_value = 22)
WHERE key_value = 21;

初期化という点からBFILENAMEを考えてみます。このファンクションは、次の値を初期化できます。

- BFILE列

- PL/SQLモジュール内で宣言されるBFILE(自動)変数

BFILEデータ型の特性

BFILEデータ型を使用すると次のメリットがあります。

- 特定のBFILEが、一時的に、操作中のモジュール内にかぎり必要な場合、データベース内の列に対応付けることなく、BFILE関連のAPIを変数に対して使用できます。

- サーバー側の表にBFILE列を作成し、列の値を初期化した後、SELECTを使用してその列の値を取り出す必要がないため、サーバーへのラウンドトリップの必要がなくなります。

詳細は、DBMS_LOB.LOADFROMFILEの例を参照してください(「LOBへのBFILEデータのロード」を参照)。

OCIでBFILENAMEに相当するものはOCILobFileSetName()であり、同様に使用できます。

ディレクトリ名の指定

ディレクトリを作成するには、CREATE ANY DIRECTORYシステム権限が必要です。パス名に2つのピリオド(「..」)を含めることはできません。ディレクトリ・オブジェクトのネーミング規則は、表および索引のネーミング規則と同じです。つまり、通常の識別子は大文字で解釈されますが、デリミタ付き識別子はそのまま解釈されます。たとえば、次のような文があるとします。

CREATE OR REPLACE DIRECTORY scott_dir AS '/usr/home/scott';

この文は、「SCOTT_DIR」という名前(大文字)のディレクトリ・オブジェクトを作成または再定義します。ただし、次の文のように、ディレクトリ名にデリミタ付き識別子が使用されるとします。

CREATE DIRECTORY "Mary_Dir" AS '/usr/home/mary';

ディレクトリ・オブジェクトの名前は「Mary_Dir」になります。BFILENAMEをコールするときは、「SCOTT_DIR」および「Mary_Dir」を使用します。次に例を示します。

BFILENAME('SCOTT_DIR', 'afile')
BFILENAME('Mary_Dir', 'afile')

Windowsプラットフォーム上の場合

Windowsプラットフォーム上では、ディレクトリ名の大/小文字が区別されません。したがって、次の2つの文は同じディレクトリを表します。

CREATE DIRECTORY "big_cap_dir" AS "g:\data\source";

CREATE DIRECTORY "small_cap_dir" AS "G:\DATA\SOURCE";

BFILEセキュリティ

この項では、BFILEセキュリティ・モデルおよびそれに対応付けられたSQL文について説明します。BFILEセキュリティに関係する主なSQL文は、次のとおりです。

- SQL DDL: ディレクトリ・オブジェクトのCREATEおよびREPLACEまたはALTER

- SQL DML: ディレクトリ・オブジェクトに対するREADシステム権限およびオブジェクト権限のGRANTおよびREVOKE

所有権および権限

ディレクトリ・オブジェクトは、システム所有のオブジェクトです。システム所有のオブジェクトの詳細は、『Oracle Database SQL言語リファレンス』を参照してください。Oracle Databaseでは、次の2つの新しいシステム権限をサポートしており、これらはDBAのみに付与されます。

- CREATE ANY DIRECTORY: ディレクトリ・オブジェクトの作成または変更用

- DROP ANY DIRECTORY: ディレクトリ・オブジェクトの削除用

ディレクトリ・オブジェクトに対する読取り権限

ディレクトリ・オブジェクトに対するREAD権限によって、そのディレクトリ下に置かれたファイルを読み取ることができます。ディレクトリ・オブジェクトの作成者には、READ権限が自動的に付与されます。

GRANTオプション付きのREAD権限を付与されている場合は、その権限を他のユーザーやロールに付与して、自分の権限ドメインに追加することもできます。

注意:
READ権限は、個々のファイルではなくディレクトリ・オブジェクトのみに定義されます。したがって、同じディレクトリ内のファイルに異なる権限を割り当てることはできません。

表される物理ディレクトリは、Oracleサーバー・プロセスに必要な、対応するオペレーティング・システム権限(この場合は読取り権限)が含まれていない場合もあります。

DBAは、次のことを確認する必要があります。

- 物理ディレクトリの存在

- ファイル、ディレクトリ、ディレクトリへのパスで、Oracleサーバー・プロセスに対する読取り権限が有効であること

- データベース・ユーザーがファイルにアクセスする間は終始、ディレクトリが使用可能な状態であり、読取り権限も有効であること

ここでの権限とは、単にOracleサーバーがそのディレクトリ内のファイルを読むことができるということです。これらの権限は、実際のファイル操作時に、PL/SQLのDBMS_LOBパッケージおよびOCI APIによってチェックおよび施行されます。

注意:

CREATE ANY DIRECTORY権限およびDROP ANY DIRECTORY権限によって、サーバーのファイルシステムがすべてのデータベース・ユーザーに公開される可能性があるため、DBAは、セキュリティ違反を防止するため、一般のデータベース・ユーザーに対するこれらの権限の付与は慎重に行う必要があります。

BFILE固有のSQL DDLのセキュリティ

ディレクトリ・オブジェクトを作成、置換、削除する次のSQL DDL文の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

- CREATE DIRECTORY

- DROP DIRECTORY

BFILE固有のSQL DMLのセキュリティ

BFILEに対してセキュリティを提供する次のSQL DML文の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

- GRANT(システム権限)

- GRANT(オブジェクト権限)

- REVOKE(システム権限)

- REVOKE(オブジェクト権限)

- AUDIT(新規文)

- AUDIT(スキーマ・オブジェクト)

ディレクトリのカタログ・ビュー

カタログ・ビューは、ディレクトリ・オブジェクト用に提供され、これによってユーザーは、オブジェクトの名前、および対応するパスおよび権限を参照できます。サポートされるビューは次のとおりです。

- ALL_DIRECTORIES(OWNER、DIRECTORY_NAME、DIRECTORY_PATH)
このビューには、ユーザーがアクセスできるすべてのディレクトリが記述されます。

- DBA_DIRECTORIES(OWNER、DIRECTORY_NAME、DIRECTORY_PATH)
このビューには、データベース全体について指定されたすべてのディレクトリが記述されます。

ディレクトリ・オブジェクト使用のガイドライン

ディレクトリ機能の主な目的は、サーバーのファイルシステム内の大きなファイルへのアクセスをDBAが管理するうえで、単純で柔軟性があり、既存アプリケーションの変更が不要で、安全性の高いメカニズムを使用可能にすることです。ただし、この目的を実現するには、DBAがディレクトリ・オブジェクトの使用時に次のガイドラインに従うことが非常に重要です。

- ディレクトリ・オブジェクトは、データファイルのディレクトリにマップしないでください。ディレクトリ・オブジェクトは、Oracleデータファイル、制御ファイル、ログ・ファイルおよび他のシステム・ファイルを含む物理ディレクトリにマップしないでください。これらのファイルを(不意にまたはなんらかの理由で)変更すると、データベースまたはサーバーのOSが破損する場合があります。

- DBAのみがシステム権限を持つ必要があります。CREATE ANY DIRECTORYなどのシステム権限(DBAにあらかじめ付与される)を他のユーザーに付与する場合は、慎重に行ってください。多くの場合、データベース管理者のみが、これらの権限を持ちます。

- DIRECTORY権限を付与するときには、十分な注意が必要です。ディレクトリ・オブジェクトへの権限を他のユーザーに付与する場合は、注意が必要です。同様に、権限をユーザーに付与するときは、WITH GRANT OPTION句の使用にも注意が必要です。

- データベースの運用中に、ディレクトリ・オブジェクトを削除または置換しないでください。ディレクトリ・オブジェクトは、安易な判断でデータベース運用中に削除または置換しないようにします。ディレクトリ・オブジェクトを削除または置換した場合、このディレクトリ・オブジェクトに対応付けられているすべてのファイルのすべてのセッションからの操作が正常に実行されなくなります。さらに、これらのファイルを正常にクローズする前にDROPコマンドまたはREPLACEコマンドを実行した場合は、プログラムにおけるこれらのファイルへの参照が失われ、これらのファイルに対応付けられているシステム・リソースも、セッションを停止するまで解放されなくなります。
この場合、PL/SQLユーザーに可能な手段は、たとえばDBMS_LOB.FILECLOSEALLをコールするプログラム・ブロックを実行してファイル操作を再開するか、または各セッションをすべて終了するかのいずれかです。したがって、これらのコマンドは慎重に使用し、できればメンテナンスの停止時間中に使用します。

- ユーザーのDIRECTORYオブジェクト権限を取り消すときには、十分な注意が必要です。REVOKE文を使用してユーザーのDIRECTORYオブジェクト権限を取り消した場合、ユーザーのセッションに依存するファイルへの、その後の操作が正常に実行されません。ユーザーは、権限を再取得してファイルをクローズするか、またはセッションでFILECLOSEALLを実行し、ファイル操作を再開する必要があります。

一般的に、ファイル・アクセスの管理にディレクトリ・オブジェクトを使用することは、OSレベルでのシステム管理作業の延長です。ファイルは、計画を立てることによって、Oracleプロセス用のREAD権限を持つ適切なディレクトリに論理的に構成できます。

これらの物理ファイルにマップするREAD権限とともにディレクトリ・オブジェクトを作成し、特定のデータベース・ユーザーにこれらのディレクトリへのアクセス権限を付与できます。

共有サーバー(マルチスレッド・サーバー)・モードのBFILE

データベースでは、共有サーバー(マルチスレッド・サーバー)・モードでのBFILEデータ型のセッション移行がサポートされません。これは、オープンされたBFILEインスタンスに対する操作を、共有サーバーへのコール終了後も継続できることを意味します。

BFILE操作が含まれる共有サーバーのセッションは、1台の共有サーバーに限定され、サーバー間での移行はできません。

外部LOB(BFILE)ロケータ

BFILEでは、値はサーバー側のOSファイル(データベースの外部)に格納されます。そのファイルを参照するBFILEロケータは、インラインに格納されます。

BFILE表内の2つの行が同じファイルを参照するとき

DBMS_LOB.FILEOPENで使用されるBFILEロケータ変数(たとえば、L1)が、別のロケータ変数(たとえば、L2)に割り当てられる場合、L1とL2の両方が同じファイルを示します。つまり、BFILE列がある1つの表の2つの行が、同じファイルまたは別の2つのファイルを参照できるということです。この点は、賢明な開発者にとってはメリットになりますが、不注意な開発者にとっては落とし穴にもなりかねません。

BFILEロケータ変数

BFILEロケータ変数は、他の自動変数と同じように機能します。ファイル操作の場合の動作は、ほとんどの従来型プログラム言語の標準入出力ライブラリの一部として使用可能なファイル・ディスクリプタと同様です。BFILEロケータを定義および初期化し、このロケータによって参照されるファイルをオープンした場合、このファイルをクローズするまでのすべての操作は、このロケータまたはこのロケータのローカル・コピーを使用して、同じプログラム・ブロック内から実行する必要があることを意味します。

BFILE固有のガイドライン

BFILEを操作するときのガイドラインは、次のとおりです。

- ファイルは、同じネスト・レベルにある、同じプログラム・ブロックからオープンおよびクローズします。BFILEロケータ変数は、スカラーと同様、他のプロシージャ、メンバー・メソッドまたは外部関数コールアウトのパラメータとして使用できます。ただし、ファイルのオープンおよびクローズは、同じネスト・レベルにある、同じプログラム・ブロックから行うことをお薦めします。

- オブジェクトをデータベースにフラッシュする前にBFILE値を設定します。オブジェクトにBFILEが含まれる場合は、オブジェクトをデータベースにフラッシュする前にBFILE値を設定し、新しい行を挿入する必要があります。つまり、OCIObjectNew()とOCIObjectFlush()の間にOCILobFileSetName()をコールする必要があります。

- BFILEを挿入または更新する前に、ディレクトリ・オブジェクト名およびファイル名を指定します。ディレクトリ・オブジェクト名とファイル名を指定せずにBFILEを挿入または更新すると、エラーになります。
この規則は、INSERT文またはUPDATE文でBFILEに対してOCIバインド変数を使用するユーザーにも適用されます。OCIバインド変数は、挿入または更新の文を発行する前に、ディレクトリ・オブジェクト名とファイル名で初期化する必要があります。

- 挿入または更新する前にBFILEを初期化します。

注意:
OCISetAttr()では、BFILEロケータをNULLに設定できません。

- BFILEを持つ行を挿入または更新するためのSQLを使用する前に、BFILEを次のいずれかに初期化する必要があります。

- NULL(OCIバインド変数を使用している場合は不可)

- ディレクトリ・オブジェクト名とファイル名

- パス名の指定のどこにも2つのピリオド(「..」)を含めることはできません。ファイル名の最初に2つのピリオドを使用することもできません。

LOBへのBFILEデータのロード

この項では、BFILEのデータをLOBにロードする方法について説明します。

関連項目:
BFILE操作と各プログラム環境で提供されるAPIのリストは、表21-1「BFILE APIについてサポートされている環境」を参照してください。
この章のBFILEファンクションの操作の詳細は、『Oracle Database JDBC開発者ガイドおよびリファレンス』を参照してください。

事前条件

このプロシージャをコールする前に、次の事前条件を満たしている必要があります。

- ソースBFILEインスタンスが存在すること。

- 宛先のLOBインスタンスが存在すること。

使用上の注意

注意:
LOADBLOBFROMFILEおよびLOADCLOBFROMFILEプロシージャによって、このプロシージャの機能が実装されるため、バイナリ・データおよび文字データのロード機能が向上します。機能が向上したプロシージャは、PL/SQL環境でのみ使用できます。可能なかぎり、機能が向上したプロシージャを使用することをお薦めします。詳細は、「BLOBへのBFILEデータのロード」および「CLOBまたはNCLOBへのBFILEデータのロード」を参照してください。

キャラクタ・セットの変換

OCI、またはOCI機能にアクセスする任意のプログラム環境を使用すると、キャラクタ・セット間を翻訳するとき、キャラクタ・セット変換が暗黙的に実行されます。

BFILEからCLOBまたはNCLOBへのロード: バイナリ・データからキャラクタ・セットへの変換

DBMS_LOB.LOADFROMFILEプロシージャを使用してCLOBまたはNCLOBに移入する場合は、BFILEのバイナリ・データをLOBに移入することになります。バイナリ・データからキャラクタ・セットへは、暗黙的な翻訳は実行されません。このため、テキストをロードする場合はLOADCLOBFROMFILEプロシージャを使用します(「CLOBまたはNCLOBへのBFILEデータのロード」を参照)。

関連項目:
キャラクタ・セット変換の問題点は、『Oracle Databaseグローバリゼーション・サポート・ガイド』を参照してください。

量パラメータ

量パラメータには、次の注意事項があります。

- DBMS_LOB.LOADFROMFILE
BFILE全体をロードする場合は、DBMS_LOB.LOBMAXSIZE定数を渡すことができます。他の値を渡す場合、値はBFILEのサイズ以下である必要があります。

- OCILobLoadFromFile()
BFILE全体をロードする場合は、UB4MAXVAL定数を渡すことができます。他の値を渡す場合、値はBFILEのサイズ以下である必要があります。

- OCILobLoadFromFile2()
BFILE全体をロードする場合は、UB8MAXVAL定数を渡すことができます。他の値を渡す場合、値はBFILEのサイズ以下である必要があります。

関連項目:
量パラメータの最大値の詳細は、表22-2「ファイルからのロード操作用の最大LOBサイズ」を参照してください。

構文

各プログラム環境における構文については、次のマニュアルの項を参照してください。

- PL/SQL(DBMS_LOB): 『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』の「DBMS_LOB」の「LOADFROMFILE」

- C (OCI): 『Oracle Call Interfaceプログラマーズ・ガイド』の第7章「LOBとFILEの操作」の使用上の注意と例に関する項。第16章、LOB関数のOCILobLoadFromFile2()に関する項。

- COBOL(Pro*COBOL): 『Pro*COBOLプログラマーズ・ガイド』のLOBの詳細、LOB文の使用上の注意および「埋込みSQLおよびプリコンパイラ・ディレクティブ」。

- C/C++(Pro*C/C++): 『Pro*C/C++プログラマーズ・ガイド』の「ラージ・オブジェクト(LOB)」、「LOB文」および「埋込みSQL文およびディレクティブ」の「LOB LOAD」

- COM(OO4O): 『Oracle Objects for OLE開発者ガイド』

- Java(JDBC): 『Oracle Database JDBC開発者ガイドおよびリファレンス』の「LOBとBFILEの操作」の「BFILEの操作」

例

次のプログラム環境での例を示します。

- PL/SQL(DBMS_LOB): floaddat.sql

- OCI: floaddat.c

- COM(OO4O): floaddat.bas

- Java(JDBC): 例は提供されません。

OPENを使用したBFILEのオープン

この項では、OPENファンクションを使用してBFILEをオープンする方法について説明します。

注意:
BFILEをオープンするには、FILEOPENファンクションを使用する方法もありますが、新規に開発する場合にはOPENファンクションを使用することをお薦めします。FILEOPENファンクションを使用する方法は、「FILEOPENを使用したBFILEのオープン」を参照してください。

関連項目:
BFILE操作と各プログラム環境で提供されるAPIのリストは、表21-1「BFILE APIについてサポートされている環境」を参照してください。

構文

各プログラム環境における構文については、次のマニュアルの項を参照してください。

- PL/SQL(DBMS_LOB): 『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』の「DBMS_LOB」の「OPEN」

- C (OCI): 『Oracle Call Interfaceプログラマーズ・ガイド』の第7章「LOBとBFILEの操作」の使用上の注意に関する項。第16章、LOB関数のOCILobOpen()、OCILobClose()に関する項。

- COBOL(Pro*COBOL): 『Pro*COBOLプログラマーズ・ガイド』のLOBの詳細、LOB文の使用上の注意および「埋込みSQLおよびプリコンパイラ・ディレクティブ」の「LOB OPEN」

- C/C++(Pro*C/C++): 『Pro*C/C++プログラマーズ・ガイド』の「ラージ・オブジェクト(LOB)」、「LOB文」および「埋込みSQL文およびディレクティブ」の「LOB OPEN」

- COM(OO4O): 『Oracle Objects for OLE開発者ガイド』

- Java(JDBC): 『Oracle Database JDBC開発者ガイドおよびリファレンス』の「LOBとBFILEの操作」の「BFILEの操作」

使用例

次の例では、OSファイルADPHOTO_DIRのイメージをオープンします。

例

次のプログラム環境での例を示します。

- PL/SQL(DBMS_LOB): fopen.sql

- OCI: fopen.c

- COM(OO4O): fopen.bas

- Java(JDBC): fopen.java

FILEOPENを使用したBFILEのオープン

この項では、FILEOPENファンクションを使用してBFILEをオープンする方法について説明します。

注意:
新規アプリケーション開発には、FILEOPENファンクションをお薦めしません。OPENファンクションを使用することをお薦めします。「OPENを使用したBFILEのオープン」を参照してください。

関連項目:
BFILE操作と各プログラム環境で提供されるAPIのリストは、表21-1「BFILE APIについてサポートされている環境」を参照してください。

BFILEオープン時の使用上の注意

従来のFILEOPENフォームも引き続き使用できますが、今後の拡張が容易になるため、OPENに切り替えることをお薦めします。

構文

各プログラム環境における構文については、次のマニュアルの項を参照してください。

- PL/SQL(DBMS_LOB): 『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』の「DBMS_LOB」、FILEOPENおよびFILECLOSEに関する項

- C (OCI): 『Oracle Call Interfaceプログラマーズ・ガイド』の第7章「LOBとBFILEの操作」の使用上の注意に関する項。第16章、LOB関数のOCILobFileOpen()、OCILobFileClose()、OCILobFileSetName()に関する項。

- COBOL(Pro*COBOL): 参照マニュアルはありません。

- C/C++(Pro*C/C++): 参照マニュアルはありません。

- COM(OO4O): 参照マニュアルはありません。

- Java(JDBC): 『Oracle Database JDBC開発者ガイドおよびリファレンス』の「LOBとBFILEの操作」の「BFILEの操作」

BFILEのオープンの使用例

これらの例では、ディレクトリ・オブジェクトMEDIA_DIRでkeyboard_logo.jpgを開きます。

例

次のプログラム環境での例を示します。

- PL/SQL(DBMS_LOB): ffilopen.sql

- OCI: ffilopen.c

- Java(JDBC): ffilopen.java

ISOPENを使用した、BFILEがオープンしているかどうかの確認

この項では、ISOPENを使用して、BFILEがオープンしているかどうかを確認する方法について説明します。

注意:
新規アプリケーション開発には、このファンクション(ISOPEN)をお薦めします。「FILEISOPENを使用した、BFILEがオープンしているかどうかの確認」で説明されている従来のFILEISOPENは、新しく開発するときには推奨されません。

関連項目:
BFILE操作と各プログラム環境で提供されるAPIのリストは、表21-1「BFILE APIについてサポートされている環境」を参照してください。

構文

各プログラム環境における構文については、次のマニュアルの項を参照してください。

- PL/SQL(DBMS_LOB): 『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』の「DBMS_LOB」の「ISOPEN」

- C (OCI): 『Oracle Call Interfaceプログラマーズ・ガイド』の第7章「LOBとBFILEの操作」の使用上の注意に関する項。第16章、LOB関数のOCILobFileIsOpen()に関する項。

- COBOL(Pro*COBOL): 『Pro*COBOLプログラマーズ・ガイド』のLOBの詳細、LOB文の使用上の注意、および「埋込みSQLおよびプリコンパイラ・ディレクティブ」のLOB DESCRIBE ...ISOPENに関する項

- C/C++ (Pro*C/C++): 『Pro*C/C++プログラマーズ・ガイド』の「ラージ・オブジェクト(LOB)」、「LOB文」、および「埋込みSQL文およびディレクティブ」のLOB DESCRIBE ... ISOPENに関する項

- COM(OO4O): 『Oracle Objects for OLE開発者ガイド』

- Java(JDBC): 『Oracle Database JDBC開発者ガイドおよびリファレンス』の「LOBとBFILEの操作」の「BFILEの操作」

例

次のプログラム環境での例を示します。

- PL/SQL(DBMS_LOB): fisopen.sql

- OCI: fisopen.c

- COM(OO4O): fisopen.bas

- Java(JDBC): fisopen.java

FILEISOPENを使用した、BFILEがオープンしているかどうかの確認

この項では、FILEISOPENファンクションを使用して、BFILEがオープンしているかどうかを確認する方法について説明します。

注意:
新規アプリケーション開発には、FILEISOPENファンクションをお薦めしません。ISOPENファンクションを使用することをお薦めします。「ISOPENを使用した、BFILEがオープンしているかどうかの確認」を参照してください。

関連項目:
BFILE操作と各プログラム環境で提供されるAPIのリストは、表21-1「BFILE APIについてサポートされている環境」を参照してください。

使用上の注意

従来のFILEISOPENフォームも引き続き使用できますが、今後の拡張が容易になるため、ISOPENに切り替えることをお薦めします。

構文

各プログラム環境における構文については、次のマニュアルの項を参照してください。

- PL/SQL(DBMS_LOB): 『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』の「DBMS_LOB」の「FILEISOPEN」

- C (OCI): 『Oracle Call Interfaceプログラマーズ・ガイド』の第7章「LOBとBFILEの操作」の使用上の注意に関する項。第16章、LOB関数のOCILobFileIsOpen()に関する項。

- COBOL(Pro*COBOL): 参照マニュアルはありません。

- C/C++(Pro*C/C++): 参照マニュアルはありません。

- COM(OO4O): 参照マニュアルはありません。

- Java(JDBC): 『Oracle Database JDBC開発者ガイドおよびリファレンス』の「LOBとBFILEの操作」の「BFILEの操作」

使用例

次の例では、ad_graphicに対応付けられているBFILEがオープンしているかどうかを問い合せます。

例

次のプログラム環境での例を示します。

- PL/SQL(DBMS_LOB): ffisopen.sql

- OCI: ffisopen.c

- Java(JDBC): ffisopen.java

BFILEデータの表示

この項では、BFILEデータを表示する方法について説明します。

関連項目:
BFILE操作と各プログラム環境で提供されるAPIのリストは、表21-1「BFILE APIについてサポートされている環境」を参照してください。

構文

各プログラム環境における構文については、次のマニュアルの項を参照してください。

- PL/SQL(DBMS_LOB): 『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』の「DBMS_LOB」、READに関する項。第29章「DBMS_OUTPUT」の「PUT_LINE」

- C (OCI): 『Oracle Call Interfaceプログラマーズ・ガイド』の第7章「LOBとBFILEの操作」の使用上の注意に関する項。第16章、LOB関数のOCILobFileOpen()、OCILobRead2()に関する項。

- COBOL(Pro*COBOL): 『Pro*COBOLプログラマーズ・ガイド』のLOBの詳細、LOB文の使用上の注意および「埋込みSQLおよびプリコンパイラ・ディレクティブ」の「LOB READ」および「DISPLAY」

- C/C++(Pro*C/C++): 『Pro*C/C++プログラマーズ・ガイド』の「ラージ・オブジェクト(LOB)」および「LOB文」の「READ」

- COM(OO4O): 『Oracle Objects for OLE開発者ガイド』

- Java (JDBC): 『Oracle Database JDBC開発者ガイドおよびリファレンス』の第7章「LOBとBFILEの操作」のBFILEの操作に関する項。

例

次のプログラム環境での例を示します。

- PL/SQL(DBMS_LOB): fdisplay.sql

- OCI: fdisplay.c

- Java(JDBC): fdisplay.java

BFILEからのデータの読取り

この項では、BFILEからデータを読み取る方法について説明します。

関連項目:
BFILE操作と各プログラム環境で提供されるAPIのリストは、表21-1「BFILE APIについてサポートされている環境」を参照してください。

使用上の注意

この操作を使用する場合は、次のことに注意してください。

OCIでのストリーム読取り

大量のBFILEデータを最も効率よく読み取るには、ストリーム・メカニズムを有効にしたOCILobRead2()でポーリングまたはコールバックを使用します。そのためには、次のようにoffsetパラメータを使用して読取り開始位置を指定します。

ub8  char_amt =  0;
ub8  byte_amt =  0;
ub4  offset = 1000;

OCILobRead2(svchp, errhp, locp, &byte_amt, &char_amt, offset, bufp, bufl,
OCI_ONE_PIECE, 0, 0, 0, 0);

ポーリング・モードを使用した場合は、各OCILobRead2()コール後にbyte_amtパラメータの値を調べて、バッファに何バイト読み取られたかを確認してください。これは、バッファがいっぱいになっていない場合があるためです。

コールバックを使用すると、コールバックへの入力であるlenpパラメータにバッファに格納されたバイト数が示されます。バッファの空き領域を確認するために、コールバック処理時にはlenpパラメータを必ずチェックしてください(『Oracle Call Interfaceプログラマーズ・ガイド』を参照)。

量パラメータ

- DBMS_LOB.READをコールするとき、量パラメータをデータのサイズより大きくすることはできますが、量パラメータはバッファのサイズ以下にする必要があります。PL/SQLで、バッファサイズの上限は32Kです。

- BFILEの終わりまで読み取る場合は、OCILobRead2()のコール時にbyte_amtパラメータに値0(ゼロ)を渡すことができます。

構文

各プログラム環境における構文については、次のマニュアルの項を参照してください。

- PL/SQL(DBMS_LOB): 『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』の「DBMS_LOB」の「READ」

- C (OCI): 『Oracle Call Interfaceプログラマーズ・ガイド』の第7章「LOBとBFILEの操作」の使用上の注意に関する項。第16章、LOB関数のOCILobRead2()に関する項。

- COBOL(Pro*COBOL): 『Pro*COBOLプログラマーズ・ガイド』のLOBの詳細、LOB文の使用上の注意および「埋込みSQLおよびプリコンパイラ・ディレクティブ」の「LOB READ」

- C/C++(Pro*C/C++): 『Pro*C/C++プログラマーズ・ガイド』の「ラージ・オブジェクト(LOB)」、「LOB文」および「埋込みSQL文およびディレクティブ」の「LOB READ」

- COM(OO4O): 『Oracle Objects for OLE開発者ガイド』

- Java(JDBC): 『Oracle Database JDBC開発者ガイドおよびリファレンス』の第7章「LOBとBFILEの操作」の「BFILEの操作」

例

次のプログラム環境での例を示します。

- PL/SQL(DBMS_LOB): fread.sql

- OCI: fread.c

- COM(OO4O): fread.bas

- Java(JDBC): fread.java

SUBSTRを使用した、BFILEデータの一部の読取り

この項では、SUBSTRを使用してBFILEデータの一部を読み取る方法について説明します。

関連項目:
BFILE操作と各プログラム環境で提供されるAPIのリストは、表21-1「BFILE APIについてサポートされている環境」を参照してください。

構文

各プログラム環境における構文については、次のマニュアルの項を参照してください。

- PL/SQL(DBMS_LOB): 『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』の「DBMS_LOB」の「SUBSTR」

- OCI: 参照マニュアルはありません。

- COBOL(Pro*COBOL): 『Pro*COBOLプログラマーズ・ガイド』のLOBの詳細、LOB文の使用上の注意および「埋込みSQLおよびプリコンパイラ・ディレクティブ」の「LOB OPEN」および「LOB CLOSE」。『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』のDBMS_LOB.SUBSTRに関する項も参照。

- C/C++(Pro*C/C++): 『Pro*C/C++プログラマーズ・ガイド』の「ラージ・オブジェクト(LOB)」、「LOB文」および「埋込みSQL文およびディレクティブ」の「LOB OPEN」「PL/SQL DBMS_LOB.SUBSTR」も参照

- COM(OO4O): 『Oracle Objects for OLE開発者ガイド』

- Java(JDBC): 『Oracle Database JDBC開発者ガイドおよびリファレンス』の第7章「LOBとBFILEの操作」の「BFILEの操作」

例

次のプログラム環境での例を示します。

- PL/SQL(DBMS_LOB): freadprt.sql

- C(OCI): 今回のリリースでは例は提供されません。

- COM(OO4O): freadprt.bas

- Java(JDBC): freadprt.java

2つのBFILEの全体または一部の比較

この項では、2つのBFILEの全体または一部を比較する方法について説明します。

関連項目:
BFILE操作と各プログラム環境で提供されるAPIのリストは、表21-1「BFILE APIについてサポートされている環境」を参照してください。

構文

各プログラム環境における構文については、次のマニュアルの項を参照してください。

- PL/SQL(DBMS_LOB): 『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』の「DBMS_LOB」の「COMPARE」

- C(OCI): 参照マニュアルはありません。

- COBOL(Pro*COBOL): 『Pro*COBOLプログラマーズ・ガイド』のLOBの詳細、LOB文の使用上の注意および「埋込みSQLおよびプリコンパイラ・ディレクティブ」の「LOB OPEN」。『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』のDBMS_LOB.COMPAREに関する項も参照。

- C/C++(Pro*C/C++): 『Pro*C/C++プログラマーズ・ガイド』の「ラージ・オブジェクト(LOB)」、「LOB文」および「埋込みSQL文およびディレクティブ」の「LOB OPEN」『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』のDBMS_LOB.COMPAREに関する項も参照。

- COM(OO4O): 『Oracle Objects for OLE開発者ガイド』

- Java(JDBC): 『Oracle Database JDBC開発者ガイドおよびリファレンス』の「LOBとBFILEの操作」の「BFILEの操作」

例

次のプログラム環境での例を示します。

- PL/SQL(DBMS_LOB): fcompare.sql

- OCI: 今回のリリースでは例は提供されません。

- COM(OO4O): fcompare.bas

- Java(JDBC): fcompare.java

INSTRを使用した、BFILEにパターンが存在するかどうかの確認

この項では、INSTRを使用して、BFILEにパターンが存在するかどうかを確認する方法について説明します。

関連項目:
BFILE操作と各プログラム環境で提供されるAPIのリストは、表21-1「BFILE APIについてサポートされている環境」を参照してください。

構文

各プログラム環境における構文については、次のマニュアルの項を参照してください。

- PL/SQL(DBMS_LOB): 『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』の「DBMS_LOB」の「INSTR」

- C(OCI): 参照マニュアルはありません。

- COBOL(Pro*COBOL): 『Pro*COBOLプログラマーズ・ガイド』のLOBの詳細、LOB文の使用上の注意および「埋込みSQLおよびプリコンパイラ・ディレクティブ」の「LOB OPEN」。『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』のDBMS_LOB.INSTRに関する項も参照。

- C/C++(Pro*C/C++): 『Pro*C/C++プログラマーズ・ガイド』の「ラージ・オブジェクト(LOB)」、「LOB文」および「埋込みSQL文およびディレクティブ」の「LOB OPEN」『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』のDBMS_LOB.INSTRに関する項も参照。

- COM(OO4O): 参照マニュアルはありません。

- Java(JDBC): 『Oracle Database JDBC開発者ガイドおよびリファレンス』の「LOBとBFILEの操作」の「BFILEの操作」

例

次のプログラム環境での例を示します。

- PL/SQL(DBMS_LOB): fpattern.sql

- OCI: 今回のリリースでは例は提供されません。

- COM(OO4O): 今回のリリースでは例は提供されません。

- Java(JDBC): fpattern.java

BFILEが存在するかどうかの確認

このプロシージャでは、BFILEロケータが有効なBFILEインスタンスを指しているかどうかを確認します。

関連項目:
BFILE操作と各プログラム環境で提供されるAPIのリストは、表21-1「BFILE APIについてサポートされている環境」を参照してください。

構文

各プログラム環境における構文については、次のマニュアルの項を参照してください。

- PL/SQL(DBMS_LOB): 『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』の「DBMS_LOB」の「FILEEXISTS」

- C (OCI): 『Oracle Call Interfaceプログラマーズ・ガイド』の第7章「LOBとBFILEの操作」の使用上の注意に関する項。第16章、LOB関数のOCILobFileExists()に関する項。

- COBOL(Pro*COBOL): 『Pro*COBOLプログラマーズ・ガイド』のLOBの詳細、LOB文の使用上の注意、および「埋込みSQLおよびプリコンパイラ・ディレクティブ」のLOB DESCRIBE ...FILEEXISTSに関する説明

- C/C++(Pro*C/C++): 『Pro*C/C++プログラマーズ・ガイド』の「ラージ・オブジェクト(LOB)」、「LOB文」および「埋込みSQL文およびディレクティブ」のLOB DESCRIBE ... GET FILEEXISTSに関する説明

- COM(OO4O): 『Oracle Objects for OLE開発者ガイド』

- Java(JDBC): 『Oracle Database JDBC開発者ガイドおよびリファレンス』の「LOBとBFILEの操作」の「BFILEの操作」

例

次のプログラム環境での例を示します。

- PL/SQL(DBMS_LOB): fexists.sql

- OCI: fexists.c

- COM(OO4O): fexists.bas

- Java(JDBC): fexists.java

BFILEの長さの取得

この項では、BFILEの長さを取得する方法について説明します。

関連項目:
BFILE操作と各プログラム環境で提供されるAPIのリストは、表21-1「BFILE APIについてサポートされている環境」を参照してください。

構文

各プログラム環境における構文については、次のマニュアルの項を参照してください。

- PL/SQL (DBMS_LOB): 『PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』の「DBMS_LOB」、GETLENGTHに関する項

- C (OCI): 『Oracle Call Interfaceプログラマーズ・ガイド』の第7章「LOBとBFILEの操作」。第16章、LOB関数のOCILobGetLength2()に関する項。

- COBOL(Pro*COBOL): 『Pro*COBOLプログラマーズ・ガイド』のLOBの詳細、LOB文の使用上の注意、および「埋込みSQLおよびプリコンパイラ・ディレクティブ」のLOB DESCRIBE ... GET LENGTH INTO ...に関する説明

- C/C++(Pro*C/C++): 『Pro*C/C++プログラマーズ・ガイド』の「ラージ・オブジェクト(LOB)」、「LOB文」および「埋込みSQL文およびディレクティブ」のLOB DESCRIBE ... GET LENGTH INTO ...に関する説明

- COM(OO4O): 『Oracle Objects for OLE開発者ガイド』

- Java(JDBC): 『Oracle Database JDBC開発者ガイドおよびリファレンス』の「LOBとBFILEの操作」の「BFILEの操作」

例

次のプログラム環境での例を示します。

- PL/SQL(DBMS_LOB): flength.sql

- OCI: flength.c

- COM(OO4O): flength.bas

- Java (JDBC): flength.java

BFILEロケータの割当て

この項では、1つのBFILEロケータを別のものに割り当てる方法について説明します。

関連項目:
BFILE操作と各プログラム環境で提供されるAPIのリストは、表21-1「BFILE APIについてサポートされている環境」を参照してください。

構文

各プログラム環境における構文については、次のマニュアルの項を参照してください。

- SQL: 『Oracle Database SQL言語リファレンス』の第7章「SQLファンクション」のCREATE PROCEDUREに関する項

- PL/SQL(DBMS_LOB): LOBロケータを他のLOBロケータに割り当てる方法は、第12章「高度な設計時の考慮事項」を参照してください。

- C (OCI): 『Oracle Call Interfaceプログラマーズ・ガイド』の第7章「LOBとBFILEの操作」の使用上の注意に関する項。第16章、LOB関数のOCILobLocatorAssign()に関する項。

- COBOL(Pro*COBOL): 『Pro*COBOLプログラマーズ・ガイド』のLOBの詳細、LOB文の使用上の注意および「埋込みSQLおよびプリコンパイラ・ディレクティブ」の「LOB ASSIGN」

- C/C++(Pro*C/C++): 『Pro*C/C++プログラマーズ・ガイド』の「ラージ・オブジェクト(LOB)」、「LOB文」および「埋込みSQL文およびディレクティブ」の「LOB ASSIGN」

- COM(OO4O): 参照マニュアルはありません。

- Java(JDBC): 『Oracle Database JDBC開発者ガイドおよびリファレンス』の「LOBとBFILEの操作」の「BFILEの操作」

例

次のプログラム環境での例を示します。

- PL/SQL(DBMS_LOB): fcopyloc.sql

- OCI: fcopyloc.c

- COM: 今回のリリースでは例は提供されません。

- Java(JDBC): fcopyloc.java

BFILEのディレクトリ・オブジェクト名とファイル名の取得

この項では、BFILEのディレクトリ・オブジェクト名とファイル名を取得する方法について説明します。

関連項目:
BFILE操作と各プログラム環境で提供されるAPIのリストは、表21-1「BFILE APIについてサポートされている環境」を参照してください。

構文

各プログラム環境における構文については、次のマニュアルの項を参照してください。

- PL/SQL (DBMS_LOB): 『PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』の「DBMS_LOB」、FILEGETNAMEに関する項

- C (OCI): 『Oracle Call Interfaceプログラマーズ・ガイド』の第7章「LOBとBFILEの操作」の使用上の注意に関する項。第16章、LOB関数のOCILobFileGetName()に関する項。

- COBOL(Pro*COBOL): 『Pro*COBOLプログラマーズ・ガイド』のLOBの詳細、LOB文の使用上の注意および「埋込みSQLおよびプリコンパイラ・ディレクティブ」のLOB DESCRIBE ... GET DIRECTORY ...に関する説明

- C/C++(Pro*C/C++): 『Pro*C/C++プログラマーズ・ガイド』の「ラージ・オブジェクト(LOB)」、「LOB文」および「埋込みSQL文およびディレクティブ」のLOB DESCRIBE ... GET DIRECTORY ...に関する説明

- COM(OO4O): 『Oracle Objects for OLE開発者ガイド』

- Java(JDBC): 『Oracle Database JDBC開発者ガイドおよびリファレンス』の「LOBとBFILEの操作」の「BFILEの操作」

例

次のプログラム環境での、このプロシージャの例を示します。

- PL/SQL(DBMS_LOB): fgetdir.sql

- OCI: fgetdir.c

- COM(OO4O): fgetdir.bas

- Java(JDBC): fgetdir.java

初期化したBFILEロケータを使用したBFILEの更新

この項では、初期化したBFILEロケータを使用してBFILEを更新する方法について説明します。

関連項目:
BFILE操作と各プログラム環境で提供されるAPIのリストは、表21-1「BFILE APIについてサポートされている環境」を参照してください。

構文

各プログラム環境における構文については、次のマニュアルの項を参照してください。

- PL/SQL (DBMS_LOB): 『Oracle Database SQL言語リファレンス』の第7章「SQL文」のUPDATEに関する項

- C (OCI): 『Oracle Call Interfaceプログラマーズ・ガイド』の第7章「LOBとBFILEの操作」の使用上の注意に関する項。第16章、LOB関数のOCILobFileSetName()に関する項。

- COBOL(Pro*COBOL): 『Pro*COBOLプログラマーズ・ガイド』のLOBの詳細、LOB文の使用上の注意および「埋込みSQLおよびプリコンパイラ・ディレクティブ」の「ALLOCATE」。『Oracle Database SQL言語リファレンス』の第7章「SQL文」のUPDATEに関する項も参照。

- C/C++(Pro*C/C++): 『Pro*C/C++プログラマーズ・ガイド』の「ラージ・オブジェクト(LOB)」、「LOB文」、「埋込みSQL文およびディレクティブ」。『Oracle Database SQL言語リファレンス』の第7章「SQL文」のUPDATEに関する項も参照。

- COM(OO4O): 『Oracle Objects for OLE開発者ガイド』

- 「目次」タブから、「OO4Oオートメーション・サーバー・リファレンス」→「OO4Oサーバーのオブジェクト」→「OraBFILE」→「プロパティ」→「DirectoryName」および「FileName」を選択、および「OO4Oオートメーション・サーバー・リファレンス」→「OO4Oサーバーのオブジェクト」→「OraDatabase」→「メソッド」→「ExecuteSQL」を選択。また、「OO4Oオートメーション・サーバー・リファレンス」→「OO4Oサーバーのオブジェクト」→「OraBFILE」→「例」も参照。

- Java(JDBC): 『Oracle Database JDBC開発者ガイドおよびリファレンス』の「LOBとBFILEの操作」の「BFILEの操作」

例

次のプログラム環境での例を示します。

- PL/SQL(DBMS_LOB): fupdate.sql

- OCI: fupdate.c

- COM(OO4O): fupdate.bas

- Java(JDBC): fupdate.java

FILECLOSEを使用したBFILEのクローズ

この項では、FILECLOSEを使用してBFILEをクローズする方法について説明します。

注意:
新規開発には、このファンクション(FILECLOSE)をお薦めしません。かわりにCLOSEファンクションを使用してください。詳細は、「CLOSEを使用したBFILEのクローズ」を参照してください。

関連項目:
BFILE操作と各プログラム環境で提供されるAPIのリストは、表21-1「BFILE APIについてサポートされている環境」を参照してください。

構文

各プログラム環境における構文については、次のマニュアルの項を参照してください。

- PL/SQL(DBMS_LOB): 『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』の「DBMS_LOB」の「FILEOPEN」および「FILECLOSE」

- C (OCI): 『Oracle Call Interfaceプログラマーズ・ガイド』の第7章「LOBとBFILEの操作」の使用上の注意に関する項。第16章、LOB関数のOCILobFileClose()に関する項。

- COBOL(Pro*COBOL): 参照マニュアルはありません。

- C/C++(Pro*C/C++): 参照マニュアルはありません。

- COM(OO4O): 参照マニュアルはありません。

- Java(JDBC): 『Oracle Database JDBC開発者ガイドおよびリファレンス』の「LOBとBFILEの操作」の「BFILEの操作」

例

- PL/SQL(DBMS_LOB): fclose_f.sql

- OCI: fclose_f.c

- COM(OO4O): この操作はCOMではサポートされません。かわりに、「CLOSEを使用したBFILEのクローズ」に説明されている方法を使用してください。

- Java(JDBC): fclose_f.java

CLOSEを使用したBFILEのクローズ

この項では、CLOSEファンクションを使用してBFILEをクローズする方法について説明します。

注意:
新規アプリケーション開発には、このファンクション(CLOSE)をお薦めします。新規開発には、古いFILECLOSEファンクションをお薦めしません。

関連項目:
BFILE操作と各プログラム環境で提供されるAPIのリストは、表21-1「BFILE APIについてサポートされている環境」を参照してください。

使用上の注意

BFILEのオープンとクローズは必須操作です。インスタンスはセッション中に後でクローズする必要があります。

関連項目:

- OPENを使用したBFILEのオープン

- ISOPENを使用した、BFILEがオープンしているかどうかの確認

構文

各プログラム環境における構文については、次のマニュアルの項を参照してください。

- PL/SQL(DBMS_LOB): 『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』の「DBMS_LOB」の「CLOSE」

- C (OCI): 『Oracle Call Interfaceプログラマーズ・ガイド』の第7章「LOBとBFILEの操作」の使用上の注意に関する項。第16章、LOB関数のOCILobClose()に関する項。

- COBOL(Pro*COBOL): 『Pro*COBOLプログラマーズ・ガイド』のLOBの詳細、LOB文の使用上の注意および「埋込みSQLおよびプリコンパイラ・ディレクティブ」の「LOB CLOSE」

- C/C++(Pro*C/C++): 『Pro*C/C++プログラマーズ・ガイド』の「ラージ・オブジェクト(LOB)」、「LOB文」および「埋込みSQL文およびディレクティブ」の「LOB CLOSE」

- COM(OO4O): 『Oracle Objects for OLE開発者ガイド』

- Java(JDBC): 『Oracle Database JDBC開発者ガイドおよびリファレンス』の「LOBとBFILEの操作」の「BFILEの操作」

例

- PL/SQL(DBMS_LOB): fclose_c.sql

- OCI: fclose_c.c

- COM(OO4O): fclose.bas

- Java(JDBC): fclose_c.java

FILECLOSEALLを使用したオープン中のすべてのBFILEのクローズ

この項では、オープン中のすべてのBFILEをクローズする方法について説明します。

BFILEインスタンスは、プログラムの終了前にクローズする必要があります。たとえば、オープンしているBFILEインスタンスはすべて、PL/SQLブロックやOCIプログラムの終了する前にクローズする必要があります。

アプリケーションに例外が発生したり異常終了した場合も、オープンしているBFILEインスタンスをクローズする必要があります。このような場合にBFILEインスタンスをクローズしないと、データベースでオープン状態であるとみなされます。このような場合にBFILEインスタンスがオープン状態のままにならないような例外処理方法を使用していることを確認してください。

関連項目:

- BFILE操作と各プログラム環境で提供されるAPIのリストは、表21-1「BFILE APIについてサポートされている環境」を参照してください。

- 「オープンできるBFILE数の上限の設定」

構文

各プログラム環境における構文については、次のマニュアルの項を参照してください。

- PL/SQL (DBMS_LOB): 『PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』の「DBMS_LOB」、FILECLOSEALLに関する項

- C (OCI): 『Oracle Call Interfaceプログラマーズ・ガイド』の第7章「LOBとBFILEの操作」の使用上の注意に関する項。第16章、LOB関数のOCILobFileCloseAll()に関する項。

- COBOL(Pro*COBOL): 『Pro*COBOLプログラマーズ・ガイド』のLOBの詳細、LOB文の使用上の注意および「埋込みSQLおよびプリコンパイラ・ディレクティブ」の「LOB FILE CLOSE ALL」

- C/C++(Pro*C/C++): 『Pro*C/C++プログラマーズ・ガイド』の「ラージ・オブジェクト(LOB)」、「LOB文」および「埋込みSQL文およびディレクティブ」のLOB FILE CLOSE ALLに関する説明

- COM(OO4O): 『Oracle Objects for OLE開発者ガイド』

- Java(JDBC): 『Oracle Database JDBC開発者ガイドおよびリファレンス』の第7章「LOBとBFILEの操作」の「BFILEの操作」

例

- PL/SQL(DBMS_LOB): fclosea.sql

- OCI: fclosea.c

- COM(OO4O): fclosea.bas

- Java(JDBC): fclosea.java

BFILEを含む行の挿入

この項では、初期化したBFILEロケータを使用してBFILEを含む行を挿入する方法について説明します。

関連項目:

- BFILE操作と各プログラム環境で提供されるAPIのリストは、表21-1「BFILE APIについてサポートされている環境」を参照してください。

使用上の注意

INSERT文を発行する前に、BFILEロケータ・バインド変数をNULLまたはディレクトリ・オブジェクトおよびファイル名に初期化する必要があります。

構文

各プログラム環境における構文については、次のマニュアルの項を参照してください。

- SQL: 『Oracle Database SQL言語リファレンス』の第7章「SQL文」のINSERTに関する項

- C(OCI): 『Oracle Call Interfaceプログラマーズ・ガイド』の第7章「LOBとBFILEの操作」

- COBOL(Pro*COBOL): 『Pro*COBOLプログラマーズ・ガイド』のLOBの詳細、LOB文の使用上の注意および「埋込みSQLおよびプリコンパイラ・ディレクティブ」。『Oracle Database SQL言語リファレンス』のSQL INSERT文の関連情報も参照。

- C/C++(Pro*C/C++): 『Pro*C/C++プログラマーズ・ガイド』の「ラージ・オブジェクト(LOB)」、「LOB文」および「埋込みSQL文およびディレクティブ」の「LOB FILE SET」。『Oracle Database SQL言語リファレンス』の第7章「SQL文」の「INSERT」も参照。

- COM(OO4O): 『Oracle Objects for OLE開発者ガイド』

- Java(JDBC): 『Oracle Database JDBC開発者ガイドおよびリファレンス』の「LOBとBFILEの操作」の「BFILEの操作」

例

次のプログラム環境での例を示します。

- PL/SQL(DBMS_LOB): finsert.sql

- OCI: finsert.c

- COM(OO4O): finsert.bas

- Java(JDBC): finsert.java

22 LOB APIの使用

この章では、BLOB、CLOBおよびNCLOBデータ型の操作を実行するAPIについて説明します。この章で説明する操作は、永続LOBインスタンスまたは一時LOBインスタンスに使用できます。BFILEには適用されないことに注意してください。この章で説明するAPIのリストは、表22-1を参照してください。

関連項目:

- 一時LOBインスタンスと永続LOBインスタンスの作成方法、およびそれぞれのLOBに固有のその他の操作の詳細は、第19章「永続LOBに固有の操作と一時LOBに固有の操作」を参照してください。

- BFILEインスタンス固有の操作の詳細は、第21章「BFILE操作用のLOB API」を参照してください。

この章では、操作ごとに次の項目について説明します。

- 前提条件では、各操作をコールする前に達成する必要がある依存性と、必要な条件について説明します。

- 「使用上の注意」では、特定のプログラム環境またはデータ型に固有の情報など、実装に関するガイドラインを示します。

- 「構文」では、サポートされているプログラム環境ごとに構文の参照先マニュアルを示します。

- 「例」では、サンプルの実行に必要な設定タスクについて説明します。掲載されているデモ・ファイルは、$ORACLE_HOME/rdbms/demo/lobs/のplsql、oci、vbおよびjavaという名前のサブディレクトリにあります。ドライバ・プログラムlobdemo.sqlは/plsqlにあり、ドライバ・プログラムlobdemo.cは/ociにあります。

この章の内容は次のとおりです。

- サポートされている環境

- 他のLOBへのLOBの追加

- キャラクタ・セット・フォームの取得

- キャラクタ・セットIDの取得

- LOBへのBFILEデータのロード

- BLOBへのBFILEデータのロード

- CLOBまたはNCLOBへのBFILEデータのロード

- LOBがオープンしているかどうかの確認

- LOBデータの表示

- LOBからのデータの読取り

- LOB配列読取り

- LOBの一部の読取り(SUBSTR)

- 2つのLOBの全体または一部の比較

- パターン: INSTRを使用したLOB内のパターンの有無の確認

- 長さ: LOBの長さの取得

- 他のLOBへのLOBの全体または一部のコピー

- LOBロケータのコピー

- 等値: 2つのLOBロケータが等しいかどうかの確認

- LOBロケータが初期化されているかどうかの確認

- LOBへの追加

- LOBへのデータの書込み

- LOB配列書込み

- LOBデータの切捨て

- LOBの一部の消去

- LOBバッファリングの使用可能化

- バッファのフラッシュ

- LOBバッファリングの使用禁止化

- LOBインスタンスが一時LOBであるかどうかの確認

- BLOBからCLOBへの変換

- CLOBからBLOBへの変換

- 読取り一貫性の保証

サポートされている環境

表22-1「LOB APIについてサポートされている環境」に、この章で説明するAPIについてサポートされているプログラム環境を示します。第1列は、APIで実行される操作を示します。その他の列は、そのAPIがPL/SQL、OCI、OCCI、COBOL、Pro*C/C++、COMおよびJDBCでサポートされているかどうかに応じて、「はい」または「いいえ」となっています。

表22-1 LOB APIについてサポートされている環境

操作

PL/SQL

OCI

OCCI

COBOL

Pro*C/C++

COM

JDBC

他のLOBへのLOBの追加

はい

はい

いいえ

はい

はい

はい

はい

キャラクタ・セット・フォームの取得

いいえ

はい

いいえ

いいえ

いいえ

いいえ

いいえ

キャラクタ・セットIDの取得

いいえ

はい

いいえ

いいえ

いいえ

いいえ

いいえ

チャンク・サイズの決定、関連項目: 「LOBへのデータの書込み」

はい

はい

はい

はい

はい

はい

はい

2つのLOBの全体または一部の比較

はい

いいえ

いいえ

はい

はい

はい

はい

BLOBからCLOBへの変換

はい

いいえ

いいえ

いいえ

いいえ

いいえ

いいえ

CLOBからBLOBへの変換

はい

いいえ

いいえ

いいえ

いいえ

いいえ

いいえ

LOBロケータのコピー

はい

はい

いいえ

はい

はい

はい

はい

他のLOBへのLOBの全体または一部のコピー

はい

はい

いいえ

はい

はい

はい

はい

LOBバッファリングの使用禁止化

いいえ

はい

いいえ

はい

はい

はい

いいえ

LOBデータの表示

はい

はい

いいえ

はい

はい

はい

はい

LOBバッファリングの使用可能化

いいえ

いいえ

いいえ

はい

はい

はい

いいえ

等値: 2つのLOBロケータが等しいかどうかの確認

いいえ

はい

いいえ

いいえ

はい

いいえ

はい

LOBの一部の消去

はい

はい

いいえ

はい

はい

はい

はい

バッファのフラッシュ

いいえ

はい

いいえ

はい

はい

いいえ

いいえ

LOBロケータが初期化されているかどうかの確認

いいえ

はい

いいえ

いいえ

はい

いいえ

いいえ

長さ: LOBの長さの取得

はい

はい

いいえ

はい

はい

はい

はい

LOBへのBFILEデータのロード

はい

はい

いいえ

はい

はい

はい

はい

BLOBへのBFILEデータのロード

はい

いいえ

いいえ

いいえ

いいえ

いいえ

いいえ

CLOBまたはNCLOBへのBFILEデータのロード

はい

いいえ

いいえ

いいえ

いいえ

いいえ

いいえ

LOB配列読取り

いいえ

はい

いいえ

いいえ

いいえ

いいえ

いいえ

LOB配列書込み

いいえ

はい

いいえ

いいえ

いいえ

いいえ

いいえ

OPENおよびCLOSEインタフェースを使用した永続LOBのオープン

はい

はい

はい

はい

はい

はい

はい

オープン: LOBがオープンしているかどうかの確認

はい

はい

はい

はい

はい

はい

はい

パターン: INSTRを使用したLOB内のパターンの有無の確認

はい

いいえ

いいえ

はい

はい

いいえ

はい

LOBの一部の読取り(SUBSTR)

はい

いいえ

いいえ

はい

はい

はい

はい

LOBからのデータの読取り

はい

はい

いいえ

はい

はい

はい

はい

記憶域の制限、決定: サイズがTBのLOBの最大記憶域の制限

はい

いいえ

いいえ

いいえ

いいえ

いいえ

いいえ

LOBデータの切捨て

はい

はい

いいえ

はい

はい

はい

はい

WriteNoAppend、関連項目: 「LOBへの追加」

いいえ

いいえ

いいえ

いいえ

いいえ

いいえ

いいえ

LOBへのデータの書込み

はい

はい

はい

はい

はい

はい

はい

他のLOBへのLOBの追加

この操作では、あるLOBインスタンスを他のLOBインスタンスに追加します。

事前条件

LOBを他のLOBに追加する前に、次の条件を満たしている必要があります。

- 2つのLOBインスタンスが存在していること。

- 両方のインスタンスが同じ型であること(両方ともBLOB型、または両方ともCLOB型など)。

- この操作には、永続LOBインスタンスまたは一時LOBインスタンスの任意の組合せを渡すことができます。

使用上の注意

永続LOB: PL/SQLのDBMS_LOBパッケージまたはOCIを使用する場合は、LOB値を更新する前にLOBを選択する行をロックする必要があります。SQL INSERT文およびUPDATE文は暗黙的に行をロックしますが、SQLプログラムおよびPL/SQLプログラムではSQL SELECT FOR UPDATE文を使用して、またOCIプログラムではOCI pinまたはlock関数を使用して明示的にロックできます。更新後のロケータの状態の詳細は、「更新済ロケータを介したLOBの更新の例」を参照してください。

構文

各プログラム環境における構文については、次のマニュアルの項を参照してください。

- PL/SQL(DBMS_LOBパッケージ): 『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』の「DBMS_LOB」のAPPENDに関する項

- C(OCI): 『Oracle Call Interfaceプログラマーズ・ガイド』の「LOB関数」の「OCILobAppend()」

- C++(OCCI): 『Oracle C++ Call Interfaceプログラマーズ・ガイド』

- COBOL(Pro*COBOL): 『Pro*COBOLプログラマーズ・ガイド』のLOBの詳細、LOB文の使用上の注意および「埋込みSQLおよびプリコンパイラ・ディレクティブ」の「LOB APPEND」

- C/C++(Pro*C/C++): 『Pro*C/C++プログラマーズ・ガイド』の「埋込みSQL文およびディレクティブ」の「LOB APPEND」

- COM(OO4O): 『Oracle Objects for OLE開発者ガイド』

- Java(JDBC): 『Oracle Database JDBC開発者ガイドおよびリファレンス』のJavaにおけるLOB列の作成と移入

例

次の例を実行するには、2つのLOBインスタンスを作成し、それを指定のAPPEND操作のコール時に渡す必要があります。LOBインスタンスの作成方法は、第19章「永続LOBに固有の操作と一時LOBに固有の操作」を参照してください。

ここに示す例は、次のプログラム環境での例です。

- PL/SQL(DBMS_LOBパッケージ): lappend.sql

- OCI: lappend.c

- COM(OO4O): lappend.bas

- Java(JDBC): lappend.java

キャラクタ・セット・フォームの取得

この項では、LOBインスタンスのキャラクタ・セット・フォームを取得する方法について説明します。

構文

各プログラム環境における構文については、次のマニュアルの項を参照してください。

- PL/SQL(DBMS_LOBパッケージ): 参照マニュアルはありません。

- C(OCI): 『Oracle Call Interfaceプログラマーズ・ガイド』の「LOB関数」の「OCILobCharSetForm()」

- C++(OCCI): 『Oracle C++ Call Interfaceプログラマーズ・ガイド』

- COBOL(Pro*COBOL): 参照マニュアルはありません。

- C/C++(Pro*C/C++): 参照マニュアルはありません。

- COM(OO4O): 参照マニュアルはありません。

- Java(JDBC): 参照マニュアルはありません。

例

次の例では、外国語のテキスト(ad_fltextn)のキャラクタ・セット・フォームを取得する方法について説明します。

この機能はOCIでのみ使用可能です。

- OCI: lgetchfm.c

キャラクタ・セットIDの取得

この項では、キャラクタ・セットIDを取得する方法について説明します。

構文

各プログラム環境における構文については、次のマニュアルの項を参照してください。

- PL/SQL(DBMS_LOBパッケージ): 参照マニュアルはありません。

- C(OCI): 『Oracle Call Interfaceプログラマーズ・ガイド』の「その他のOCIリレーショナル関数」の「LOB関数」の「OCILobCharSetId()」

- C++(OCCI): 『Oracle C++ Call Interfaceプログラマーズ・ガイド』

- COBOL(Pro*COBOL): 参照マニュアルはありません。

- C/C++(Pro*C/C++): 参照マニュアルはありません。

- COM(OO4O): 参照マニュアルはありません。

- Java(JDBC): 参照マニュアルはありません。

例

この機能はOCIでのみ使用可能です。

- OCI: lgetchar.c

LOBへのBFILEデータのロード

この操作では、LOBにBFILEデータをロードします。このプロシージャを使用すると、任意のLOBデータ型である永続LOBインスタンスまたは一時LOBインスタンスにデータをロードできます。

関連項目:

- LOADBLOBFROMFILEおよびLOADCLOBFROMFILEプロシージャによって、このプロシージャの機能が実装されるため、バイナリ・データおよび文字データのロード機能が向上します。(改善されたプロシージャは、PL/SQL環境のみで使用可能です。)可能なかぎり、機能が向上したプロシージャを使用することをお薦めします。詳細は、「BLOBへのBFILEデータのロード」および「CLOBまたはNCLOBへのBFILEデータのロード」を参照してください。

- この操作のかわりに、SQL*Loaderを使用して永続LOBのデータをファイルシステム内のファイルから直接ロードすることもできます。詳細は、「SQL*Loaderを使用したLOBのロード」を参照してください。

事前条件

BFILEデータをLOBにロードする前に、次の条件を満たしている必要があります。

- BFILEが存在すること。

- ターゲットのLOBインスタンスが存在すること。

使用上の注意

この操作については、次の注意事項があります。

文字データのロード時のLOADCLOBFROMFILEの使用

DBMS_LOB.LOADFROMFILEプロシージャを使用してCLOBまたはNCLOBインスタンスにロードする場合は、BFILEからバイナリ・データを使用してLOBをロードすることになり、暗黙的なキャラクタ・セット変換は実行されません。そのため、文字データをロードするときにはDBMS_LOB.LOADCLOBFROMFILEプロシージャの使用が推奨されます。詳細は、「CLOBまたはNCLOBへのBFILEデータのロード」を参照してください。

BFILEデータのロード量の指定

表22-2に示すファンクションの量パラメータでは、次のいずれかの値を渡す必要があります。

- ロードするBFILEの実際のサイズ(バイト単位)以下の量。

- 最大許容LOBサイズ(バイトで表されます)。この値を渡すと、BFILE全体がロードされます。この方法を使用すると、ロード前にBFILEのサイズを確認せずにBFILE全体をロードできます。最大許容LOBサイズを取得するには、表22-2に示す方法を使用します。

表22-2 ファイルからのロード操作用の最大LOBサイズ

環境

ファンクション

最大LOBサイズを渡すために取得する値

DBMS_LOB

DBMS_LOB.LOADBLOBFROMFILE

DBMS_LOB.LOBMAXSIZE

DBMS_LOB

DBMS_LOB.LOADCLOBFROMFILE

DBMS_LOB.LOBMAXSIZE

OCI

OCILobLoadFromFile2()

(LOBのサイズが任意の場合)

UB8MAXVAL

OCI

OCILobLoadFromFile()

(LOBのサイズが4GB未満の場合)

UB4MAXVAL

構文

各プログラム環境でこの操作を使用する方法の詳細は、次のマニュアルを参照してください。

- PL/SQL (DBMS_LOBパッケージ): 『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』の「DBMS_LOB」のLOADFROMFILEに関する項。

- C(OCI): 『Oracle Call Interfaceプログラマーズ・ガイド』の「LOB関数」の「OCILobLoadFromFile()」

- C++(OCCI): 『Oracle C++ Call Interfaceプログラマーズ・ガイド』

- COBOL(Pro*COBOL): 『Pro*COBOLプログラマーズ・ガイド』のLOBの詳細、LOB文の使用上の注意および「埋込みSQLおよびプリコンパイラ・ディレクティブ」の「LOB LOAD」、「LOB OPEN」、「LOB CLOSE」

- C/C++(Pro*C/C++): 『Pro*C/C++プログラマーズ・ガイド』の付録F「埋込みSQL文およびディレクティブ」の「LOB LOAD」

- COM(OO4O) 『Oracle Objects for OLE開発者ガイド』

- Java (JDBC): 『Oracle Database JDBC開発者ガイドおよびリファレンス』の第7章「LOBとBFILEの操作」の「BLOBまたはCLOB列の作成と移入」

例

次のプログラム環境での例を示します。

- PL/SQL(DBMS_LOBパッケージ): lloaddat.sql

- OCI: lloaddat.c

- COM(OO4O): lloaddat.bas

- Java(JDBC): lloaddat.java

BLOBへのBFILEデータのロード

このプロシージャでは、BLOBにBFILEデータをロードします。このプロシージャを使用すると、任意の永続または一時BLOBインスタンスにデータをロードできます。

関連項目:

- 「LOBへのBFILEデータのロード」

- 文字データをロードするには、DBMS_LOB.LOADCLOBFROMFILEを使用します。詳細は、「CLOBまたはNCLOBへのBFILEデータのロード」を参照してください。

- この操作のかわりに、SQL*Loaderを使用して永続LOBのデータをファイルシステム内のファイルから直接ロードすることもできます。詳細は、「SQL*Loaderを使用したLOBのロード」を参照してください。

事前条件

このプロシージャをコールする前に、次の条件を満たしている必要があります。

- ターゲットのBLOBインスタンスが存在すること。

- ソースBFILEが存在すること。

- BFILEをオープンしていること。(このプロシージャをコールした後、いずれかの時点でBFILEをクローズする必要があります。)

使用上の注意

この操作では、次のことに注意してください。

戻される新規オフセット

DBMS_LOB.LOADBLOBFROMFILEを使用してBLOBにバイナリ・データをロードすると、DBMS_LOB.LOADFROMFILEを使用した場合と同じ結果になりますが、BLOBの新規オフセットも戻されます。

BFILEデータのロード量の指定

DBMS_LOB.LOADBLOBFROMFILEファンクションの量パラメータでは、次のいずれかの値を渡す必要があります。

- ロードするBFILEの実際のサイズ(バイト単位)以下の量。

- 許容される最大LOBサイズはDBMS_LOB.LOBMAXSIZEです。この値を渡すと、ファンクションによってBFILE全体がロードされます。この方法は、BFILEのサイズをイントロスペクトせずにBFILE全体をロードする場合に役立ちます。

関連項目:
表22-2「ファイルからのロード操作用の最大LOBサイズ」

構文

このプロシージャの構文の詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』の「DBMS_LOB」の「LOADBLOBFROMFILEプロシージャ」を参照してください。

例

この例はPL/SQLでのみ使用可能です。他のプログラム環境では、このAPIは提供されません。オンライン・ファイルはlldblobf.sqlです。この例は次の使用方法を示します。

- LOADBLOBFROMFILEを使用して、最初にBFILEの長さを取得することなくファイル全体をロードする方法

- オフセットの戻り値を使用して、実際にロードされたデータ量を計算する方法

CLOBまたはNCLOBへのBFILEデータのロード

このプロシージャでは、CLOBまたはNCLOBにBFILE文字データをロードします。このプロシージャを使用すると、任意の永続または一時CLOBまたはNCLOBインスタンスにデータをロードできます。

関連項目:

- 「LOBへのBFILEデータのロード」

- バイナリ・データをロードするには、DBMS_LOB.LOADBLOBFROMFILEを使用します。詳細は、「BLOBへのBFILEデータのロード」を参照してください。

- この操作のかわりに、SQL*Loaderを使用して永続LOBのデータをファイルシステム内のファイルから直接ロードすることもできます。詳細は、「SQL*Loaderを使用したLOBのロード」を参照してください。

事前条件

このプロシージャをコールする前に、次の条件を満たしている必要があります。

- ターゲットのCLOBまたはNCLOBインスタンスが存在すること。

- ソースBFILEが存在すること。

- BFILEをオープンしていること。(このプロシージャをコールした後、いずれかの時点でBFILEをクローズする必要があります。)

使用上の注意

このプロシージャのコール時に、BFILEのキャラクタ・セットIDを指定できます。これにより、BFILEデータのキャラクタ・セットが宛先のCLOBまたはNCLOBキャラクタ・セットに正しく変換されることが保証されます。

BFILEデータのロード量の指定

DBMS_LOB.LOADCLOBFROMFILEファンクションの量パラメータでは、次のいずれかの値を渡す必要があります。

- ロードするBFILEデータの実際のサイズ(文字単位)以下の量

- 最大許容LOBサイズ: DBMS_LOB.LOBMAXSIZE
この値を渡すと、ファンクションによりBFILE全体がロードされます。この方法は、BFILEのサイズをイントロスペクトせずにBFILE全体をロードする場合に役立ちます。

構文

このプロシージャの構文の詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』の「DBMS_LOB」の「LOADCLOBFROMFILEプロシージャ」を参照してください。

例

次の例に、このAPIの様々な使用方法を示します。

- PL/SQL: BFILEからLOBへの文字データのロード

- PL/SQL: 異なるLOBへの文字データ・セグメントのロード

PL/SQL: BFILEからLOBへの文字データのロード

次の項目の例を示します。

- デフォルトCSID(0)の使用方法

- BFILEに対してgetlengthをコールせずに、ファイル全体をロードする方法

- 戻されたオフセット値を使用して、実際にロードしたデータ量を計算する方法

この例では、ad_sourceがUTF8キャラクタ・セット・フォーマットのBFILEで、データベースのキャラクタ・セットがUTF8であることを想定しています。オンライン・ファイルはlldclobf.sqlです。

PL/SQL: 異なるLOBへの文字データ・セグメントのロード

次の項目の例を示します。

- NLS_CHARSET_IDファンクションを使用して、キャラクタ・セット名からキャラクタ・セットIDを取得する方法

- 戻されたオフセット値および言語コンテキストlang_ctxを使用して、1つのBFILEから複数のLOBにストリームのデータをロードする方法

- 警告メッセージの読取り方法

この例では、ad_file_ext_01がJA16TSTSETフォーマットのBFILEで、データベースの各国語キャラクタ・セットがAL16UTF16であることを想定しています。オンライン・ファイルはlldclobs.sqlです。

LOBがオープンしているかどうかの確認

この操作では、LOBがオープンしているかどうかを確認します。

事前条件

このプロシージャを実行する前に、LOBインスタンスが存在する必要があります。

使用上の注意

LOBがオープンしている場合は、セッション中のいずれかの時点でクローズする必要があります。

構文

各プログラム環境における構文については、次のマニュアルの項を参照してください。

- PL/SQL(DBMS_LOBパッケージ): 『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』の「DBMS_LOB」の「OPEN」、「ISOPEN」

- C(OCI): 『Oracle Call Interfaceプログラマーズ・ガイド』の「LOB関数」の「OCILobIsOpen()」

- C++(OCCI): 『Oracle C++ Call Interfaceプログラマーズ・ガイド』

- COBOL(Pro*COBOL): 『Pro*COBOLプログラマーズ・ガイド』のLOBの詳細、LOB文の使用上の注意および「埋込みSQLおよびプリコンパイラ・ディレクティブ」の「LOB DESCRIBE」

- C/C++(Pro*C/C++): 『Pro*C/C++プログラマーズ・ガイド』の付録F「埋込みSQL文およびディレクティブ」のLOB DESCRIBE ... ISOPEN ...に関する項

- COM(OO4O): 参照マニュアルはありません。

- Java(JDBC): 『Oracle Database JDBC開発者ガイドおよびリファレンス』の「LOBとBFILEの操作」の「BLOBまたはCLOB列の作成と移入」

例

次のプログラム環境での例を示します。

- PL/SQL(DBMS_LOBパッケージ): lisopen.sql

- OCI: lisopen.c

- C++(OCCI): 今回のリリースでは例は提供されません。

- COM(OO4O): 今回のリリースでは例は提供されません。

- Java (JDBC): lisopen.java

Java(JDBC): LOBがオープンしているかどうかの確認

次に、BLOBまたはCLOBの確認方法を示します。

CLOBがオープンしているかどうかの確認

JDBCアプリケーションでCLOBがオープンしているかどうかを確認するには、oracle.sql.CLOBで定義されているisOpenメソッドを使用します。戻されたブール値は、以前にCLOBがオープンされているかどうかを示します。isOpenメソッドは次のように定義します。

/**
* Check whether the CLOB is opened.
* @return true if the LOB is opened.
*/
public boolean isOpen () throws SQLException

次に例を示します。

CLOB clob = ...
// See if the CLOB is opened
boolean isOpen = clob.isOpen ();
...

BLOBがオープンしているかどうかの確認

JDBCアプリケーションでBLOBがオープンしているかどうかを確認するには、oracle.sql.BLOBで定義されているisOpenメソッドを使用します。戻されたブール値は、以前にBLOBがオープンされているかどうかを示します。isOpenメソッドは次のように定義します。

/**
* Check whether the BLOB is opened.
* @return true if the LOB is opened.
*/
public boolean isOpen () throws SQLException

次に例を示します。

BLOB blob = ...
// See if the BLOB is opened
boolean isOpen = blob.isOpen ();
...

LOBデータの表示

この項では、LOBデータの読取りに使用できるAPIについて説明します。この操作を使用してLOBデータをバッファに読み取ることができます。この操作は、アプリケーションで大量のLOBデータを表示したり、データ・ストリーム操作が必要な場合に役立ちます。

使用上の注意

これらのAPIを使用する場合は、次のことに注意してください。

ストリーム・メカニズム

大量のLOBデータを最も効率よく読み取るには、ストリーム・メカニズムを有効にしたOCILobRead2()を使用します。

量パラメータ

表22-3に示すAPIの場合、量パラメータに渡す値には制限があります。

表22-3 量パラメータの最大LOBサイズ

環境

ファンクション

量パラメータの値の制限

DBMS_LOB

DBMS_LOB.READ

32KBのバッファ・サイズ。

OCI

OCILobRead()

(LOBのサイズが4GB未満の場合)

UB4MAXVAL

この量を指定するとファイル全体が読み取られます。

OCI

OCILobRead2()

(LOBのサイズが任意の場合)

UB8MAXVAL

この量を指定するとファイル全体が読み取られます。

構文

各プログラム環境における構文については、次のマニュアルの項を参照してください。

- PL/SQL(DBMS_LOBパッケージ): 『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』の「DBMS_LOB」の「OPEN」、「READ」、「CLOSE」

- C(OCI): 『Oracle Call Interfaceプログラマーズ・ガイド』の「LOB関数」の「OCILobOpen()」、「OCILobRead2()」、「OCILobClose()」

- C++(OCCI): 『Oracle C++ Call Interfaceプログラマーズ・ガイド』

- COBOL(Pro*COBOL): 『Pro*COBOLプログラマーズ・ガイド』のLOBの詳細、LOB文の使用上の注意および「埋込みSQLおよびプリコンパイラ・ディレクティブ」の「LOB READ」

- C/C++(Pro*C/C++): 『Pro*C/C++プログラマーズ・ガイド』の付録F「埋込みSQL文およびディレクティブ」の「LOB READ」

- COM(OO4O) (Oracle Objects for OLE (OO4O) 『Oracle Objects for OLE開発者ガイド』

- Java(JDBC): 『Oracle Database JDBC開発者ガイドおよびリファレンス』の「LOBとBFILEの操作」の「BLOBまたはCLOB列の作成と移入」

例

次のプログラム環境での例を示します。

- PL/SQL(DBMS_LOBパッケージ): ldisplay.sql

- OCI: ldisplay.c

- C++(OCCI): 今回のリリースでは例は提供されません。

- COM(OO4O): ldisplay.bas

- Java(JDBC): ldisplay.java

LOBからのデータの読取り

この項では、OCILobRead2()を使用してLOBからデータを読み取る方法について説明します。

使用上の注意

この操作を使用する場合は、次のことに注意してください。

OCIでのストリーム読取り

大量のLOBデータを最も効率よく読み取るには、ポーリングまたはコールバックによってストリーム・メカニズムを有効にしたOCILobRead2()を使用します。そのためには、次のようにoffsetパラメータを使用して読取り開始位置を指定します。

ub8  char_amt =  0;
ub8  byte_amt =  0;
ub4  offset = 1000;

OCILobRead2(svchp, errhp, locp, &byte_amt, &char_amt, offset, bufp, bufl,
OCI_ONE_PIECE, 0, 0, 0, 0);

ポーリング・モードを使用すると、バッファがいっぱいにならない場合があるため、各OCILobRead2()コール後にbyte_amtパラメータの値を調べて、バッファに何バイト読み取られたかを確認してください。

コールバックを使用すると、コールバックへの入力であるlenpパラメータにバッファに格納されたバイト数が示されます。バッファの空き領域を確認するために、コールバック処理時にはlenpパラメータを必ずチェックしてください(『Oracle Call Interfaceプログラマーズ・ガイド』を参照)。

チャンク・サイズ

チャンクとは1つまたは複数のOracleブロックです。LOBを含む表を作成する場合に、BasicFiles LOB用のチャンク・サイズを指定できます。これは、LOB値に対してアクセスまたは変更を行うときに、Oracle Databaseが使用するデータ・サイズに対応します。チャンクの一部はシステム関連の情報を格納し、残りはLOB値を格納します。使用するAPIには、LOBチャンク内で使用され、LOB値を格納している領域の量を戻すファンクションがあります。PL/SQLでは、DBMS_LOB.GETCHUNKSIZEを使用します。OCIでは、OCILobGetChunkSize()を使用します。SecureFilesでは、CHUNKは、アドバイザ・サイズで、後方互換性のために使用します。

パフォーマンスを改善するには、これらのファンクションの1つによって戻された値を複数回使用してwrite要求を実行します。これは、ディスクからのデータの読取り時に、Oracleデータベースで使用されているサイズと同じ単位を使用するためです。アプリケーションで問題が発生しないかぎり、同じLOBチャンクに複数回のLOB読取りコールを発行するのではなく、チャンク全体の取得に十分なサイズでバッチ読取りを行うと、パフォーマンスが向上します。

構文

各プログラム環境における構文については、次のマニュアルの項を参照してください。

- PL/SQL(DBMS_LOBパッケージ): 『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』の「DBMS_LOB」のOPEN、GETCHUNKSIZE、READ、CLOSEに関する項

- C(OCI): 『Oracle Call Interfaceプログラマーズ・ガイド』の「LOB関数」の「OCILobOpen()」、「OCILobRead2()」、「OCILobClose()」

- C++(OCCI): 『Oracle C++ Call Interfaceプログラマーズ・ガイド』

- COBOL(Pro*COBOL): 『Pro*COBOLプログラマーズ・ガイド』のLOBの詳細、LOB文の使用上の注意および「埋込みSQLおよびプリコンパイラ・ディレクティブ」の「LOB READ」

- C/C++(Pro*C/C++): 『Pro*C/C++プログラマーズ・ガイド』の付録F「埋込みSQL文およびディレクティブ」の「LOB READ」

- COM(OO4O) 『Oracle Objects for OLE開発者ガイド』

- Java (JDBC): 『Oracle Database JDBC開発者ガイドおよびリファレンス』の第7章「LOBとBFILEの操作」の「BLOBまたはCLOB列の作成と移入」

例

次のプログラム環境での例を示します。

- PL/SQL(DBMS_LOBパッケージ): lread.sql

- OCI: lread.c

- COM(OO4O): lread.bas

- Java(JDBC): lread.java

LOB配列読取り

この項では、OCILobArrayRead()を使用して、1回のラウンドトリップで複数のロケータに対してLOBデータを読み取る方法について説明します。

使用上の注意

このファンクションを使用すると、サイズ範囲が512KB未満のLOBを読み取る場合のパフォーマンスが向上します。OCIアプリケーションの例では、プログラムに次のようなSQL文が用意されているものとします。

SELECT lob1 FROM lob_table for UPDATE;

lob1はLOB列であり、lob_arrayはLOB列に対応する定義変数の配列です。

OCILobLocator * lob_array[10];

...
for (i=0; i<10, i++)        /* initialize array of locators */
lob_array[i] = OCIDescriptorAlloc(..., OCI_DTYPE_LOB, ...);

...

OCIDefineByPos(..., 1, (dvoid *) lob_array, ... SQLT_CLOB, ...);

/* Execute the statement with iters = 10 to do an array fetch of 10 locators. */
OCIStmtExecute ( <service context>, <statement handle>, <error handle>,
10,    /* iters  */
0,     /* row offset */
NULL,  /* snapshot IN */
NULL,  /* snapshot out */
OCI_DEFAULT /* mode */);
...

ub4 array_iter = 10;
char  *bufp[10];
oraub8 bufl[10];
oraub8 char_amtp[10];
oraub8 offset[10];

for (i=0; i<10; i++)
{
bufp[i] = (char *)malloc(1000);
bufl[i] = 1000;
offset[i] = 1;
char_amtp[i] = 1000;  /* Single byte fixed width char set. */
}

/* Read the 1st 1000 characters for all 10 locators in one
* round trip. Note that offset and amount need not be
* same for all the locators. */

OCILobArrayRead(<service context>, <error handle>,
&array_iter, /* array size */
lob_array,   /* array of locators */
NULL,        /* array of byte amounts */
char_amtp,   /* array of char amounts */
offset,      /* array of offsets */
(void **)bufp,        /* array of read buffers */
bufl,        /* array of buffer lengths */
OCI_ONE_PIECE,  /* piece information */
NULL,           /* callback context */
NULL,           /* callback function */
0,              /* character set ID - default */
SQLCS_IMPLICIT);/* character set form */

...

for (i=0; i<10; i++)
{
/* Fill bufp[i] buffers with data to be written */
strncpy (bufp[i], "Test Data------", 15);
bufl[i] = 1000;
offset[i] = 50;
char_amtp[i] = 15;  /* Single byte fixed width char set. */
}

/* Write the 15 characters from offset 50 to all 10
* locators in one round trip. Note that offset and
* amount need not be same for all the locators. */
*/

OCILobArrayWrite(<service context>, <error handle>,
&array_iter, /* array size */
lob_array,   /* array of locators */
NULL,        /* array of byte amounts */
char_amtp,   /* array of char amounts */
offset,      /* array of offsets */
(void **)bufp,    /* array of read buffers */
bufl,        /* array of buffer lengths */
OCI_ONE_PIECE,  /* piece information */
NULL,           /* callback context */
NULL,           /* callback function */
0,              /* character set ID - default */
SQLCS_IMPLICIT);/* character set form */
...

ストリーミングのサポート

LOB配列APIは、複数ピースでのLOBデータの読取り/書込みに使用できます。これには、ポーリング手法やコールバック・ファンクションを使用します。これにより、ロケータの配列について複数ピースで順に読取り/書込みが実行されます。ポーリングの場合、各ピースの読取り/書込みの後、array_iterパラメータ(OUT)でそのデータ読取り/書込み時のロケータの索引が示されると、APIがアプリケーションに戻ります。コールバックの場合、array_iterをINパラメータとして各ピースの読取り/書込みを実行すると、ファンクションがコールされます。

注意:

- いくつかのロケータについては1つのピースでデータを読取り/書込みし、その他のロケータについては複数ピースでデータを読取り/書込みすることが可能です。読取り/書込み対象データの全体が収まるだけの十分なバッファ長を持つロケータについては、データは1つのピースで読取り/書込みされます。

- アプリケーションでは、ロケータごとに異なる量の値およびバッファ長を使用できます。

- アプリケーションでは、1つ以上のロケータに対して量の値としてゼロを渡し、これらのロケータに対して純粋なストリーミングを指定できます。読取りの場合、LOBデータはこれらのロケータに対して最後まで読み取られます。書込みの場合、これらのロケータに対してOCI_LAST_PIECEが指定されるまでデータが書き込まれます。

ポーリング・モードでのLOB配列読取り

次の例では、バッファ・サイズが1KBの10個のロケータのそれぞれに対して、10KBのデータが読み取られます。完全なデータを読み取るには、ロケータごとに10ピースが必要です。すべてのデータをフェッチするには、OCILobArrayRead()を100 (10*10)回コールする必要があります。まず、OCI_FIRST_PIECEをpieceパラメータとしてOCILobArrayRead()をコールします。このコールで、最初のロケータに対して最初の1Kピースが戻されます。次に、アプリケーションでロケータに対するすべてのピースの読取りが終了し、OCI_SUCCESSが戻されるまでOCILobArrayRead()がループでコールされ、ます。この例では、99回ループしてロケータのピースを順次戻しています。

/* Fetch the locators */
...

/* array_iter parameter indicates the number of locators in the array read.
* It is an IN parameter for the 1st call in polling and is ignored as IN
* parameter for subsequent calls. As OUT parameter it indicates the locator
* index for which the piece is read.
*/

ub4    array_iter = 10;
char  *bufp[10];
oraub8 bufl[10];
oraub8 char_amtp[10];
oraub8 offset[10];
sword  st;

for (i=0; i<10; i++)
{
bufp[i] = (char *)malloc(1000);
bufl[i] = 1000;
offset[i] = 1;
char_amtp[i] = 10000;       /* Single byte fixed width char set. */
}

st =  OCILobArrayRead(<service context>, <error handle>,
&array_iter, /* array size */
lob_array, /* array of locators */
NULL,      /* array of byte amounts */
char_amtp, /* array of char amounts */
offset,    /* array of offsets */
(void **)bufp,      /* array of read buffers */
bufl,      /* array of buffer lengths */
OCI_FIRST_PIECE, /* piece information */
NULL,           /* callback context */
NULL,           /* callback function */
0,              /* character set ID - default */
SQLCS_IMPLICIT); /* character set form */

/* First piece for the first locator is read here.
* bufp[0]          => Buffer pointer into which data is read.
* char_amtp[0 ]    => Number of characters read in current buffer
*
*/

While ( st == OCI_NEED_DATA)
{
st =  OCILobArrayRead(<service context>, <error handle>,
&array_iter, /* array size */
lob_array, /* array of locators */
NULL,      /* array of byte amounts */
char_amtp, /* array of char amounts */
offset,    /* array of offsets */
(void **)bufp,      /* array of read buffers */
bufl,      /* array of buffer lengths */
OCI_NEXT_PIECE, /* piece information */
NULL,           /* callback context */
NULL,           /* callback function */
0,              /* character set ID - default */
SQLCS_IMPLICIT);

/* array_iter returns the index of the current array element for which
* data is read. for example, aray_iter = 1 implies first locator,
* array_iter = 2 implies second locator and so on.
*
* lob_array[ array_iter - 1]=> Lob locator for which data is read.
* bufp[array_iter - 1]      => Buffer pointer into which data is read.
* char_amtp[array_iter - 1] => Number of characters read in current buffer
*/

...
/* Consume the data here */
...
}

コールバックによるLOB配列読取り

次の例では、バッファ・サイズが1KBの10個のロケータのそれぞれに対して、10KBのデータが読み取られます。各ロケータには、すべてのデータを読み取るために10ピースが必要です。コールバック関数またはファンクションは100(10 × 10)回コールされ、ピースが順次戻されます。

/* Fetch the locators */
...
ub4    array_iter = 10;
char  *bufp[10];
oraub8 bufl[10];
oraub8 char_amtp[10];
oraub8 offset[10];
sword  st;

for (i=0; i<10; i++)
{
bufp[i] = (char *)malloc(1000);
bufl[i] = 1000;
offset[i] = 1;
char_amtp[i] = 10000;       /* Single byte fixed width char set. */
}

st =  OCILobArrayRead(<service context>, <error handle>,
&array_iter, /* array size */
lob_array,   /* array of locators */
NULL,        /* array of byte amounts */
char_amtp,   /* array of char amounts */
offset,      /* array of offsets */
(void **)bufp,        /* array of read buffers */
bufl,        /* array of buffer lengths */
OCI_FIRST_PIECE,  /* piece information */
ctx,              /* callback context */
cbk_read_lob,     /* callback function */
0,                /* character set ID - default */
SQLCS_IMPLICIT);
...
/* Callback function for LOB array read. */
sb4 cbk_read_lob(dvoid *ctxp, ub4 array_iter, CONST dvoid *bufxp, oraub8 len,
ub1 piece, dvoid **changed_bufpp, oraub8 *changed_lenp)
{
static ub4 piece_count = 0;
piece_count++;
switch (piece)
{
case OCI_LAST_PIECE:
/*--- buffer processing code goes here ---*/
(void) printf("callback read the %d th piece(last piece) for %dth locator \n\n",
piece_count, array_iter );
piece_count = 0;
break;
case OCI_FIRST_PIECE:
/*--- buffer processing code goes here ---*/
(void) printf("callback read the 1st piece for %dth locator\n",
array_iter);
/* --Optional code to set changed_bufpp and changed_lenp if the buffer needs
to be changed dynamically --*/
break;
case OCI_NEXT_PIECE:
/*--- buffer processing code goes here ---*/
(void) printf("callback read the %d th piece for %dth locator\n",
piece_count, array_iter);
/* --Optional code to set changed_bufpp and changed_lenp if the  buffer
must be changed dynamically --*/
break;
default:
(void) printf("callback read error: unkown piece = %d.\n", piece);
return OCI_ERROR;
}
return OCI_CONTINUE;
}
...

ポーリングLOB配列読取り

次の例は、変数amtp、buflおよびoffsetを使用したOCILobArrayRead()におけるポーリングLOBデータです。

/* Fetch the locators */
...

ub4    array_iter = 10;
char  *bufp[10];
oraub8 bufl[10];
oraub8 char_amtp[10];
oraub8 offset[10];
sword  st;

for (i=0; i<10; i++)
{
bufp[i] = (char *)malloc(1000);
bufl[i] = 1000;
offset[i] = 1;
char_amtp[i] = 10000;       /* Single byte fixed width char set. */
}

/* For 3rd locator read data in 500 bytes piece from offset 101. Amount
* is 2000, that is, total number of pieces is 2000/500 = 4.
*/
offset[2] = 101; bufl[2] = 500; char_amtp[2] = 2000;

/* For 6th locator read data in 100 bytes piece from offset 51. Amount
* is 0 indicating pure polling, that is, data is read till the end of
* the LOB is reached.
*/
offset[5] = 51;  bufl[5] = 100; char_amtp[5] = 0;

/* For 8th locator read 100 bytes of data in one piece. Note amount
* is less than buffer length indicating single piece read.
*/
offset[7] = 61;  bufl[7] = 200; char_amtp[7] = 100;

st =  OCILobArrayRead(<service context>, <error handle>,
&array_iter, /* array size */
lob_array, /* array of locators */
NULL,      /* array of byte amounts */
char_amtp, /* array of char amounts */
offset,    /* array of offsets */
(void **)bufp,      /* array of read buffers */
bufl,      /* array of buffer lengths */
OCI_FIRST_PIECE, /* piece information */
NULL,           /* callback context */
NULL,           /* callback function */
0,              /* character set ID - default */
SQLCS_IMPLICIT); /* character set form */

/* First piece for the first locator is read here.
* bufp[0]          => Buffer pointer into which data is read.
* char_amtp[0 ]    => Number of characters read in current buffer
*
*/

while ( st == OCI_NEED_DATA)
{
st =  OCILobArrayRead(<service context>, <error handle>,
&array_iter, /* array size */
lob_array, /* array of locators */
NULL,      /* array of byte amounts */
char_amtp, /* array of char amounts */
offset,    /* array of offsets */
(void **)bufp,      /* array of read buffers */
bufl,      /* array of buffer lengths */
OCI_NEXT_PIECE, /* piece information */
NULL,           /* callback context */
NULL,           /* callback function */
0,              /* character set ID - default */
SQLCS_IMPLICIT);

/* array_iter returns the index of the current array element for which
* data is read. for example, aray_iter = 1 implies first locator,
* array_iter = 2 implies second locator and so on.
*
* lob_array[ array_iter - 1]=> Lob locator for which data is read.
* bufp[array_iter - 1]      => Buffer pointer into which data is read.
* char_amtp[array_iter - 1]=>Number of characters read in current buffer
*/

...
/* Consume the data here */
...
}

構文

OCIプログラム環境における構文については、次のマニュアルの項を参照してください。

C(OCI): 『Oracle Call Interfaceプログラマーズ・ガイド』の「LOB関数」の「OCILobArrayRead()」

例

次のプログラム環境での例を示します。

OCI: lreadarr.c

LOBの一部の読取り(SUBSTR)

この項では、SUBSTRを使用してLOBの一部を読み取る方法について説明します。

構文

各プログラム環境における構文については、次のマニュアルの項を参照してください。

- PL/SQL(DBMS_LOBパッケージ): 『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』の「DBMS_LOB」の「SUBSTR」、「OPEN」、「CLOSE」

- C(OCI): 参照マニュアルはありません。

- C++(OCCI): 『Oracle C++ Call Interfaceプログラマーズ・ガイド』

- COBOL (Pro*COBOL): 『Pro*COBOLプログラマーズ・ガイド』のLOBの詳細、LOB文の使用上の注意、および埋込みSQLおよびプリコンパイラ・ディレクティブのALLOCATE、LOB OPEN、LOB READ、LOB CLOSEに関する項。

- C/C++ (Pro*C/C++): 『Pro*C/C++プログラマーズ・ガイド』の付録F「埋込みSQL文およびディレクティブ」のLOB READに関する項。「PL/SQL DBMS_LOB.SUBSTR」も参照してください。

- COM(OO4O): 『Oracle Objects for OLE開発者ガイド』

- Java(JDBC): 『Oracle Database JDBC開発者ガイドおよびリファレンス』の「LOBとBFILEの操作」の「BLOBまたはCLOB列の作成と移入」

例

次のプログラム環境での例を示します。

- PL/SQL(DBMS_LOBパッケージ): lsubstr.sql

- OCI: 今回のリリースでは例は提供されません。

- C++(OCCI): 今回のリリースでは例は提供されません。

- COM(OO4O): lsubstr.bas

- Java (JDBC): lsubstr.java

2つのLOBの全体または一部の比較

この項では、2つのLOBの全体または一部を比較する方法について説明します。

構文

各プログラム環境における構文については、次のマニュアルの項を参照してください。

- PL/SQL(DBMS_LOBパッケージ): 『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』の「DBMS_LOB」の「COMPARE」

- C(OCI): 参照マニュアルはありません。

- C++(OCCI): 『Oracle C++ Call Interfaceプログラマーズ・ガイド』

- COBOL(Pro*COBOL): 『Pro*COBOLプログラマーズ・ガイド』のLOBの詳細、LOB文の使用上の注意および「埋込みSQLおよびプリコンパイラ・ディレクティブ」の「EXECUTE」。PL/SQL DBMS_LOB.COMPAREも参照。

- C/C++ (Pro*C/C++): 『Pro*C/C++プログラマーズ・ガイド』の付録F「埋込みSQL文およびディレクティブ」のEXECUTEに関する項。PL/SQL DBMS_LOB.COMPAREも参照してください。

- COM(OO4O): 『Oracle Objects for OLE開発者ガイド』

- Java(JDBC): 『Oracle Database JDBC開発者ガイドおよびリファレンス』の「LOBとBFILEの操作」の「BLOBまたはCLOB列の作成と移入」

例

次のプログラム環境での例を示します。

- PL/SQL(DBMS_LOBパッケージ): lcompare.sql

- C(OCI): 今回のリリースでは例は提供されません。

- C++(OCCI): 今回のリリースでは例は提供されません。

- COM(OO4O): lcompare.bas

- Java(JDBC): lcompare.java

パターン: INSTRを使用したLOB内のパターンの有無の確認

この項では、INSTRを使用してLOB内のパターンの有無を確認する方法について説明します。

構文

各プログラム環境における構文については、次のマニュアルの項を参照してください。

- PL/SQL(DBMS_LOBパッケージ): 『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』の「DBMS_LOB」の「INSTR」

- C(OCI): 参照マニュアルはありません。

- C++(OCCI): 『Oracle C++ Call Interfaceプログラマーズ・ガイド』

- COBOL (Pro*COBOL): 『Pro*COBOLプログラマーズ・ガイド』のLOBの詳細、LOB文の使用上の注意および「埋込みSQLおよびプリコンパイラ・ディレクティブ」のEXECUTEに関する項。PL/SQL DBMS_LOB.INSTRも参照してください。

- C/C++ (Pro*C/C++): 『Pro*C/C++プログラマーズ・ガイド』の付録F「埋込みSQL文およびディレクティブ」のEXECUTEに関する項。PL/SQL DBMS_LOB.INSTRも参照してください。

- COM(OO4O): 参照マニュアルはありません。

- Java (JDBC): 『Oracle Database JDBC開発者ガイドおよびリファレンス』の第7章「LOBとBFILEの操作」の「BLOBまたはCLOB列の作成と移入」

例

次のプログラム環境での例を示します。

- PL/SQL(DBMS_LOBパッケージ): linstr.sql

- C(OCI): 今回のリリースでは例は提供されません。

- C++(OCCI): 今回のリリースでは例は提供されません。

- COM(OO4O): 今回のリリースでは例は提供されません。

- Java(JDBC): linstr.java

長さ: LOBの長さの取得

この項では、LOBの長さを取得する方法について説明します。

構文

各プログラム環境における構文については、次のマニュアルの項を参照してください。

- PL/SQL(DBMS_LOBパッケージ): 『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』の「DBMS_LOB」の「GETLENGTH」

- C(OCI): 『Oracle Call Interfaceプログラマーズ・ガイド』の「LOB関数」の「OCILobGetLength2()」

- C++(OCCI): 『Oracle C++ Call Interfaceプログラマーズ・ガイド』

- COBOL(Pro*COBOL): 『Pro*COBOLプログラマーズ・ガイド』のLOBの詳細、LOB文の使用上の注意および「埋込みSQLおよびプリコンパイラ・ディレクティブ」の「LOB DESCRIBE」

- C/C++(Pro*C/C++): 『Pro*C/C++プログラマーズ・ガイド』の付録F「埋込みSQL文およびディレクティブ」の「LOB DESCRIBE ...GET LENGTH...」

- COM(OO4O): 『Oracle Objects for OLE開発者ガイド』

- Java(JDBC): 『Oracle Database JDBC開発者ガイドおよびリファレンス』の「LOBとBFILEの操作」の「BLOBまたはCLOB列の作成と移入」

例

次のプログラム環境での例を示します。

- PL/SQL(DBMS_LOBパッケージ): llength.sql

- OCI: llength.c

- C++(OCCI): 今回のリリースでは例は提供されません。

- COM(OO4O): llength.bas

- Java(JDBC): llength.java

他のLOBへのLOBの全体または一部のコピー

この項では、LOBの全体または一部を他のLOBにコピーする方法について説明します。これらのAPIでは、指定した量のデータがソースLOBから宛先LOBにコピーされます。

使用上の注意

このAPIを使用する場合は、次のことに注意してください。

コピーするデータ量の指定

DBMS_LOB.COPYファンクションのamountパラメータでは、次のいずれかの値を渡す必要があります。

- ロードするデータの実際のサイズ以下の量。

- 許容される最大LOBサイズはDBMS_LOB.LOBMAXSIZEです。この値を渡すと、ファンクションでLOB全体がロードされます。この方法は、LOBのサイズをイントロスペクトせずにLOB全体をロードする場合に役立ちます。

文字データの場合は量を文字数で指定し、バイナリ・データの場合はバイト数で指定することに注意してください。

更新前の行のロック

LOB値を更新する予定の場合は、更新前にそのLOBを含む行をロックする必要があります。SQL INSERT文およびUPDATE文は暗黙的に行をロックしますが、SQLプログラムおよびPL/SQLプログラムではSQL SELECT FOR UPDATE文を使用して、またOCIプログラムではOCI pinまたはlock関数を使用して明示的にロックします。

更新後のロケータの状態の詳細は、「更新済ロケータを介したLOBの更新の例」を参照してください。

構文

各プログラム環境における構文については、次のマニュアルの項を参照してください。

- PL/SQL(DBMS_LOBパッケージ): 『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』の「DBMS_LOB」の「COPY」

- C(OCI): 『Oracle Call Interfaceプログラマーズ・ガイド』の「LOB関数」の「OCILobCopy2」

- C++(OCCI): 『Oracle C++ Call Interfaceプログラマーズ・ガイド』

- COBOL(Pro*COBOL): 『Pro*COBOLプログラマーズ・ガイド』のLOBの詳細、LOB文の使用上の注意および「埋込みSQLおよびプリコンパイラ・ディレクティブ」の「LOB COPY」。PL/SQL DBMS_LOB.COPYも参照。

- C/C++(Pro*C/C++): 『Pro*C/C++プログラマーズ・ガイド』の「埋込みSQL文およびディレクティブ」の「LOB COPY」

- COM(OO4O): 『Oracle Objects for OLE開発者ガイド』

- Java(JDBC): 『Oracle Database JDBC開発者ガイドおよびリファレンス』の「LOBとBFILEの操作」の「BLOBまたはCLOB列の作成と移入」

例

次のプログラム環境での例を示します。

- PL/SQL(DBMS_LOBパッケージ): lcopy.sql

- OCI: lcopy.c

- COM(OO4O): lcopy.bas

- Java(JDBC): lcopy.java

LOBロケータのコピー

この項では、LOBロケータをコピーする方法について説明します。様々なロケータが、同じデータや異なるデータ、また現在のデータや過去のデータを指すことに注意してください。

注意:
PL/SQLを使用して1つのLOBを別のLOBに割り当てるには、「:=」演算子を使用します。詳細は、「読取り一貫性のあるロケータ」を参照してください。

構文

各プログラム環境における構文については、次のマニュアルの項を参照してください。

- PL/SQL(DBMS_LOBパッケージ): LOBロケータを他のLOBロケータに割り当てる方法は、「読取り一貫性のあるロケータ」を参照してください。

- C(OCI): 『Oracle Call Interfaceプログラマーズ・ガイド』の「LOB関数」の「OCILobAssign()」、「OCILobIsEqual()」

- C++(OCCI): 『Oracle C++ Call Interfaceプログラマーズ・ガイド』

- COBOL(Pro*COBOL): 『Pro*COBOLプログラマーズ・ガイド』のLOBの詳細、LOB文の使用上の注意および「埋込みSQLおよびプリコンパイラ・ディレクティブ」の「ALLOCATE」、「LOB ASSIGN」

- C/C++(Pro*C/C++): 『Pro*C/C++プログラマーズ・ガイド』の付録F「埋込みSQL文およびディレクティブ」の「SELECT」、「LOB ASSIGN」

- COM(OO4O): 『Oracle Objects for OLE開発者ガイド』

- Java (JDBC): 『Oracle Database JDBC開発者ガイドおよびリファレンス』の第7章「LOBとBFILEの操作」の「BLOBまたはCLOB列の作成と移入」

例

次のプログラム環境での例を示します。

- PL/SQL(DBMS_LOBパッケージ): lcopyloc.sql

- OCI: lcopyloc.c

- C++(OCCI): 今回のリリースでは例は提供されません。

- COM(OO4O): lcopyloc.bas

- Java(JDBC): lcopyloc.java

等値: 2つのLOBロケータが等しいかどうかの確認

この項では、2つのLOBロケータが等しいかどうかを確認する方法について説明します。2つのロケータが等しい場合、それらが同じバージョンのLOBデータを参照していることを意味します。

関連項目:

- 表22-1「LOB APIについてサポートされている環境」

- 「読取り一貫性のあるロケータ」

構文

各プログラム環境における構文については、次のマニュアルの項を参照してください。

- C(OCI): 『Oracle Call Interfaceプログラマーズ・ガイド』の「LOB関数」の「OCILobAssign()」、「OCILobIsEqual()」

- C++(OCCI): 『Oracle C++ Call Interfaceプログラマーズ・ガイド』

- COBOL(Pro*COBOL): 参照マニュアルはありません。

- C/C++(Pro*C/C++): 『Pro*C/C++プログラマーズ・ガイド』の付録F「埋込みSQL文およびディレクティブ」の「LOB ASSIGN」

- COM(OO4O): 参照マニュアルはありません。

- Java(JDBC): 『Oracle Database JDBC開発者ガイドおよびリファレンス』の「LOBとBFILEの操作」の「BLOBまたはCLOB列の作成と移入」

例

次のプログラム環境での例を示します。

- PL/SQL: 今回のリリースでは例は提供されません。

- OCI: lequal.c

- C++(OCCI): 今回のリリースでは例は提供されません。

- COM(OO4O): 今回のリリースでは例は提供されません。

- Java(JDBC): lequal.java

LOBロケータが初期化されているかどうかの確認

この項では、LOBロケータが初期化されているかどうかを確認する方法について説明します。

関連項目:
表22-1「LOB APIについてサポートされている環境」

構文

各プログラム環境における構文については、次のマニュアルの項を参照してください。

- PL/SQL(DBMS_LOBパッケージ): 参照マニュアルはありません。

- C(OCI): 『Oracle Call Interfaceプログラマーズ・ガイド』の「LOB関数」の「OCILobLocatorIsInit()」

- C++(OCCI): 『Oracle C++ Call Interfaceプログラマーズ・ガイド』

- COBOL(Pro*COBOL): 参照マニュアルはありません。

- C/C++ (Pro*C/C++): 『Pro*C/C++プログラマーズ・ガイド』の付録F「埋込みSQL文およびディレクティブ」。C(OCI): OCILobLocatorIsInit()を参照してください。

- COM(OO4O): 参照マニュアルはありません。

- Java(JDBC): 参照マニュアルはありません。

例

次のプログラム環境での例を示します。

- PL/SQL(DBMS_LOBパッケージ): 今回のリリースでは例は提供されません。

- OCI: linit.c

- C(OCCI): 今回のリリースでは例は提供されません。

- COM(OO4O): 今回のリリースでは例は提供されません。

- Java(JDBC): 今回のリリースでは例は提供されません。

LOBへの追加

この項では、バッファの内容をLOBに追加書込みする方法について説明します。

関連項目:
表22-1「LOB APIについてサポートされている環境」

使用上の注意

このAPIの使用方法については、次のことに注意してください。

1つずつまたはピース単位の書込み

writeappend操作では、バッファがLOBの終わりに書き込まれます。

OCIでは、このコールを使用してバッファからピース単位でLOBに書き込むことができます。また、コールバックまたは標準のポーリング方法を使用してもピース単位に処理できます。

ピース単位の書込み: コールバックまたはポーリングの使用時期

ピース・パラメータの値がOCI_FIRST_PIECEの場合、データはコールバックまたはポーリングを介して提供される必要があります。

- コールバック関数またはファンクションがcbfpパラメータ内に定義されている場合、ピースがパイプに書き込まれてから、このコールバック関数またはファンクションをコールして次のピースを取得します。各ピースはbufpから書き込まれます。

- コールバック関数またはファンクションが定義されていないと、OCILobWriteAppend2()はOCI_NEED_DATAエラー・コードを戻します。アプリケーションはOCILobWriteAppend2()を再びコールし、さらにLOBのピースを書き込む必要があります。このモードでは、ピースのサイズおよび位置が異なると、コールごとにバッファ・ポインタや長さが異なる場合があります。ピース値OCI_LAST_PIECEは、ピース単位の書込みを終了します。

更新前の行のロック: PL/SQL DBMS_LOBパッケージまたはOCIを使用してLOBの値を更新する前に、LOBを含む行をロックする必要があります。SQL INSERT文およびUPDATE文は暗黙的に行をロックしますが、SQLプログラムおよびPL/SQLプログラムではSQL SELECT FOR UPDATE文を使用して、またOCIプログラムではOCI pinまたはlock関数を使用して明示的にロックします。

更新後のロケータの状態の詳細は、「更新済ロケータを介したLOBの更新の例」を参照してください。

構文

各プログラム環境における構文については、次のマニュアルの項を参照してください。

- PL/SQL(DBMS_LOBパッケージ): 『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』の「DBMS_LOB」の「WRITEAPPEND」

- C(OCI): 『Oracle Call Interfaceプログラマーズ・ガイド』の「LOB関数」の「OCILobWriteAppend2()」

- C++(OCCI): 『Oracle C++ Call Interfaceプログラマーズ・ガイド』

- COBOL(Pro*COBOL): 『Pro*COBOLプログラマーズ・ガイド』のLOBの詳細、LOB文の使用上の注意および「埋込みSQLおよびプリコンパイラ・ディレクティブ」の「LOB WRITE APPEND」

- C/C++(Pro*C/C++): 『Pro*C/C++プログラマーズ・ガイド』の付録F「埋込みSQL文およびディレクティブ」の「LOB WRITE APPEND」

- COM(OO4O): 参照マニュアルはありません。

- Java (JDBC): 『Oracle Database JDBC開発者ガイドおよびリファレンス』の第7章「LOBとBFILEの操作」の「BLOBまたはCLOB列の作成と移入」

例

次のプログラム環境での例を示します。

- PL/SQL(DBMS_LOBパッケージ): lwriteap.sql

- OCI: lwriteap.c

- C++(OCCI): 今回のリリースでは例は提供されません。

- COM(OO4O): 今回のリリースでは例は提供されません。

- Java(JDBC): lwriteap.java

LOBへのデータの書込み

この項では、バッファの内容をLOBに書き込む方法について説明します。

関連項目:

- 表22-1「LOB APIについてサポートされている環境」

- LOBからのデータの読取り

使用上の注意

このAPIの使用方法については、次のことに注意してください。

ストリーム書込み

大量のLOBデータを最も効率よく書き込むには、ポーリングまたはコールバックによってストリーム・メカニズムを有効にしたOCILobWrite2()を使用します。LOBに書き込むデータの量がわかっている場合は、OCILobWrite2()のコール時にそのデータ量を指定します。これにより、ディスク上のLOBデータが確実に連続したものになります。領域を効率的に利用できるのみでなく、LOBデータの連続性により、その後の操作で読み書きの速度が速くなります。

チャンク・サイズ

チャンクとは1つまたは複数のOracleブロックです。LOBを含む表を作成する場合に、LOB用のチャンク・サイズを指定できます。これは、LOB値に対してアクセスまたは変更を行うときに、Oracle Databaseが使用するデータ・サイズに対応します。チャンクの一部はシステム関連の情報を格納し、残りはLOB値を格納します。使用するAPIには、LOBチャンク内で使用され、LOB値を格納している領域の量を戻すファンクションがあります。PL/SQLでは、DBMS_LOB.GETCHUNKSIZEを使用します。OCIでは、OCILobGetChunkSize()を使用します。

書込みパフォーマンスを改善するための戻り値の複数倍の指定

これらのファンクションの1つによって戻された値を複数回使用してwrite要求を実行すると、パフォーマンスが向上します。これは、LOBチャンクがwrite要求ごとにバージョン化されるためです。すべてのwriteを1つのチャンクで行うと、余分なバージョン化は行われません。使用しているアプリケーションに問題がなければ、同じサイズのLOBチャンクで複数回のLOB書込みコールを発行するのではなく、十分なサイズのチャンクにバッチ書込みを行うと、パフォーマンスが向上します。

更新前の行のロック

PL/SQL DBMS_LOBパッケージまたはOCIを使用してLOBの値を更新する前に、LOBを含む行をロックする必要があります。SQL INSERT文およびUPDATE文は暗黙的に行をロックしますが、SQLプログラムおよびPL/SQLプログラムではSQL SELECT FOR UPDATE文を使用して、またOCIプログラムではOCI pinまたはlock関数を使用して明示的にロックします。

更新後のロケータの状態の詳細は、「更新済ロケータを介したLOBの更新の例」を参照してください。

DBMS_LOB.WRITEを使用したBLOBへのデータの書込み

16進文字列をDBMS_LOB.WRITE()に渡してBLOBにデータを書き込む場合は、次のガイドラインに従ってください。

- amountパラメータは、バッファのlengthパラメータ以下にする必要があります。

- バッファのlengthは((amount*2) - 1)です。このようなガイドラインがあるのは、文字列の2文字が1つの16進文字とみなされ(そして、暗黙的に16進からRAWへの変換が実行され)、文字列の2バイトごとに1 RAWバイトに変換されるためです。

正しい例は、次のとおりです。

declare
blob_loc  BLOB;
rawbuf RAW(10);
an_offset INTEGER := 1;
an_amount BINARY_INTEGER := 10;
BEGIN
select blob_col into blob_loc from a_table
where id = 1;
rawbuf := '1234567890123456789';
dbms_lob.write(blob_loc, an_amount, an_offset,
rawbuf);
commit;
END;

前の例のan_amountの値を次の値に置き換えると、エラー・メッセージORA-21560が戻されます。

an_amount BINARY_INTEGER := 11;

または

an_amount BINARY_INTEGER := 19;

構文

各プログラム環境における構文については、次のマニュアルの項を参照してください。

- PL/SQL(DBMS_LOBパッケージ): 『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』の「DBMS_LOB」の「WRITE」

- C(OCI): 『Oracle Call Interfaceプログラマーズ・ガイド』の「LOB関数」の「OCILobWrite2()」

- C++(OCCI): 『Oracle C++ Call Interfaceプログラマーズ・ガイド』

- COBOL(Pro*COBOL): 『Pro*COBOLプログラマーズ・ガイド』のLOBの詳細、LOB文の使用上の注意および「埋込みSQLおよびプリコンパイラ・ディレクティブ」の「LOB WRITE」

- C/C++(Pro*C/C++): 『Pro*C/C++プログラマーズ・ガイド』の付録F「埋込みSQL文およびディレクティブ」の「LOB WRITE」

- COM(OO4O): 『Oracle Objects for OLE開発者ガイド』

- Java (JDBC): 『Oracle Database JDBC開発者ガイドおよびリファレンス』の第7章「LOBとBFILEの操作」の「BLOBまたはCLOB列の作成と移入」

例

次のプログラム環境での例を示します。

- PL/SQL(DBMS_LOBパッケージ): lwrite.sql

- OCI: lwrite.c

- COM(OO4O): lwrite.bas

- Java(JDBC): lwrite.java

LOB配列書込み

この項では、OCILobArrayWrite()を使用して、1回のラウンドトリップで複数のロケータに対してLOBデータを読み取る方法について説明します。

使用上の注意

関連項目:
「LOB配列読取り」の配列読取り/書込みの例

ポーリング・モードでのLOB配列書込み

次の例では、バッファ・サイズが1KBの10個のロケータのそれぞれに対して、10KBのデータが書き込まれます。OCILobArrayWrite()は、すべてのデータを書き込むために100(10 × 10)回コールされる必要があります。このファンクションは、OCILobWrite2()と同様の方法で使用されます。

/* Fetch the locators */
...

/* array_iter parameter indicates the number of locators in the array read.
* It is an IN parameter for the 1st call in polling and is ignored as IN
* parameter for subsequent calls. As an OUT parameter it indicates the locator
* index for which the piece is written.
*/

ub4    array_iter = 10;
char  *bufp[10];
oraub8 bufl[10];
oraub8 char_amtp[10];
oraub8 offset[10];
sword  st;
int    i, j;

for (i=0; i<10; i++)
{
bufp[i] = (char *)malloc(1000);
bufl[i] = 1000;
/* Fill bufp here. */
...
offset[i] = 1;
char_amtp[i] = 10000;       /* Single byte fixed width char set. */
}

for (i  = 1; i <= 10; i++)
{
/* Fill up bufp[i-1] here.  The first piece for ith locator would be written from
bufp[i-1] */
...
st =  OCILobArrayWrite(<service context>, <error handle>,
&array_iter, /* array size */
lob_array,   /* array of locators */
NULL,        /* array of byte amounts */
char_amtp,   /* array of char amounts */
offset,      /* array of offsets */
(void **)bufp,        /* array of write buffers */
bufl,        /* array of buffer lengths */
OCI_FIRST_PIECE, /* piece information */
NULL,            /* callback context */
NULL,            /* callback function */
0,               /* character set ID - default */
SQLCS_IMPLICIT); /* character set form */

for ( j = 2; j < 10; j++)
{
/* Fill up bufp[i-1] here.  The jth piece for ith locator would be written from
bufp[i-1] */
...
st =  OCILobArrayWrite(<service context>, <error handle>,
&array_iter, /* array size */
lob_array,   /* array of locators */
NULL,        /* array of byte amounts */
char_amtp,   /* array of char amounts */
offset,      /* array of offsets */
(void **)bufp,        /* array of write buffers */
bufl,        /* array of buffer lengths */
OCI_NEXT_PIECE, /* piece information */
NULL,           /* callback context */
NULL,           /* callback function */
0,              /* character set ID - default */
SQLCS_IMPLICIT);

/* array_iter returns the index of the current array element for which
* data is being written. for example, aray_iter = 1 implies first locator,
* array_iter = 2 implies second locator and so on. Here i = array_iter.
*
* lob_array[ array_iter - 1] => Lob locator for which data is written.
* bufp[array_iter - 1]       => Buffer pointer from which data is written.
* char_amtp[ array_iter - 1] => Number of characters written in
* the piece just written
*/
}

/* Fill up bufp[i-1] here.  The last piece for ith locator would be written from
bufp[i -1] */
...
st =  OCILobArrayWrite(<service context>, <error handle>,
&array_iter, /* array size */
lob_array,   /* array of locators */
NULL,        /* array of byte amounts */
char_amtp,   /* array of char amounts */
offset,      /* array of offsets */
(void **)bufp,        /* array of write buffers */
bufl,        /* array of buffer lengths */
OCI_LAST_PIECE,  /* piece information */
NULL,            /* callback context */
NULL,            /* callback function */
0,               /* character set ID - default */
SQLCS_IMPLICIT);
}

...

コールバックによるLOB配列書込み

次の例では、バッファ・サイズが1KBの10個のロケータのそれぞれに対して、10KBのデータが書き込まれます。合計100ピース(ロケータごとに10ピース)を書き込む必要があります。最初のピースはOCILobArrayWrite()コールによって提供されます。コールバック関数またはファンクションは99回コールされ、書込み対象の以降のピースに対してデータが取得されます。

/* Fetch the locators */
...

ub4    array_iter = 10;
char  *bufp[10];
oraub8 bufl[10];
oraub8 char_amtp[10];
oraub8 offset[10];
sword  st;

for (i=0; i<10; i++)
{
bufp[i] = (char *)malloc(1000);
bufl[i] = 1000;
offset[i] = 1;
char_amtp[i] = 10000;       /* Single byte fixed width char set. */
}

st =  OCILobArrayWrite(<service context>, <error handle>,
&array_iter, /* array size */
lob_array,   /* array of locators */
NULL,        /* array of byte amounts */
char_amtp,   /* array of char amounts */
offset,      /* array of offsets */
(void **)bufp,        /* array of write buffers */
bufl,        /* array of buffer lengths */
OCI_FIRST_PIECE,  /* piece information */
ctx,              /* callback context */
cbk_write_lob     /* callback function */
0,                /* character set ID - default */
SQLCS_IMPLICIT);

...

/* Callback function for LOB array write. */
sb4 cbk_write_lob(dvoid *ctxp, ub4 array_iter, dvoid *bufxp, oraub8 *lenp,
ub1 *piecep, ub1 *changed_bufpp, oraub8 *changed_lenp)
{
static ub4 piece_count = 0;
piece_count++;

printf (" %dth piece written  for %dth locator \n\n", piece_count, array_iter);

/*-- code to fill bufxp with data goes here. *lenp should reflect the  size and
*   should be less than or equal to MAXBUFLEN -- */
/* --Optional code to set changed_bufpp and changed_lenp if the buffer must
*   be changed dynamically --*/

if (this is the last data buffer for current locator)
*piecep = OCI_LAST_PIECE;
else if (this is the first data buffer for the next locator)
*piecep = OCI_FIRST_PIECE;
piece_count = 0;
else
*piecep = OCI_NEXT_PIECE;

return OCI_CONTINUE;
}
...

配列書込みにおけるポーリングLOBデータ

次の例は、変数amtp、buflおよびoffsetを使用したOCILobArrayWrite()におけるポーリングLOBデータです。

/* Fetch the locators */
...

ub4    array_iter = 10;
char  *bufp[10];
oraub8 bufl[10];
oraub8 char_amtp[10];
oraub8 offset[10];
sword  st;
int    i, j;
int piece_count;

for (i=0; i<10; i++)
{
bufp[i] = (char *)malloc(1000);
bufl[i] = 1000;
/* Fill bufp here. */
...
offset[i] = 1;
char_amtp[i] = 10000;       /* Single byte fixed width char set. */
}

/* For 3rd locator write data in 500 bytes piece from offset 101. Amount
* is 2000, that is, total number of pieces is 2000/500 = 4.
*/
offset[2] = 101; bufl[2] = 500; char_amtp[2] = 2000;

/* For 6th locator write data in 100 bytes piece from offset 51. Amount
* is 0 indicating pure polling, that is, data is written
* till OCI_LAST_PIECE
*/
offset[5] = 51;  bufl[5] = 100; char_amtp[5] = 0;

/* For 8th locator write 100 bytes of data in one piece. Note amount
* is less than buffer length indicating single piece write.
*/
offset[7] = 61;  bufl[7] = 200; char_amtp[7] = 100;

for (i  = 1; i <= 10; i++)
{
/* Fill up bufp[i-1] here.  The first piece for ith locator would be written from
bufp[i-1] */
...
/* Calculate number of pieces that must be written */
piece_count = char_amtp[i-1]/bufl[i-1];

/* Single piece case */
if (char_amtp[i-1] <= bufl[i-1])
piece_count = 1;

/* Zero amount indicates pure polling. So we can write as many
* pieces as needed. Let us write 50 pieces.
*/
if (char_amtp[i-1] == 0)
piece_count = 50;

st =  OCILobArrayWrite(<service context>, <error handle>,
&array_iter, /* array size */
lob_array,   /* array of locators */
NULL,        /* array of byte amounts */
char_amtp,   /* array of char amounts */
offset,      /* array of offsets */
(void **)bufp,        /* array of write buffers */
bufl,        /* array of buffer lengths */
OCI_FIRST_PIECE, /* piece information */
NULL,            /* callback context */
NULL,            /* callback function */
0,               /* character set ID - default */
SQLCS_IMPLICIT); /* character set form */

for ( j = 2; j < piece_count; j++)
{
/* Fill up bufp[i-1] here. The jth piece for ith locator would be written
* from bufp[i-1] */
...
st =  OCILobArrayWrite(<service context>, <error handle>,
&array_iter, /* array size */
lob_array,   /* array of locators */
NULL,        /* array of byte amounts */
char_amtp,   /* array of char amounts */
offset,      /* array of offsets */
(void **)bufp,        /* array of write buffers */
bufl,        /* array of buffer lengths */
OCI_NEXT_PIECE, /* piece information */
NULL,           /* callback context */
NULL,           /* callback function */
0,              /* character set ID - default */
SQLCS_IMPLICIT);

/* array_iter returns the index of the current array element for which
* data is being written. for example, aray_iter = 1 implies first locator,
* array_iter = 2 implies second locator and so on. Here i = array_iter.
*
* lob_array[ array_iter - 1] => Lob locator for which data is written.
* bufp[array_iter - 1]       => Buffer pointer from which data is written.
* char_amtp[ array_iter - 1] => Number of characters written in
* the piece just written
*/
}

/* Fill up bufp[i-1] here.  The last piece for ith locator would be written from
* bufp[i -1] */
...

/* If piece_count is 1 it is a single piece write. */
if (piece_count[i] != 1)
st =  OCILobArrayWrite(<service context>, <error handle>,
&array_iter, /* array size */
lob_array,   /* array of locators */
NULL,        /* array of byte amounts */
char_amtp,   /* array of char amounts */
offset,      /* array of offsets */
(void **)bufp,        /* array of write buffers */
bufl,        /* array of buffer lengths */
OCI_LAST_PIECE,  /* piece information */
NULL,            /* callback context */
NULL,            /* callback function */
0,               /* character set ID - default */
SQLCS_IMPLICIT);
}

...

構文

OCIプログラム環境における構文については、次のマニュアルの項を参照してください。

C(OCI): 『Oracle Call Interfaceプログラマーズ・ガイド』の「LOB関数」の「OCILobArrayWrite()」

例

次のプログラム環境での例を示します。

OCI: lwritearr.c

LOBデータの切捨て

この項では、LOBを指定のサイズまで切り捨てる方法について説明します。

関連項目:
表22-1「LOB APIについてサポートされている環境」

使用上の注意

このAPIの使用方法については、次のことに注意してください。

更新前の行のロック

PL/SQL DBMS_LOBパッケージまたはOCIを使用してLOBの値を更新する前に、LOBを含む行をロックする必要があります。SQL INSERT文およびUPDATE文は暗黙的に行をロックしますが、次の方法を使用すると明示的にロックを行うことができます。

- SQLプログラムおよびPL/SQLプログラムではSELECT FOR UPDATE文

- OCIプログラムではOCI pinまたはlock関数

更新後のロケータの状態の詳細は、「更新済ロケータを介したLOBの更新の例」を参照してください。

構文

各プログラム環境における構文については、次のマニュアルの項を参照してください。

- PL/SQL(DBMS_LOBパッケージ): 『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』の「DBMS_LOB」の「TRIM」

- C(OCI): 『Oracle Call Interfaceプログラマーズ・ガイド』の「LOB関数」の「OCILobTrim2()」

- C++(OCCI): 『Oracle C++ Call Interfaceプログラマーズ・ガイド』

- COBOL(Pro*COBOL): 『Pro*COBOLプログラマーズ・ガイド』のLOBの詳細、LOB文の使用上の注意および「埋込みSQLおよびプリコンパイラ・ディレクティブ」の「LOB TRIM」

- C/C++(Pro*C/C++): 『Pro*C/C++プログラマーズ・ガイド』の付録F「埋込みSQLおよびプリコンパイラ・ディレクティブ」の「LOB TRIM」

- COM(OO4O): 『Oracle Objects for OLE開発者ガイド』

- Java (JDBC): 『Oracle Database JDBC開発者ガイドおよびリファレンス』の第7章「LOBとBFILEの操作」の「BLOBまたはCLOB列の作成と移入」

例

次のプログラム環境での例を示します。

- PL/SQL(DBMS_LOBパッケージ): ltrim.sql

- OCI: ltrim.c

- C++(OCCI): 今回のリリースでは例は提供されません。

- COM(OO4O): ltrim.bas

- Java(JDBC): ltrim.java

LOBの一部の消去

この項では、LOBの一部を消去する方法について説明します。

関連項目:
表22-1「LOB APIについてサポートされている環境」

使用上の注意

このAPIの使用方法については、次のことに注意してください。

更新前の行のロック

PL/SQL DBMS_LOBパッケージまたはOCIを使用してLOBの値を更新する前に、LOBを含む行をロックする必要があります。SQL INSERT文およびUPDATE文は暗黙的に行をロックしますが、SQLプログラムおよびPL/SQLプログラムではSQL SELECT FOR UPDATE文を使用して、またOCIプログラムではOCI pinまたはlock関数を使用して明示的にロックします。

更新後のロケータの状態の詳細は、「更新済ロケータを介したLOBの更新の例」を参照してください。

構文

各プログラム環境における構文については、次のマニュアルの項を参照してください。

- PL/SQL(DBMS_LOBパッケージ): 『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』の「DBMS_LOB」の「ERASE」

- C(OCI): 『Oracle Call Interfaceプログラマーズ・ガイド』の「LOB関数」の「OCILobErase2()」

- C++(OCCI): 『Oracle C++ Call Interfaceプログラマーズ・ガイド』

- COBOL(Pro*COBOL): 『Pro*COBOLプログラマーズ・ガイド』のLOBの詳細、LOB文の使用上の注意および「埋込みSQLおよびプリコンパイラ・ディレクティブ」の「LOB ERASE」に関する項

- C/C++(Pro*C/C++): 『Pro*C/C++プログラマーズ・ガイド』の付録F「埋込みSQLおよびプリコンパイラ・ディレクティブ」の「LOB ERASE」

- COM(OO4O): 『Oracle Objects for OLE開発者ガイド』

- Java(JDBC): 『Oracle Database JDBC開発者ガイドおよびリファレンス』の「LOBとBFILEの操作」の「BLOBまたはCLOB列の作成と移入」

例

次のプログラム環境での例を示します。

- PL/SQL(DBMS_LOBパッケージ): lerase.sql

- OCI: lerase.c

- C++(OCCI): 今回のリリースでは例は提供されません。

- COM(OO4O): lerase.bas

- Java(JDBC): lerase.java

LOBバッファリングの使用可能化

この項では、LOBバッファリングを使用可能にする方法について説明します。

関連項目:
表22-1「LOB APIについてサポートされている環境」

使用上の注意

少量のデータの読取りおよび書込みを実行する場合は、LOBバッファリングを使用可能にします。これらの作業を完了したら、他のLOB操作を行う前にバッファリングを使用禁止にする必要があります。

注意:

- バッファをフラッシュし、変更を永続的にする必要があります。

- チェックインおよびチェックアウトを伴うストリーム読取りおよび書込みを実行する場合は、バッファリングを使用可能にしないでください。

詳細は、「LOBバッファリング・サブシステム」を参照してください。

構文

各プログラム環境における構文については、次のマニュアルの項を参照してください。

- PL/SQL: このAPIは、提供されるPL/SQLパッケージでは使用できません。

- C(OCI): 『Oracle Call Interfaceプログラマーズ・ガイド』の「LOB関数」の「OCIEnableLobBuffering()」、「OCIDisableLobBuffering()」、「OCIFlushBuffer()」

- C++(OCCI): 『Oracle C++ Call Interfaceプログラマーズ・ガイド』

- COBOL(Pro*COBOL): 『Pro*COBOLプログラマーズ・ガイド』のLOBの詳細、LOB文の使用上の注意および「埋込みSQLおよびプリコンパイラ・ディレクティブ」の「LOB ENABLE BUFFERING」

- C/C++(Pro*C/C++): 『Pro*C/C++プログラマーズ・ガイド』の付録F「埋込みSQLおよびプリコンパイラ・ディレクティブ」の「LOB ENABLE BUFFERING」

- COM(OO4O): 『Oracle Objects for OLE開発者ガイド』

- Java(JDBC): 参照マニュアルはありません。

例

次のプログラム環境での例を示します。

- PL/SQL: 例は提供されません。

- C(OCI): 今回のリリースでは例は提供されません。このAPIの使用方法に類似する例は、「LOBバッファリングの使用禁止化」を参照してください。

- C++(OCCI): 今回のリリースでは例は提供されません。

- COM(OO4O): lenbuf.bas

- Java(JDBC): 例は提供されません。

バッファのフラッシュ

この項では、LOBバッファをフラッシュする方法について説明します。

関連項目:
表22-1「LOB APIについてサポートされている環境」

使用上の注意

少量のデータの読取りおよび書込みを実行する場合は、バッファリングを使用可能にします。これらの作業を完了したら、他のLOB操作を行う前にバッファリングを使用禁止にする必要があります。

注意:

- バッファをフラッシュし、変更を永続的にする必要があります。

- チェックインおよびチェックアウトを伴うストリーム読取りおよび書込みを実行する場合は、バッファリングを使用可能にしないでください。

詳細は、「LOBバッファリング・サブシステム」を参照してください。

構文

各プログラム環境における構文については、次のマニュアルの項を参照してください。

- PL/SQL(DBMS_LOBパッケージ): 参照マニュアルはありません。

- C(OCI): 『Oracle Call Interfaceプログラマーズ・ガイド』の「LOB関数」の「OCIEnableLobBuffering()」、「OCIDisableLobBuffering()」、「OCIFlushBuffer()」

- C++(OCCI): 『Oracle C++ Call Interfaceプログラマーズ・ガイド』

- COBOL(Pro*COBOL): 『Pro*COBOLプログラマーズ・ガイド』のLOBの詳細、LOB文の使用上の注意および「埋込みSQLおよびプリコンパイラ・ディレクティブ」の「LOB FLUSH BUFFER」

- C/C++(Pro*C/C++): 『Pro*C/C++プログラマーズ・ガイド』の付録F「埋込みSQL文およびディレクティブ」の「LOB FLUSH BUFFER」

- COM(OO4O): 『Oracle Objects for OLE開発者ガイド』

- Java(JDBC): 参照マニュアルはありません。

例

次のプログラム環境での例を示します。

- PL/SQL(DBMS_LOBパッケージ): 今回のリリースでは例は提供されません。

- C(OCI): 今回のリリースでは例は提供されません。このAPIの使用方法に類似する例は、「LOBバッファリングの使用禁止化」を参照してください。

- C++(OCCI): 今回のリリースでは例は提供されません。

- COM(OO4O): 今回のリリースでは例は提供されません。

- Java(JDBC): 今回のリリースでは例は提供されません。

LOBバッファリングの使用禁止化

この項では、LOBバッファリングを使用禁止にする方法について説明します。

関連項目:
表22-1「LOB APIについてサポートされている環境」

使用上の注意

少量のデータの読取りおよび書込みを実行する場合は、バッファリングを使用可能にします。これらの作業を完了したら、他のLOB操作を行う前にバッファリングを使用禁止にする必要があります。

注意:

- バッファをフラッシュし、変更を永続的にする必要があります。

- チェックインおよびチェックアウトを伴うストリーム読取りおよび書込みを実行する場合は、バッファリングを使用可能にしないでください。

詳細は、「LOBバッファリング・サブシステム」を参照してください。

構文

各プログラム環境における構文については、次のマニュアルの項を参照してください。

- PL/SQL (DBMS_LOBパッケージ): 参照マニュアルはありません。

- C(OCI): 『Oracle Call Interfaceプログラマーズ・ガイド』の「LOB関数」の「OCIEnableLobBuffering()」、「OCIDisableLobBuffering()」、「OCIFlushBuffer()」

- C++(OCCI): 『Oracle C++ Call Interfaceプログラマーズ・ガイド』

- COBOL(Pro*COBOL): 『Pro*COBOLプログラマーズ・ガイド』のLOBの詳細、LOB文の使用上の注意および「埋込みSQLおよびプリコンパイラ・ディレクティブ」の「LOB DISABLE BUFFER」

- C/C++(Pro*C/C++): 『Pro*C/C++プログラマーズ・ガイド』の付録F「埋込みSQL文およびディレクティブ」の「LOB DISABLE BUFFER」

- COM(OO4O): 『Oracle Objects for OLE開発者ガイド』

- Java(JDBC): 参照マニュアルはありません。

例

次のプログラム環境での例を示します。

- PL/SQL(DBMS_LOBパッケージ): 今回のリリースでは例は提供されません。

- OCI: ldisbuf.c

- C++(OCCI): 今回のリリースでは例は提供されません。

- COM(OO4O): ldisbuf.bas

- Java(JDBC): 今回のリリースでは例は提供されません。

LOBインスタンスが一時LOBであるかどうかの確認

この項では、LOBインスタンスが一時LOBであるかどうかを確認する方法について説明します。

関連項目:
表22-1「LOB APIについてサポートされている環境」

構文

各プログラム環境における構文については、次のマニュアルの項を参照してください。

- PL/SQL(DBMS_LOB): 『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』の「DBMS_LOB」の「ISTEMPORARY」、「FREETEMPORARY」

- C(OCI): 『Oracle Call Interfaceプログラマーズ・ガイド』の「LOB関数」の「OCILobIsTemporary()」

- COBOL(Pro*COBOL): 『Pro*COBOLプログラマーズ・ガイド』のLOBの詳細、LOB文の使用上の注意および「埋込みSQLおよびプリコンパイラ・ディレクティブ」の「LOB DESCRIBE」、「ISTEMPORARY」

- C/C++(Pro*C/C++): 『Pro*C/C++プログラマーズ・ガイド』の付録F「埋込みSQL文およびディレクティブ」の「LOB DESCRIBE...ISTEMPORARY」

- COM(OO4O): 参照マニュアルはありません。

- Java(JDBC): 『Oracle Database JDBC開発者ガイドおよびリファレンス』の「LOBとBFILEの操作」の「BLOBまたはCLOB列の作成と移入」

例

次のプログラム環境での例を示します。

- PL/SQL(DBMS_LOBパッケージ): listemp.sql

- OCI: listemp.c

- COM(OO4O): 例は提供されません。

Java(JDBC): BLOBが一時LOBであるかどうかの確認

BLOBが一時LOBかどうかの判別に、JDBCアプリケーションでは、現在のBLOBオブジェクトについてはisTemporaryインスタンス・メソッドを使用し、指定されたBLOBオブジェクトについては、そのBLOBオブジェクトを静的なisTemporaryメソッドに渡して確認できます。これらの2つのメソッドは、listempb.javaで定義されています。

このJDBC APIによって、以前のDBMS_LOB.isTemporary()を使用する必要がなくなります。

CLOBが一時的かどうかを判定するには、JDBCアプリケーションでisTemporaryインスタンス・メソッドを使用して現在のCLOBオブジェクトが一時的かどうかを判定する方法と、CLOBオブジェクトを静的なisTemporaryメソッドに渡す方法があります。これらの2つのメソッドは、listempc.javaで定義されています。

BLOBからCLOBへの変換

PL/SQL DBMS_LOB.CONVERTTOCLOBプロシージャを使用すると、BLOBインスタンスをCLOBに変換できます。この方法は、CLOBに格納する文字データがバイナリ形式で格納されている場合に役立ちます。このプロシージャのコール時に、バイナリ・データのキャラクタ・セットを指定します。このプロシージャの構文と使用方法の詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

CLOBからBLOBへの変換

PL/SQL DBMS_LOB.CONVERTTOBLOBプロシージャを使用すると、CLOBインスタンスをBLOBインスタンスに変換できます。この方法では、LOB APIを使用して文字データをバイナリ・データに簡単に変換できます。このプロシージャの構文と使用方法の詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

読取り一貫性の保証

このスクリプトを使用して、NOLOGGINGまたはFILESYSTEM_LIKE_LOGGING LOBを持つ、読取り非一貫性のないリカバリ・ポイントを把握している表のホット・バックアップを確実に取ることができます。

ALTER DATABASE FORCE LOGGING;
SELECT CHECKPOINT_CHANGE# FROM V$DATABASE;  --Start SCN

SCN(システム変更番号)は、トランザクションがコミットされた時点のデータベースのバージョンを定義するスタンプです。

バックアップを実行します。

次のスクリプトを実行します。

ALTER SYSTEM CHECKPOINT GLOBAL;
SELECT CHECKPOINT_CHANGE# FROM V$DATABASE;  --End SCN
ALTER DATABASE NO FORCE LOGGING;

データベースで生成されたアーカイブ・ログをバックアップします。少なくとも、開始SCNと終了SCN(両方のSCN時点を含む)の間のアーカイブ・ログはバックアップする必要があります。

読取り非一貫性のない時点までリストアするため、不完全なリカバリの時点として終了SCNまでリストアします。終了SCNより後のSCNにリカバリを実行すると、NOLOGGING LOBで読取り非一貫性が発生する可能性があります。

SecureFilesでは、メディア・リカバリ中に読取り非一貫性が検出されると、データベースにより一貫性のないブロックがホールとして処理され、BLOBに0が、CLOBに充填文字が格納されます。

A LOBデモ・ファイル

この付録では、サポートされているプログラム環境でLOBを使用する方法を示す、データベース付属のファイルについて説明します。この付録の内容は次のとおりです。

- PL/SQLのLOBデモ・ファイル

- OCIのLOBデモ・ファイル

- COM OO4O LOBデモ・ファイル

- JavaのLOBデモ・ファイル

PL/SQLのLOBデモ・ファイル

次の表に、PL/SQLデモ・ファイルを示します。各ファイルは$ORACLE_HOME/rdbms/demo/lobs/plsql/にインストールされます。これらのファイルをコールするドライバ・プログラムlobdemo.sqlも、同じディレクトリにインストールされます。

表A-1 PL/SQLデモの例

ファイル名

説明

使用方法と参照先

fclose_c.sql

CLOSEを使用したBFILEのクローズ

CLOSEを使用したBFILEのクローズ

fclose_f.sql

FILECLOSEを使用したBFILEのクローズ

FILECLOSEを使用したBFILEのクローズ

fclosea.sql

オープン中のすべてのBFILEのクローズ

FILECLOSEALLを使用したオープン中のすべてのBFILEのクローズ

fcompare.sql

2つのBFILEの全体または一部の比較

2つのBFILEの全体または一部の比較

fcopyloc.sql

BFILEのLOBロケータのコピー

BFILEロケータの割当て

fdisplay.sql

BFILEデータの表示

BFILEデータの表示

fexists.sql

BFILEの有無のチェック

BFILEが存在するかどうかの確認

ffilopen.sql

FILEOPENを使用したBFILEのオープン

FILEOPENを使用したBFILEのオープン

ffisopen.sql

FILEISOPENを使用した、BFILEがOPENしているかどうかの確認

FILEISOPENを使用した、BFILEがオープンしているかどうかの確認

fgetdir.sql

BFILEのディレクトリ・オブジェクト名とファイル名の取得

BFILEのディレクトリ・オブジェクト名とファイル名の取得

finsert.sql

初期化したBFILEロケータを使用したBFILEを含む行の挿入

BFILEを含む行の挿入

fisopen.sql

ISOPENを使用した、BFILEがオープンしているかどうかの確認

ISOPENを使用した、BFILEがオープンしているかどうかの確認

flength.sql

BFILEの長さの取得

BFILEの長さの取得

floadlob.sql

LOBへのBFILEデータのロード

LOBへのBFILEデータのロード

fopen.sql

OPENを使用したBFILEのオープン

OPENを使用したBFILEのオープン

fpattern.sql

instrを使用した、BFILEにパターンが存在するかどうかの確認

INSTRを使用した、BFILEにパターンが存在するかどうかの確認

fread.sql

BFILEからのデータの読取り

BFILEからのデータの読取り

freadprt.sql

SUBSTRを使用した、BFILEデータの一部の読取り

SUBSTRを使用した、BFILEデータの一部の読取り

fupdate.sql

初期化したBFILEロケータを使用したBFILEの更新

初期化したBFILEロケータを使用したBFILEの更新

lappend.sql

他のLOBへのLOBの追加

他のLOBへのLOBの追加

lcompare.sql

LOBの全体または一部の比較

2つのLOBの全体または一部の比較

lcopy.sql

LOBの全体または一部の他のLOBへのコピー

他のLOBへのLOBの全体または一部のコピー

lcopyloc.sql

LOBロケータのコピー

他のLOBへのLOBの全体または一部のコピー

ldisplay.sql

LOBデータの表示

LOBデータの表示

lerase.sql

LOBの一部の消去

LOBの一部の消去

linsert.sql

初期化したLOBロケータ・バインド変数を使用した行の挿入

初期化したLOBロケータ・バインド変数を使用した行の挿入

linstr.sql

LOBにパターンが存在するかどうかの確認(INSTR)

パターン: INSTRを使用したLOB内のパターンの有無の確認

lisopen.sql

LOBがオープンしているかどうかの確認

LOBがオープンしているかどうかの確認

listemp.sql

LOBが一時LOBであるかどうかの確認

LOBインスタンスが一時LOBであるかどうかの確認

lldblobf.sql

DBMS_LOB.LOADBLOBFROMFILEを使用した、BLOBへのBFILEデータのロード

BLOBへのBFILEデータのロード

lldclobf.sql

DBMS_LOB.LOADCLOBFROMFILEを使用した、CLOBまたはNCLOBへのBFILEデータのロード

CLOBまたはNCLOBへのBFILEデータのロード

lldclobs.sql

DBMS_LOB.LOADCLOBFROMFILEを使用した、BFILEから別のCLOBへのデータ・ストリームのセグメントのロード

CLOBまたはNCLOBへのBFILEデータのロード

llength.sql

LOBの長さの取得

長さ: LOBの長さの取得

lloaddat.sql

LOBへのBFILEデータのロード

LOBへのBFILEデータのロード

lobuse.sql

LOB APIの使用例

PL/SQLにおける永続LOBと一時LOBの作成

lread.sql

LOBからのデータの読取り

LOBからのデータの読取り

lsubstr.sql

LOBの一部の読取り(SUBSTR)

LOBの一部の読取り(SUBSTR)

ltrim.sql

LOBデータの切捨て

LOBデータの切捨て

lwrite.sql

LOBへのデータの書込み

LOBへのデータの書込み

lwriteap.sql

LOBの終わりまでの書込み(WRITE APPEND)

LOBへの追加

OCIのLOBデモ・ファイル

次の表に、OCIデモ・ファイルを示します。各ファイルは$ORACLE_HOME/rdbms/demo/lobs/oci/にインストールされます。これらのファイルをコールするドライバ・プログラムlobdemo.c、およびヘッダー・ファイルlobdemo.hも同じディレクトリにインストールされます。

表A-2 OCIデモの例

ファイル名

説明

使用方法と参照先

fclose_c.c

CLOSEを使用したBFILEのクローズ

CLOSEを使用したBFILEのクローズ

fclose_f.c

FILECLOSEを使用したBFILEのクローズ

FILECLOSEを使用したBFILEのクローズ

fclosea.c

オープン中のすべてのBFILEのクローズ

FILECLOSEALLを使用したオープン中のすべてのBFILEのクローズ

fcopyloc.c

BFILEのLOBロケータのコピー

BFILEロケータの割当て

fdisplay.c

BFILEデータの表示

BFILEデータの表示

fexists.c

BFILEの有無のチェック

BFILEが存在するかどうかの確認

ffilopen.c

FILEOPENを使用したBFILEのオープン

FILEOPENを使用したBFILEのオープン

ffisopen.c

FILEISOPENを使用した、BFILEがOPENしているかどうかの確認

FILEISOPENを使用した、BFILEがオープンしているかどうかの確認

fgetdir.c

BFILEのディレクトリ・オブジェクト名とファイル名の取得

BFILEのディレクトリ・オブジェクト名とファイル名の取得

finsert.c

初期化したBFILEロケータを使用したBFILEを含む行の挿入

BFILEを含む行の挿入

fisopen.c

ISOPENを使用した、BFILEがオープンしているかどうかの確認

ISOPENを使用した、BFILEがオープンしているかどうかの確認

flength.c

BFILEの長さの取得

BFILEの長さの取得

floadlob.c

LOBへのBFILEデータのロード

LOBへのBFILEデータのロード

fopen.c

OPENを使用したBFILEのオープン

OPENを使用したBFILEのオープン

fread.c

BFILEからのデータの読取り

BFILEからのデータの読取り

fupdate.c

初期化したBFILEロケータを使用したBFILEの更新

初期化したBFILEロケータを使用したBFILEの更新

lappend.c

他のLOBへのLOBの追加

他のLOBへのLOBの追加

lcopy.c

LOBの全体または一部の他のLOBへのコピー

他のLOBへのLOBの全体または一部のコピー

lcopyloc.c

LOBロケータのコピー

他のLOBへのLOBの全体または一部のコピー

ldisbuf.c

LOBバッファリングの使用禁止(永続LOB)

LOBバッファリングの使用禁止化

ldisplay.c

LOBデータの表示

LOBデータの表示

lequal.c

2つのLOBロケータが等しいかどうかの確認

等値: 2つのLOBロケータが等しいかどうかの確認

lerase.c

LOBの一部の消去

LOBの一部の消去

lgetchar.c

キャラクタ・セットIDの取得

キャラクタ・セットIDの取得

lgetchfm.c

外国語ad text、ad_fltextnのキャラクタ・セット・フォームの取得

キャラクタ・セット・フォームの取得

linit.c

LOBロケータが初期化されているかどうかの確認

LOBロケータが初期化されているかどうかの確認

linsert.c

初期化したLOBロケータ・バインド変数を使用した行の挿入

初期化したLOBロケータ・バインド変数を使用した行の挿入

lisopen.c

LOBがオープンしているかどうかの確認

LOBがオープンしているかどうかの確認

listemp.c

LOBが一時LOBであるかどうかの確認

LOBインスタンスが一時LOBであるかどうかの確認

llength.c

LOBの長さの取得

長さ: LOBの長さの取得

lloaddat.c

LOBへのBFILEデータのロード

LOBへのBFILEデータのロード

lread.c

LOBからのデータの読取り

LOBからのデータの読取り

lreadarr.c

LOBロケータの配列からのデータの読取り

LOB配列読取り

ltrim.c

LOBデータの切捨て

LOBデータの切捨て

lwrite.c

LOBへのデータの書込み

LOBへのデータの書込み

lwritearr.c

LOBロケータの配列へのデータの書込み

LOB配列書込み

lwriteap.c

LOBの終わりまでの書込み(WRITE APPEND)

LOBへの追加

COM OO4O LOBデモ・ファイル

次の表に、COM OO4Oデモ・ファイルを示します。各ファイルは$ORACLE_HOME/rdbms/demo/lobs/vb/にインストールされます。

表A-3 COM OO4Oデモの例

ファイル名

説明

使用方法と参照先

fclose_c.bas

CLOSEを使用したBFILEのクローズ

CLOSEを使用したBFILEのクローズ

fclosea.bas

オープン中のすべてのBFILEのクローズ

FILECLOSEALLを使用したオープン中のすべてのBFILEのクローズ

fcompare.bas

2つのBFILEの全体または一部の比較

2つのBFILEの全体または一部の比較

fdisplay.bas

BFILEデータの表示

BFILEデータの表示

fexists.bas

BFILEの有無のチェック

BFILEが存在するかどうかの確認

fgetdir.bas

BFILEのディレクトリ・オブジェクト名とファイル名の取得

BFILEのディレクトリ・オブジェクト名とファイル名の取得

finsert.bas

初期化したBFILEロケータを使用したBFILEを含む行の挿入

BFILEを含む行の挿入

fisopen.bas

ISOPENを使用した、BFILEがオープンしているかどうかの確認

ISOPENを使用した、BFILEがオープンしているかどうかの確認

flength.bas

BFILEの長さの取得

BFILEの長さの取得

floadlob.bas

LOBへのBFILEデータのロード

LOBへのBFILEデータのロード

fopen.bas

OPENを使用したBFILEのオープン

OPENを使用したBFILEのオープン

fread.bas

BFILEからのデータの読取り

BFILEからのデータの読取り

freadprt.bas

SUBSTRを使用した、BFILEデータの一部の読取り

SUBSTRを使用した、BFILEデータの一部の読取り

fupdate.bas

初期化したBFILEロケータを使用したBFILEの更新

初期化したBFILEロケータを使用したBFILEの更新

lappend.bas

他のLOBへのLOBの追加

他のLOBへのLOBの追加

lcompare.bas

LOBの全体または一部の比較

2つのLOBの全体または一部の比較

lcopy.bas

LOBの全体または一部の他のLOBへのコピー

他のLOBへのLOBの全体または一部のコピー

lcopyloc.bas

LOBロケータのコピー

他のLOBへのLOBの全体または一部のコピー

ldisbuf.bas

LOBバッファリングの使用禁止(永続LOB)

LOBバッファリングの使用禁止化

ldisplay.bas

LOBデータの表示

LOBデータの表示

lenbuf.bas

LOBバッファリングの使用可能化

LOBバッファリングの使用可能化

lerase.bas

LOBの一部の消去

LOBの一部の消去

linsert.bas

初期化したLOBロケータ・バインド変数を使用した行の挿入

初期化したLOBロケータ・バインド変数を使用した行の挿入

llength.bas

LOBの長さの取得

長さ: LOBの長さの取得

lloaddat.bas

LOBへのBFILEデータのロード

LOBへのBFILEデータのロード

lread.bas

LOBからのデータの読取り

LOBからのデータの読取り

lsubstr.bas

LOBの一部の読取り(SUBSTR)

LOBの一部の読取り(SUBSTR)

ltrim.bas

LOBデータの切捨て

LOBデータの切捨て

lwrite.bas

LOBへのデータの書込み

LOBへのデータの書込み

JavaのLOBデモ・ファイル

次の表に、Javaデモ・ファイルを示します。各ファイルは$ORACLE_HOME/rdbms/demo/lobs/java/にインストールされます。

表A-4 Javaデモの例

ファイル名

説明

使用方法と参照先

Readme.txt

-

JDBCプログラムをOracleドライバでコンパイルして実行できるようにシステムを設定する方法の詳細は、『Oracle Database JDBC開発者ガイドおよびリファレンス』の「スタート・ガイド」の章を参照してください。

LobDemoConnectionFactory.java

-

記述どおりのLobDemoConnectionFactory.javaでは、JDBC OCIドライバがローカル接続で使用されます。使用する設定に一致するように、URL "jdbc:oracle:oci8:@"を編集する必要があります。JDBCドキュメントの「スタート・ガイド」を参照してください。

fclose_c.java

CLOSEを使用したBFILEのクローズ

CLOSEを使用したBFILEのクローズ

fclose_f.java

FILECLOSEを使用したBFILEのクローズ

FILECLOSEを使用したBFILEのクローズ

fclosea.java

オープン中のすべてのBFILEのクローズ

FILECLOSEALLを使用したオープン中のすべてのBFILEのクローズ

fcompare.java

2つのBFILEの全体または一部の比較

2つのBFILEの全体または一部の比較

fexists.java

BFILEの有無のチェック

BFILEが存在するかどうかの確認

ffilopen.java

FILEOPENを使用したBFILEのオープン

FILEOPENを使用したBFILEのオープン

ffisopen.java

FILEISOPENを使用した、BFILEがオープンしているかどうかの確認

FILEISOPENを使用した、BFILEがオープンしているかどうかの確認

fgetdir.java

BFILEのディレクトリ・オブジェクト名とファイル名の取得

BFILEのディレクトリ・オブジェクト名とファイル名の取得

finsert.java

初期化したBFILEロケータを使用したBFILEを含む行の挿入

BFILEを含む行の挿入

fisopen.java

ISOPENを使用した、BFILEがオープンしているかどうかの確認

ISOPENを使用した、BFILEがオープンしているかどうかの確認

flength.java

BFILEの長さの取得

BFILEの長さの取得

fopen.java

OPENを使用したBFILEのオープン

OPENを使用したBFILEのオープン

fpattern.java

instrを使用した、BFILEにパターンが存在するかどうかの確認

INSTRを使用した、BFILEにパターンが存在するかどうかの確認

fread.java

BFILEからのデータの読取り

BFILEからのデータの読取り

fupdate.java

初期化したBFILEロケータを使用したBFILEの更新

初期化したBFILEロケータを使用したBFILEの更新

lappend.java

他のLOBへのLOBの追加

他のLOBへのLOBの追加

lcompare.java

LOBの全体または一部の比較

2つのLOBの全体または一部の比較

lcopy.java

LOBの全体または一部の他のLOBへのコピー

他のLOBへのLOBの全体または一部のコピー

lerase.java

LOBの一部の消去

LOBの一部の消去

linsert.java

初期化したLOBロケータ・バインド変数を使用した行の挿入

初期化したLOBロケータ・バインド変数を使用した行の挿入

linstr.java

LOBにパターンが存在するかどうかの確認(INSTR)

パターン: INSTRを使用したLOB内のパターンの有無の確認

lisopen.java

LOBがオープンしているかどうかの確認

LOBがオープンしているかどうかの確認

listempb.java

LOBが一時LOBであるかどうかの確認

LOBインスタンスが一時LOBであるかどうかの確認

listempc.java

LOBが一時LOBであるかどうかの確認

LOBインスタンスが一時LOBであるかどうかの確認

llength.java

LOBの長さの取得

長さ: LOBの長さの取得

lloaddat.java

LOBへのBFILEデータのロード

LOBへのBFILEデータのロード

lread.java

LOBからのデータの読取り

LOBからのデータの読取り

lsubstr.java

LOBの一部の読取り(SUBSTR)

LOBの一部の読取り(SUBSTR)

ltrim.java

LOBデータの切捨て

LOBデータの切捨て

lwrite.java

LOBへのデータの書込み

LOBへのデータの書込み

lwriteap.java

LOBの終わりまでの書込み(WRITE APPEND)

LOBへの追加

用語集

BFILE

ラージ・オブジェクト・データ型。データベースのデータファイルや表領域の外で、ファイルシステムに常駐するバイナリ・ファイル。BFILEデータ型は、ドキュメントによっては外部LOBと呼ばれることもあります。

バイナリ・ラージ・オブジェクト(BLOB)

内容がバイナリ・データで構成され、通常は非構造化データの保持に使用されるラージ・オブジェクト・データ型。BLOBデータ型は、データベースに常駐するため、永続LOBのカテゴリに含まれます。

BLOB

「ビーロブ」と読みます。「バイナリ・ラージ・オブジェクト」を参照してください。

キャラクタ・ラージ・オブジェクト(CLOB)

内容がデータベース・キャラクタ・セットの文字データで構成されるLOBデータ型。CLOBは、Oracle Text検索エンジンで索引を付けて検索できます。

CLOB

「シーロブ」と読みます。「キャラクタ・ラージ・オブジェクト」を参照してください。

重複除外

重複するLOBデータを自動検出し、1つのみを格納することにより記憶域を節約する機能(記憶域パラメータがSECUREFILEの場合)。

外部LOB

データベース表領域の外に格納されるラージ・オブジェクト・データ型。BFILEデータ型は、唯一の外部LOBデータ型。「BFILE」も参照してください。

内部永続LOB

データベース内でBLOB列、CLOB列またはNCLOB列に格納されるラージ・オブジェクト(LOB)。

イントロスペクト

オブジェクトの属性または値を検査すること。

ラージ・オブジェクト(LOB)

SQLのBLOB、CLOB、NCLOBおよびBFILEデータ型を含むオブジェクト。これらのデータ型は、サイズの大きいデータを格納するように設計されています。「BFILE」、「バイナリ・ラージ・オブジェクト」、「キャラクタ・ラージ・オブジェクト」および「各国語キャラクタ・ラージ・オブジェクト」も参照してください。

LOB

「ラージ・オブジェクト」を参照してください。

LOB属性

オブジェクト・データ型のフィールドであるラージ・オブジェクト・データ型。オブジェクト型のCLOBフィールドなど。

LOB値

ラージ・オブジェクトに格納される実際のデータ。たとえば、BLOBに写真が格納されている場合、BLOBの値は画像を構成するデータです。

各国語キャラクタ・ラージ・オブジェクト

内容がデータベースの各国語キャラクタ・セットによるUnicode文字データで構成されるLOBデータ型。NCLOBは、Oracle Text検索エンジンで索引を付けて検索できます。

NCLOB

「エヌシーロブ」と読みます。「各国語キャラクタ・ラージ・オブジェクト」を参照してください。

永続LOB

データベースに格納されるBLOB、CLOBまたはNCLOB。永続LOBインスタンスを表から選択し、アプリケーションのスコープ内で使用できます。インスタンスのACID(atomic、consistent、isolatedおよびdurable)プロパティは、他の列型の場合と同様に保持されます。永続LOBを、内部永続LOBまたは単に内部LOBと呼ぶこともあります。

永続LOBは、オブジェクト・データ型のフィールドおよびLOB型の列のインスタンスのフィールドとして存在できます。たとえば、オブジェクト型のインスタンスのCLOB属性などがあります。

「一時LOB」および「外部LOB」も参照してください。

SECUREFILE

重複除外、暗号化、圧縮を可能にするLOB記憶域パラメータ。これらの機能を許可しない逆のパラメータは、BASICFILEです。

表領域

関連する論理構造をグループ化するデータベース記憶域ユニット。

一時LOB

宣言されたアプリケーションのスコープ内でのみ存続し、そのスコープ内でのみアクセス可能なBLOB、CLOBまたはNCLOB。一時LOBはデータベース表に存在しません。

索引
A  B  C  D  E  F  H  I  J  K  L  M  N  O  P  R  S  T  U  V  W  Z

A

抽象データ型とLOB, 1.8

LOBのアクセス統計, 14.3

LOBへのアクセス

LOB APIの使用, 2.6.3

外部LOBへのアクセス, 21.2 ALTER TABLE, 4.3 SecureFiles LOB用のALTER TABLEパラメータ, 4.3 量, 21.13 量パラメータ

BFILEでの使用, 21.7

追加

LOBへの追加の書込み

内部永続LOB, 22.20

配列の読取り, 22.11 配列の書込み, 22.22 OCILobLocatorポインタの割当, 13.4.6 ASSM表領域, 4.2, 4.2.1.2, 4.5, 4.7.4, 11.3.2, 11.3.2, 11.3.6, 18.4.3 使用可能なLOBメソッド, 13.2

B

BASICFILE

LOB記憶域パラメータ, 4.2.1.1

BFILEクラス, 「JDBC」を参照 BFILEバッファリング, 「JDBC」を参照 BFILENAMEファンクション, 2.5.2.2, 21.4, 21.5.1 BFILE

アクセス, 21.2

CLOBまたはNCLOBへの変換, 21.7

オブジェクト・キャッシュ内でのオブジェクトの作成, 12.5

データ型, 1.7

DBMS_LOB読取り専用プロシージャ, 13.3.8

DBMS_LOB, バイトで示されるオフセット・パラメータおよび量パラメータ, 13.3.2

使用できないハード・リンクおよびシンボリック・リンク, 3.3.1

ロケータ, 2.5

最大オープン数, 3.3.2, 3.3.2, 21.18

最大サイズ, 12.6, 12.6

マルチスレッド・サーバー, 2.7.2

マルチスレッド・サーバー・モード, 21.6.7

LOB記憶域プロパティの影響を受けない, 11.3.1

値の読取りまたはテストを行うOCI関数, 13.4.10, 13.5.10

OCI読取り専用関数, 13.4.12, 13.5.11

JDBCを使用したオープンおよびクローズ, 13.9.21

OSファイル, 3.3.1

Oracle Objects for OLE (OO4O)

メソッドのオープンおよびクローズ, 13.8.7

プロパティ, 13.8.11

読取り専用メソッド, 13.8.10

Pro*C/C++プリコンパイラ文, 13.6.6 Pro*COBOLプリコンパイラ埋込みSQL文, 13.7.6 DBMS_LOBでの読取り, 13.3.6 使用規則, 3.3.1 セキュリティ, 21.5.1, 21.6 ストレージ・デバイス, 1.4.2 任意のオペレーティング・システム・ファイルの格納, 1.7 ストリーミングAPI, 13.9.25 読取りまたはテストのためのJDBCの使用, 13.9.15 オープンおよびクローズのためのPro*C/C++プリコンパイラの使用, 13.6.9 バインド変数, OCIでLOBロケータとともに使用, 13.4.7 バインド

「INSERT文」および「UPDATE文」を参照

Blobクラス, 13.5.1.2 BLOBバッファリング, 「JDBC」を参照 BLOB

クラス, 「JDBC」を参照

データ型, 1.7

DBMS_LOB, バイトで示されるオフセット・パラメータおよび量パラメータ, 13.3.2

最大サイズ, 12.6

DBMS_LOBを使用した変更, 13.3.5

変更のためのJDBCの使用, 13.9.9

BLOB値の読取りまたはテストのためのJDBCの使用, 13.9.10

変更のためのoracle.sql.BLOBメソッドの使用, 13.9.9

バッファリング

使用禁止化

内部永続LOB, 22.27

使用可能化

内部永続LOB, 22.25

フラッシュ

内部永続LOB, 22.26

LOBバッファリング・サブシステム(LBS), 12.1.3.2 組込みファンクション, リモート, 16.6

C

C, 「OCI」を参照

C++, 「Pro*C/C++プリコンパイラ」を参照

CACHE/NOCACHE, 11.3.8

キャッシュ

オブジェクト・キャッシュ, 12.5

コールバック, 21.13, 22.10, 22.20 CAST, 17.3 カタログ・ビュー

v$temporary_lobs, 3.2

文字データ

可変幅, 11.2.2

キャラクタ・セットID, 13.3.3

取得

内部永続LOB, 22.4

「CSIDパラメータ」を参照 キャラクタ・セット

マルチバイト, LONGおよびLOBデータ型, 20.4.3

CHUNK, 4.2.1.3, 11.3.11, 12.6.1 チャンク・サイズ, 22.21

LOB記憶域プロパティ, 11.3.1

複数, パフォーマンスの改善, 22.10

CLOBクラス, 「JDBC」を参照 CLOBバッファリング, 「JDBC」を参照 CLOB

列

可変幅文字データ, 11.2.2

データ型, 1.7

可変幅列, 11.2.2

DBMS_LOB, 文字で示されるオフセット・パラメータおよび量パラメータ, 13.3.2 DBMS_LOBを使用した変更, 13.3.5 JDBCを使用したオープンおよびクローズ, 13.9.20 JDBCでの読取りまたはテスト, 13.9.13 変更のためのJDBCの使用, 13.9.12 Cloneメソッド, 「Oracle Objects for OLE (OO4O)」を参照 クローズ

オープン中のすべてのBFILE, 21.24

CLOSEを使用したBFILE, 21.23

FILECLOSEを使用したBFILE, 21.22

クラスタ化表, 18.5.1 COBOL, 「Pro*COBOLプリコンパイラ」を参照 コードポイント・セマンティクス, 16.2.2 COM, 「Oracle Objects for OLE(OO4O)」を参照 比較

2つのLOBの全体または一部

内部永続LOB, 22.13

2つのBFILEの全体または一部, 21.15 COMPRESS, 4.2.1.10, 4.3.1.2 従来型パスによるロード, 3.1.1 変換

PL/SQLの明示的なファンクション, 17.3

変換, CLOB型からキャラクタ・タイプへの暗黙的, 16.2 変換

キャラクタ・セット, 21.7

バイナリ・データからキャラクタ・セットへ, 21.7

暗黙的, CLOBおよびVARCHAR2, 17.2

変換

CLOBへ, 17.3

コピー・セマンティクス, 1.6

内部LOB, 15.3

コピー

LOBの全体または一部を他のLOBヘ

内部永続LOB, 22.16

LOBロケータ

内部永続LOB, 22.17

BFILEのLOBロケータ, 21.19 SecureFiles LOB用のCREATE TABLEパラメータ, 4.2 CREATE TABLE構文および注意, 4.2 CSIDパラメータ

OCILobReadおよびOCILobWriteのOCI_UCS2IDへの設定, 13.4.2

D

永続LOB用のデータ・インタフェース, 20

マルチバイト・キャラクタ・セット, 20.4.3

リモートLOB用のデータ・インタフェース, 20.6 Javaのデータ・インタフェース, 20.5 データ・ポンプ, 3.1.3, 18.4.4 データベース・ファイルシステム・リンク, 4.4 db_securefile init.oraパラメータ, 4.5 DBFS管理, 6.4 DBFSマウント・インタフェース, 6.3 DBFSコンテンツAPI, 7.1 DBFSインストール, 6.1 DBFSリンク, 4.4 DBFSマウント・インタフェース(Linux のみ), 6.2 Oracle Walletを使用したDBFS, 6.4.1 DBMS_LOB

バインド変数を使用したLOBの更新, 12.3.6

NULL LOBに対する制限のあるDBMS_LOB関数, 11.1.1.1 DBMS_LOBパッケージ, 4.8.1

使用可能なLOBプロシージャ/ファンクション, 13.2, 13.2

一時LOB, 13.3.7

BLOB、CLOBおよびNCLOBを変更するファンクション/プロシージャ, 13.3.5

内部LOBおよび外部LOBの読取りまたはテストを行う関数およびプロシージャ, 13.3.6

LOADBLOBFROMFILE, 21.7

LOADCLOBFROMFILE, 21.7

LOADFROMFILE(), 21.7

マルチスレッド・サーバー, 2.7.2

マルチスレッド・サーバー・モード, 21.6.7

オフセット・パラメータおよび量パラメータのガイドライン, 13.3.2

オープンおよびクローズ, JDBCによる代替, 13.9.18

内部LOBおよび外部LOBのオープンおよびクローズ, 13.3.9

起動前のLOBロケータの提供, 13.3.1

BFILE固有の読取り専用ファンクションおよびプロシージャ, 13.3.8

LOBの作業, 使用, 13.3

WRITE()

ガイドライン, 22.21

DBMS_LOB.GET_STORAGE_LIMIT, 12.6.3 DBMS_LOB.GETCHUNKSIZE, 12.6.1 DBMS_LOB.GETLENGTHの戻り値, 16.2.4 DBMS_LOB.GETOPTIONS, 4.8.1.1 DBMS_LOB.ISSECUREFILE, 4.8.1.3 DBMS_LOB.isTemporary, 以前のJDBC, 22.28.1 DBMS_LOB.LOADBLOBFROMFILE, 13.3.2 DBMS_LOB.LOADCLOBFROMFILE, 13.3.2 DBMS_LOB.LOADFROMFILE, 13.3.2 DBMS_LOB.READ, 21.13 DBMS_LOB.SETOPTIONS, 4.8.1.2 DBMS_LOB.WRITE()

16進文字列の渡し, 22.21

DBMS_REDEFINITION, 4.3 DBMS_SPACEパッケージ, 4.8.2 DECRYPT, 4.2.1.12, 4.3.1.4 DEDUPLICATE, 4.2.1.11, 4.3.1.3 ディレクトリ

カタログ・ビュー, 21.6.5

使用のガイドライン, 21.6.6

所有権および権限, 21.6.1

ディレクトリ名の指定, 21.5.1 ディレクトリ・オブジェクト

カタログ・ビュー, 21.6.5

別名およびファイル名の取得, 21.20

使用のガイドライン, 21.6.6

Windowsプラットフォーム上の名前, 21.5.1.1

ネーミング規則, 21.5.1

個々のファイルではなくオブジェクトに対するREAD権限, 21.6.2

使用規則, 3.3.1

シンボリック・リンク, 3.3.1

シンボリック・リンク, および, 3.3.1

ディレクトリ・オブジェクト, 21.3 ダイレクト・パス・ロード, 3.1.1 DISABLE STORAGE IN ROW, 11.3.1 表示

内部永続LOBのLOBデータ, 22.9

LOB列のドメイン索引付け, 11.4.1

E

埋込みSQL文, 「Pro*C/C++プリコンパイラ」および「Pro*COBOLプリコンパイラ」を参照

空のLOB

JDBCを使用して作成, 13.9.26

JDBC, 13.9.26

EMPTY_BLOB()とEMPTY_CLOB,LOB記憶域プロパティ, 11.3.1 EMPTY_CLOB()/BLOB()

内部LOBの初期化, 2.5.2.1

ENABLE STORAGE IN ROW, 11.3.1 ENCRYPT, 4.2.1.12, 4.3.1.4 等値

1つのLOBロケータと別のLOBロケータ

内部永続LOB, 22.18

消去

LOBの一部

内部永続LOB, 22.24

エラー・メッセージ・マニュアル, データベース, Preface 例, LOBアクセス統計, 14.3.1 例

SQL DMLとDBMS_LOBとを共同で使用した結果, 12.3.4

更新済LOBロケータ, 12.3.5

PL/SQL変数を使用したLOBの更新, 12.3.6

存在

BFILEの存在の確認, 21.17

拡張索引, 11.4.3 外部コールアウト, 12.1.5 外部LOB(BFILE)

「BFILE」を参照

外部LOB(BFILE), 「BFILE」を参照

F

ファイルシステム・リンク, 4.4

FILECLOSEALL(), 21.6.6

FILESYSTEM_LIKE_LOGGING, 4.2.1.7

フラッシュ

LOBバッファ, 12.1.4

バッファのフラッシュ, 12.1.1 FOR UPDATE句

LOBロケータ, 12.3.1

FREELIST GROUPS, 4.2.1.8 FREELISTS, 4.2.1.8 FREEPOOLS, 4.2.1.6, 4.2.1.9 ファンクション索引, 11.4.3 LOB列に対するファンクション索引付け, 11.4.3

H

ハードリンク, BFILEに関する規則, 3.3.1

16進文字列

DBMS_LOB.WRITE()への渡し, 22.21

I

LOB列に対する暗黙的な割当てとパラメータの受渡し, 20.3.2

CLOB型からキャラクタ・タイプへの暗黙的な変換, 16.2

LOBの使いやすさの向上, SQL文字関数を使用したLOBへのアクセス, 16.1

索引

ファンクション索引, 11.4.3

LONGからLOBへの移行後の再作成, 18.5.3

LOB列の索引

サポートされないビットマップ索引, 11.4.1

サポートされないBツリー索引, 11.4.1

ドメイン索引作成機能, 11.4.1

制限, 11.4

索引, 制限事項, 18.5.3 索引構成表, LOB列に対する制限, 11.7 SecureFiles LOB用の初期化パラメータ, 4.5 初期化

CREATE TABLEまたはINSERT中, 15.4

EMPTY_CLOB(), EMPTY_BLOB()の使用, 2.5.2.1

LOB列をNULL以外の値に初期化, 11.1.1.2 init.oraパラメータdb_securefile, 4.5 インライン格納, 11.3.1 インライン格納, 最大サイズ, 11.3.1 INSERT文

4,000バイトを超えるバインド, 20.3.7

挿入

初期化したLOBロケータを使用した行

内部永続LOB, 15.5

初期化したBFILEロケータを使用した行, 21.25 DBFSのインストール, 6.1 LOBのためのインタフェース, 「プログラム環境」を参照 LOBの場合のIS NULLの戻り値, 16.5.2 LOBでのIS NULLの使用方法, 16.5.2

J

Java, 「JDBC」を参照

java.sql.Blob, 13.9.1

java.sql.Clob, 13.9.1

JDBC

使用可能なLOBメソッド/プロパティ, 13.2

BFILEクラス

BFILEストリーミングAPI, 13.9.25

BFILEバッファリング, 13.9.16

BLOBおよびCLOBクラス

DBMS_LOBパッケージのコール, 13.9.3

BLOBが一時LOBであるかどうかの確認, 22.28.1

CLOBストリーミングAPI, 13.9.24

空のLOB, 13.9.26

ロケータのカプセル化

BLOBバッファリングのためのメソッドおよびプロパティ, 13.9.11

CLOBバッファリングのためのメソッドおよびプロパティ, 13.9.14

BLOB値の変更, 13.9.9

CLOB値の変更, 13.9.12

オブジェクトoracle.sql.BLOB/CLOBを使用したJavaでの内部LOBの変更, 13.9.1

newStreamLob.java, 13.9.25.1

BFILEのオープンおよびクローズ, 13.9.21

CLOBのオープンおよびクローズ, 13.9.20

LOBのオープンおよびクローズ, 13.9.18

Javaを使用した内部LOBおよび外部LOB(BFILE)の読取り, 13.9.2

BLOB値の読取りまたはテスト, 13.9.10

CLOB値の読取りまたはテスト, 13.9.13

外部LOB(BFILE)の値の読取りまたはテスト, 13.9.15

LOBの参照, 13.9.6

LOBストリーミングAPI, 13.9.23

構文参照, 13.9.7

LOBの切捨て, 13.9.22

LOBを参照するためのOracleResultSetの使用, 13.9.6.1

LOBを参照するためのOraclePreparedStatementのOUTパラメータの使用, 13.9.6.1

空のLOBへの書込み, 13.9.26

JDBC 3.0, 13.9.1 JDBCおよび空のLOB, 13.9.26

K

KEEP_DUPLICATES, 4.2.1.11, 4.3.1.3

L

LBS, 「LOBバッファリング・サブシステム(LBS)」を参照

長さ

内部永続LOB, 22.15

BFILEの取得, 21.18

LOBに対するLENGTHの戻り値, 16.2.4 ロード

BFILEデータをLOBに, 21.7

BFILEのデータをLOBに, 22.5

LOB属性

定義済, 1.8

LOBバッファリング

JDBCでのBLOBバッファリング, 13.9.11

バッファリング対応のロケータ, 12.1.6

例, 12.1.3.2

バッファのフラッシュ, 12.1.4

LBSを介した更新済LOBのフラッシュ, 12.1.5

ガイドライン, 12.1.2

OCIの例, 12.1.8

OCI関数, 13.4.14

OCILobFlushBuffer(), 12.1.4

Oracle Objects for OLE (OO4O)

内部LOBのためのメソッド, 13.8.8

バッファの物理構造, 12.1.3.1 Pro*C/C++プリコンパイラ文, 13.6.8 Pro*COBOLプリコンパイラ文, 13.7.8 使用上の注意, 12.1.3 LOBバッファリング・サブシステム(LBS)

メリット, 12.1.1

バッファリング対応のロケータ, 12.1.5

OCIを使用したバッファリングの例, 12.1.8

例, 12.1.3.2

フラッシュ

更新されたLOB, 12.1.5

バッファのフラッシュ, 12.1.4 ガイドライン, 12.1 再選択を避けるためのロケータ状態の保存, 12.1.7 使用方法, 12.1.3 LOBバッファリング・サブシステム(LBS) LOB列

内部LOBを値に初期化, 11.1.3

ロケータを含めるための初期化, 2.5.2

NULLまたは空として初期化, 11.1.1

LOBロケータ

コピー・セマンティクス, 1.6

外部LOB(BFILE), 1.6

内部LOB, 1.6

OCIのアウトバインド変数, 13.4.7

参照セマンティクス, 1.6

LOBロケータ, 常に行に格納, 11.3.1 LOBプリフェッチ

JDBC, 13.9.4

LOB読取り, 14.3 LOBの制限, 2.7 LOB記憶域

可変幅文字データの形式, 11.2.2

インラインおよびアウトライン記憶域プロパティ, 11.3.1

LOB書込み, 14.3 未調整LOB書込み, 14.3 LOB

抽象データ型, メンバー, 1.8

属性と抽象データ型, 1.8

属性とオブジェクト・キャッシュ, 12.5

バッファリング

注意事項, 12.1.1

ページング処理ができるページ, 12.1.4

バッファリング・サブシステム, 12.1 バッファリングの使用方法, 12.1.3 LONGデータ型との比較, 1.3 外部(BFILE), 1.4.2 フラッシュ, 12.1.1 パーティション表内, 11.5 オブジェクト・キャッシュ内, 12.5 インタフェース, 「プログラム環境」を参照 interMEDIA, 1.9.3 内部

オブジェクト・キャッシュ内でのオブジェクトの作成, 12.5

内部LOB

CACHE/NOCACHE, 11.3.8

CHUNK, 11.3.11

ENABLE|DISABLE STORAGE IN ROW, 11.3.12

初期化, 21.13

概要, 1.4.1

ロケータ, 2.5

更新前のロック, 22.2, 22.16, 22.20, 22.21, 22.23, 22.24

LOGGING/NOLOGGING, 11.3.9

Oracle Objects For OLE (OO4O), メソッドの変更, 13.8.5

PCTVERSION, 11.3.5, 11.3.5

空に設定, 11.1.1.2

表領域およびLOB索引, 11.3.4

表領域および記憶特性, 11.3.2

トランザクション, 1.4.1

ロケータ, 2.5, 12.3.1 最大許容サイズ, 12.6 オブジェクト・キャッシュ, 12.5 ピース単位操作, 12.3.3 読取り一貫性のあるロケータ, 12.3.1 使用する理由, 1.2 ロケータを含めるための設定, 2.5.2 NULLへの設定, 11.1.1.1 表

索引作成, 11.5.2

パーティションの移動, 11.5.3

パーティションの分割, 11.5.4

非構造化データ, 1.2.2 更新済LOBロケータ, 12.3.3 可変幅文字データ, 11.2.3 LOB, リモート用データ・インタフェース, 20.6 LOB, Javaのデータ・インタフェース, 20.5 ロケータ, 2.5

BFILE, 21.6.8

ガイドライン, 21.6.8.3

2つの行による同じファイルの参照, 21.6.8.1

バッファリング対応, 12.1.6 外部LOB(BFILE), 2.5 LOB, 複数のトランザクションにまたがることはできない, 12.4.4 複数, 12.3.1 OCI関数, 13.4.13, 13.5.12 Pro*COBOLプリコンパイラ文, 13.7.7 Pro*COBOLプリコンパイラでの割当, 13.7.1 読取り一貫性, 更新, 12.3.1 読取り一貫性, 12.1.4, 12.1.7, 12.3.1, 12.3.1, 12.3.6, 12.4.4 LOBに対する読取りおよび書込み, 12.4.1 再選択を避けるための状態の保存, 12.1.7 LOBロケータが初期化されているかどうかの確認

内部永続LOB, 22.19

トランザクション内での選択, 12.4.3 現行トランザクションを持たないロケータの選択, 12.4.2 含めるための列の設定, 2.5.2 トランザクションの境界, 12.4 更新済, 12.1.4, 12.3.3, 12.3.6 更新, 12.4.4 LOGGING, 4.2.1.7

LONGからLOBへの移行, 18.2.2

LOGGING/NOLOGGING, 11.3.9 LONGデータ型とLOBデータ型, 1.3 LONGからLOBへの移行

ALTER TABLE, 18.4.1

メリットおよび概念, 18.1

クラスタ化表, 18.5.1

LOGGING, 18.2.2

NULL, 18.5.4

索引の再作成, 18.5.3

レプリケーション, 18.1

トリガー, 18.5.2

M

MAXSIZE, 4.2.1.5

移行

オンライン再定義を使用した表, 4.7.3

LONGからLOBへ, 「LONGからLOBへ」を参照, 18.1

ALTER TABLEを使用してLONGからLOBへ, 18.4.1

LONGからLOBヘ, 制約の保持, 18.4.1.1

LONGからLOBへ, 索引付け, 18.5.3

SecureFiles LOBへの移行, 4.7 LONGからLOBへのパラレルでの移行, 18.4.3 マルチバイト・キャラクタ・セット, LOB用データ・インタフェースで使用, 20.4.3 マルチスレッド・サーバー

BFILE, 2.7.2, 21.6.7, 21.6.7

N

グローバリゼーション・サポート

NCLOB, 1.7

NCLOB

データ型, 1.7

DBMS_LOB, 文字で示されるオフセット・パラメータおよび量パラメータ, 13.3.2

DBMS_LOBを使用した変更, 13.3.5

NewStreamLob.java, 13.9.25.1 NLS_CHARSET_ID, 13.3.3 NOCOMPRESS, 4.2.1.10, 4.3.1.2 NOCOPY, 参照によって一時LOBパラメータを渡すために使用, 14.1.4 NOLOGGING, 4.2.1.7 LOBでのIS NULLの使用方法, 16.5.2 NULLのLOB値, LOB記憶域, 11.3.1 NULLのLOB値, LOB記憶域プロパティ, 11.3.1 NULL LOB, OCI関数およびDBMS_LOBファンクションのコールに対する制限, 11.1.1.1

O

オブジェクト・キャッシュ, 12.5

オブジェクトの作成, 12.5

LOB, 12.5

OCCI

他のインタフェースとの比較, 13.2

LOB機能, 13.2

OCCIのBfileクラス, 13.5.11 OCCIのBlobクラス

読取り, 13.5.3

書込み, 13.5.3

OCCIのClobクラス, 13.5.1

読取り, 13.5.3

書込み, 13.5.3

OCI

使用可能なLOB関数, 13.2

キャラクタ・セットの規則, 固定幅と可変幅, 13.4.3

BFILE固有の関数, 13.4.12, 13.5.11

一時LOBのための関数, 13.4.11, 13.5.11

内部LOBの値を変更する関数, 13.4.9, 13.5.9

内部LOBおよび外部LOBをオープンおよびクローズする関数, 13.4.15, 13.5.13

内部LOBおよび外部LOBの値の読取りまたはテストを行う関数, 13.4.10, 13.5.10

LOBバッファリングの例, 12.1.8

LOBロケータ関数, 13.4.13, 13.5.12

LOBバッファリング関数, 13.4.14

NCLOBパラメータ, 13.4.3.2, 13.5.4.1

OCILobFileGetLength

CLOBおよびNCLOBの入力および出力の長さ, 13.4.3

OCILobRead2()

可変幅CLOBおよびNCLOBの入力量および出力量, 13.4.3

OCILobWrite2()

可変幅CLOBおよびNCLOBの入力量および出力量, 13.4.3, 13.5.3

オフセット・パラメータおよび量パラメータの規則

固定幅キャラクタ・セット, 13.5.2

OCILobRead2(), OCILobWrite2()のOCI_UCS2IDへの設定, 13.4.2 LOB作業のための使用, 13.4 NULL LOBに対する制限のあるOCI関数, 11.1.1.1 OCILobArrayRead(), 22.11 OCILobArrayWrite(), 22.22 OCILobAssign(), 12.1.2 OCILobFileSetName(), 21.5, 21.6.8.3 OCILobFlushBuffer(), 12.1.4 OCILobGetChunkSize(), 12.6.1, 12.6.4 OCILobGetStorageLimit(), 12.6.4 OCILobLoadFromFile(), 21.7, 21.7 代入演算子=でのOCILobLocator, 13.4.6 OCILobLocator, アウトバインド変数, 13.4.7 OCILobRead2(), 21.13, 22.9, 22.10

BFILE, 21.13

OCILobWriteAppend2(), 22.20 OCIObjectFlush(), 21.6.8.3 OCIObjectNew(), 21.6.8.3 OCISetAttr(), 21.6.8.3 ODP.NET, 13.2 オフセット・パラメータ, DBMS_LOB操作, 13.3.2 OLE DB, 13.10 OO4O, 「Oracle Objects for OLE (OO4O)」を参照 オープン

FILEISOPEN()を使用したオープン中のBFILEの確認, 21.11

ISOPENを使用したBFILEがオープンしているかどうかの確認, 21.10

オープン, LOBがオープンしているかどうかを確認, 22.8 OpenCloseLob.javaの例, 13.9.21.4 オープン

BFILEにFILEOPENを使用, 21.9

BFILEにOPENを使用, 21.8

LOBのオープンおよびクローズ

JDBCを使用, 13.9.18

ORA-17098

空のLOBおよびJDBC, 13.9.26

OraBfile, 「Oracle Objects for OLE (OO4O)」を参照 OraBlob, 「Oracle Objects for OLE (OO4O)」を参照 Oracle Call Interface, 「OCI」を参照 Oracle Objects for OLE (OO4O)

使用可能なLOBメソッド/プロパティ, 13.2

内部LOBバッファリング, 13.8.8

BLOB、CLOB、NCLOBおよびBFILEに格納されたデータにアクセスするメソッドおよびプロパティ, 13.8.4

内部LOBの変更, 13.8.5

外部LOB(BFILE)のオープンおよびクローズ, 13.8.7

OraBfileの例

OraBlobの例

OraBlob、OraClobおよびOraBfileによるロケータのカプセル化, 13.8.2

外部LOB(BFILE)での操作のためのプロパティ, 13.8.11

LOB操作のためのプロパティ, 13.8.9

内部LOBおよび外部LOBの値の読取りまたはテスト, 13.8.6

外部LOB(BFILE)のための読取り専用メソッド, 13.8.10

構文の参照, 13.8.1

ダイナセットからロケータの独立を維持するためのCloneメソッドの使用, 13.8.2.2

OraclePreparedStatement, 「JDBC」を参照 OracleResultSet, 「JDBC」を参照 oracle.sql.BFILE

BFILEバッファリング, 13.9.16

BFILEの読取りまたはテストを行うJDBCメソッド, 13.9.15

oracle.sql.BLOB

BLOB値の変更, 13.9.9

BLOB値の読取りまたはテスト, 13.9.10

「JDBC」を参照

oracle.sql.BLOB

BLOBバッファリング

oracle.sql.CLOB

CLOBバッファリング

CLOB値の読取りまたはテストを行うJDBCメソッド, 13.9.13

CLOB値の変更, 13.9.12

oracle.sql.CLOB

「JDBC」を参照

OraOLEDB, 13.10 アウトライン記憶域, 11.3.1

P

パラレルDMLサポート, 20.3.11

LONGからLOBへのパラレルでの移行, 18.4.3

パーティション化された索引構成表

LOB列に対する制限, 11.7

パターン

instrを使用したBFILE内のパターンの有無の確認, 21.16

instrを使用したLOB内のパターンの有無の確認

内部永続LOB, 22.14

PCTINCREASEパラメータ, LOBの推奨値, 12.7.1 PCTVERSION, 4.2.1.9, 11.3.5, 11.3.5 パフォーマンス

ガイドライン

大きいデータ・チャンクの読取り/書込み, 14.1.3

大きいデータ・チャンクの読取り/書込み, 一時LOB, 14.1.4

PL/SQL, 13.1

LOB, セマンティクスの変更, 17.1

ロケータとデータのリンケージの変更, 17.3.1

CLOB変数, 17.3.1

PL/SQLでのCLOB変数の定義, 17.3.1

CLOBとVARCHAR2との比較, 17.4

VARCHAR2と同様に渡されるCLOB, 17.3.1

VARCHARでのCLOB変数の定義, 17.2

一時LOBの自動的および手動による解放, 17.3.1

PL/SQLファンクション, リモート, 17.5 SecureFiles LOB用のPL/SQLパッケージ, 4.8 PMスキーマ, 2.5.1 ポーリング, 21.13, 22.10, 22.20 データのプリフェッチ, 13.4.1 print_mediaの定義, 15.1 print_media表定義, 2.5.1 Pro*C/C++プリコンパイラ

使用可能なLOB関数, 13.2, 13.2

LOBバッファリング, 13.6.8

ロケータ, 13.6.7

内部LOBの値の変更, 13.6.3

内部LOBおよび外部LOB(BFILE)のオープンおよびクローズ, 13.6.9

割り当てられた入力ロケータ・ポインタの提供, 13.6.1

内部LOBおよび外部LOBの値の読取りまたはテスト, 13.6.4

BFILEのための文, 13.6.6

一時LOBのための文, 13.6.5

Pro*COBOLプリコンパイラ

使用可能なLOB関数, 13.2

LOBバッファリング, 13.7.8

ロケータ, 13.7.7

内部LOBの値の変更, 13.7.3

割り当てられた入力ロケータの提供, 13.7.1

内部LOBおよび外部LOBの読取りまたはテスト, 13.7.4

BFILEのための文, 13.7.6

一時LOB, 13.7.5

プログラム環境

使用可能なファンクション, 13.2

比較, 13.2

LOBのプログラム環境, 13.1

R

読取り一貫性

LOB, 12.3.1

読取り一貫性のあるロケータ, 12.1.4, 12.1.7, 12.3, 12.3.1, 12.3.6, 12.4.4 読取り

LOBからのデータ

内部永続LOB, 22.10

大きいデータ・チャンク, パフォーマンスのガイドライン, 14.1.3 大きいデータ・チャンク, 一時LOB, 14.1.4 substrを使用したBFILEデータの一部, 21.14 substrを使用したLOBの一部

内部永続LOB, 22.12

少量のデータ, バッファリングの使用可能化, 22.25 参照セマンティクス, 15.3, 15.3

1つのレコード内に複数のBFILE列を持つことが可能, 21.4

リモート組込みファンクション, 16.6 リモートPL/SQLファンクション, 17.5 レプリケーション, 18.1 制限

4,000バイトを超えるバインド, 20.3.10

OCI関数またはDBMS_LOBファンクションはNULL LOBにはコールできない, 11.1.1.1

クラスタ化表, 18.5.1

索引, 18.5.3

索引構成表およびLOB, 11.7

LOB, 2.7

レプリケーション, 18.1

トリガー, 18.5.2

RETENTION, 4.2.1.4, 4.3.1.1 MSSM表領域で無視されるRETENTION, 11.3.6 LOBアクセス統計の取得, 14.3.1 RETURNING句, LOBを初期化するためINSERTとともに使用, 11.1.1.2 サーバーへのラウンドトリップ, 回避, 12.1.1, 12.1.7 ディレクトリ・オブジェクトおよびBFILEの使用規則, 3.3.1

S

例に使用されるサンプル・スキーマ, 15.1

SECUREFILE

ALTER TABLEパラメータ, 4.3

LOB記憶域パラメータ, 4.2.1.2

SecureFiles LOB

CREATE TABLEパラメータ, 4.2

PL/SQL, 4.8

SecureFiles LOB

初期化パラメータ, 4.5

セキュリティ

BFILE, 21.5.1, 21.6

SQL DDLを使用したBFILE, 21.6.3

SQL DMLを使用したBFILE, 21.6.4

SELECT文

読取り一貫性, 12.3.1

セマンティクス

内部LOBに対してはコピー・ベース, 15.3

BFILEに対しては参照ベース, 21.4

SESSION_MAX_OPEN_FILESパラメータ, 3.3.2, 3.3.2 設定

内部LOBを空に, 11.1.1.2

LOBをNULLに, 11.1.1.1

NLS_LANG変数に対するオーバーライド

ALTER TABLEのSHRINKパラメータ, 4.3 CREATE TABLEのSHRINKパラメータ, 4.2 SQL

文字関数, 向上, 16.1

LOBが使用できない機能, 16.4

SQL DDL

BFILEセキュリティ, 21.6.3

SQL DML

BFILEセキュリティ, 21.6.4

LOBに対するSQLファンクション

戻り型, 16.2.3

戻り値, 16.2.3

戻される一時LOB, 16.2.3

SQLセマンティクスとLOB, 16.4 LOBでの使用がサポートされるSQLセマンティクス, 16.2 SQL*Loader

従来型パスによるロード, 3.1.1

ダイレクト・パス・ロード, 3.1.1

統計, アクセス, 14.3 ストア, 7.2 ストリーミング, 22.9

バッファリング使用禁止化, 22.25

書込み, 22.21

ストリーミングAPI

NewStreamLob.java, 13.9.25.1

JDBCおよびBFILEの使用, 13.9.25

JDBCおよびCLOBの使用, 13.9.24

JDBCおよびLOBの使用, 13.9.23

シンボリック・リンク, ディレクトリ・オブジェクトおよびBFILEでの規則, 3.3.1 システム所有のオブジェクト, 「ディレクトリ・オブジェクト」を参照

T

一時BLOB

JDBCを使用した一時LOBであるかどうかの確認, 22.28.1

一時LOB

LOBが一時LOBであるかどうかの確認, 22.28

DBMS_LOBの使用可能なファンクションおよびプロシージャ, 13.3.7

OCI関数, 13.4.11, 13.5.11

Pro*C/C++プリコンパイラ埋込みSQL文, 13.6.5

Pro*COBOLプリコンパイラ文, 13.7.5

SQLファンクションから戻される, 16.2.3

TO_BLOB(), TO_CHAR(),TO_NCHAR(), 17.3 TO_CHAR(), 17.3 TO_CLOB()

VARCHAR2、NVARCHAR2、NCLOBのCLOBへの変換, 17.3

TO_NCLOB(), 17.3 トランザクションの境界

LOBロケータ, 12.4

トランザクションID, 12.4.1 トランザクション

関連しない外部LOB, 1.5

ロケータのID, 12.4

データベース・トランザクションに関連する内部LOB, 1.4.1

またがることができないLOBロケータ, 12.4.4

シリアライズ可能でない場合のロケータ, 12.4.1

シリアライズ可能な場合のロケータ, 12.4.1

移行, 12.1.5

透過的読取り, 4.4.6 トリガー

LONGからLOBへの移行, 18.5.2

切捨て

LOBデータ

内部永続LOB, 22.23

JDBCを使用したLOBの切捨て, 13.9.22

U

UB8MAXVALはBFILEの最大サイズ, 12.6

UCS2 Unicodeキャラクタ・セット

可変幅文字データ, 11.2.2

Unicode

VARCHAR2およびCLOBのサポート, 16.2.1

非構造化データ, 1.2.2 UPDATE文

4,000バイトを超えるバインド, 20.3.7

更新済ロケータ, 12.1.4, 12.3.3, 12.3.6 更新

同一LOBへの異なるロケータの使用の回避, 12.3.5

1つのロケータを使用したLOB値, 12.3.5

LOB値,読取り一貫性のあるロケータ, 12.3.1

PL/SQLバインド変数を使用したLOB, 12.3.6

SQLおよびDBMS_LOBを使用したLOB, 12.3.4

ロケータ, 12.4.4

更新前にロック, 22.16

事前にロック, 22.2, 22.23, 22.24

V

V$NLS_VALID_VALUES, 13.3.3

VARCHAR2

VARCHAR2として処理されたCLOBデータへのアクセス, 17.2

RAWと同様, CLOBおよびBLOBへ適用, 16.5

CLOB変数の定義, 17.2

VARCHAR2, LOBでのSQLファンクションおよび演算子の使用, 16.2 VARRAY

LOBの制限, 2.7.1

可変幅文字データ, 11.2.2 ディレクトリ・オブジェクトのビュー, 21.6.5

W

Wallet, Oracle, 6.4.1

LOBでのWHERE句の使用方法, 16.5.3

書込み

データをLOBに

内部永続LOB, 22.21

大きいデータ・チャンク, パフォーマンスのガイドライン, 14.1.3 大きいデータ・チャンク, 一時LOB, 14.1.4 1つずつまたはピース単位, 22.20 少量のデータ, バッファリングの使用可能化, 22.25

Z

SecureFiles LOBのゼロコピー入力/出力, 13.9.5

オラクル社の法律上の注意点について

コピーライトについて

Copyright © 1994-2013, Oracle and/or its affiliates.All rights reserved.

商標と登録商標について

OracleおよびJavaはOracle Corporationおよびその関連企業の登録商標です。その他の名称は、それぞれの所有者の商標または登録商標です。

Intel、Intel Xeonは、Intel Corporationの商標または登録商標です。すべてのSPARCの商標はライセンスをもとに使用し、SPARC International, Inc.の商標または登録商標です。AMD、Opteron、AMDロゴ、AMD Opteronロゴは、Advanced Micro Devices, Inc.の商標または登録商標です。UNIXは、The Open Groupの登録商標です。

ライセンス制約の保証と結果的に生じる損害の免責

このソフトウェアおよび関連ドキュメントの使用と開示は、ライセンス契約の制約条件に従うものとし、知的財産に関する法律により保護されています。ライセンス契約で明示的に許諾されている場合もしくは法律によって認められている場合を除き、形式、手段に関係なく、いかなる部分も使用、複写、複製、翻訳、放送、修正、ライセンス供与、送信、配布、発表、実行、公開または表示することはできません。このソフトウェアのリバース・エンジニアリング、逆アセンブル、逆コンパイルは互換性のために法律によって規定されている場合を除き、禁止されています。

保証免責

ここに記載された情報は予告なしに変更される場合があります。また、誤りが無いことの保証はいたしかねます。誤りを見つけた場合は、オラクル社までご連絡ください。

制限付権利

このソフトウェアまたは関連ドキュメントを、米国政府機関もしくは米国政府機関に代わってこのソフトウェアまたは関連ドキュメントをライセンスされた者に提供する場合は、次の通知が適用されます。

U.S. GOVERNMENT END USERS: Oracle programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, delivered to U.S. Government end users are "commercial computer software" pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations.As such, use, duplication, disclosure, modification, and adaptation of the programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, shall be subject to license terms and license restrictions applicable to the programs.No other rights are granted to the U.S. Government.

危険な用途への使用について

このソフトウェアもしくはハードウェアは様々な情報管理アプリケーションでの一般的な使用のために開発されたものです。このソフトウェアもしくはハードウェアは、危険が伴うアプリケーション（人的傷害を発生させる可能性があるアプリケーションを含む）への用途を目的として開発されていません。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用する際、安全に使用するために、適切な安全装置、バックアップ、冗長性（redundancy）、その他の対策を講じることは使用者の責任となります。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用したことに起因して損害が発生しても、オラクル社およびその関連会社は一切の責任を負いかねます。

第三者のコンテンツ、製品、サービスに対する免責事項

このソフトウェアまたはハードウェア、そしてドキュメントは、第三者のコンテンツ、製品、サービスへのアクセス、あるいはそれらに関する情報を提供することがあります。オラクル社およびその関連会社は、第三者のコンテンツ、製品、サービスに関して一切の責任を負わず、いかなる保証もいたしません。オラクル社およびその関連会社は、第三者のコンテンツ、製品、サービスへのアクセスまたは使用によって損失、費用、あるいは損害が発生しても一切の責任を負いかねます。

ドラフトのアルファ版およびベータ版ドキュメントについて

このドキュメントが試作版の場合:

このドキュメントは試作版であり、デモおよび暫定使用のみを目的としたものです。このソフトウェアを使用するハードウェアに限定するものではありません。オラクル社およびその関連会社は、このドキュメントに関して一切の責任を負わず、いかなる保証もいたしません。また、このドキュメントを使用したことによって損失、費用、あるいは損害が発生しても、一切の責任を負いかねます。