この項では、Pro*C/C++アプリケーションでのLOBの使用に関する、プログラミングの重要な問題をいくつか説明します。
Pro*C/C++のLOBにアクセスするには、次の3種類の方法があります。
PL/SQLブロックのDBMS_LOBパッケージ。
OCI(Oracle Call Interface)ファンクション・コール。
埋込みSQL文。
SQL文は、PL/SQLインタフェースと同等の機能を提供するように設計されており、OCIインタフェースほど複雑ではありません。
次の表では、Pro*C/C++内でのOCIファンクション・コール、PL/SQLおよびPro*C/C++の埋込みSQL文によるLOBアクセスを比較しています。空欄は機能がないことを示します。
表16-1 LOBアクセス方法
OCI (1) | PL/SQL(2) | Pro*C/C++埋込みSQL |
---|---|---|
- |
COMPARE() |
- |
- |
INSTR() |
- |
- |
SUBSTR() |
- |
OCILobAppend |
APPEND() |
APPEND |
OCILobAssign |
:= |
ASSIGN |
OCILobCharSetForm |
- |
- |
OCICharSetId |
- |
- |
OCILobClose |
CLOSE() |
CLOSE |
OCILobCopy |
COPY() |
COPY |
OCILobCreateTemporary |
CREATETEMPORARY() |
CREATE TEMPORARY |
OCILobDisableBuffering |
- |
DISABLE BUFFERING |
OCILobEnableBuffering |
- |
ENABLE BUFFERING |
OCILobErase |
ERASE() |
ERASE |
OCILobGetChunkSize |
GETCHUNKSIZE() |
DESCRIBE |
OCILobIsOpen |
ISOPEN() |
DESCRIBE |
OCILobFileClose |
FILECLOSE() |
CLOSE |
OCILobFileCloseAll |
FILECLOSEALL() |
FILE CLOSE ALL |
OCILobFileExists |
FILEEXISTS() |
DESCRIBE |
OCILobFileGetName |
FILEGETNAME() |
DESCRIBE |
OCILobFileIsOpen |
FILEISOPEN() |
DESCRIBE |
OCILobFileOpen |
FILEOPEN() |
OPEN |
OCILobFileSetName |
BFILENAME() |
FILE SET脚注3 |
OCILobFlushBuffer |
- |
FLUSH BUFFER |
OCILobFreeTemporary |
FREETEMPORARY() |
FREE TEMPORARY |
OCILobGetLength |
GETLENGTH() |
DESCRIBE |
OCILobIsEqual |
= |
- |
OCILobIsTemporary |
ISTEMPORARY() |
DESCRIBE |
OCILobLoadFromFile |
LOADFROMFILE() |
LOAD FROM FILE |
OCILobLocatorIsInit |
- |
- |
OCILobOpen |
OPEN() |
OPEN |
OCILobRead |
READ() |
READ |
OCILobTrim |
TRIM() |
TRIM |
OCILobWrite |
WRITE() |
WRITE |
OCILobWriteAppend |
WRITEAPPEND() |
WRITE |
脚注1 C/C++ユーザーのみ。これらの関数のプロトタイプは、ociap.hにあります。
脚注2 dbmslob.sqlを参照してください。BFILENAMEを除くルーチンの前には、すべて'DBMS_LOB'を付ける必要があります。
脚注3
BFILENAME()組込みSQLファンクションを使用することもできます。
注意:
新しい文を使用する前に、LOBに対して修正または変更する行を明示的にロックする必要があります。LOB値を修正する操作には、APPEND、COPY、ERASE、LOAD FROM FILE、TRIMおよびWRITEがあります。
LOBロケータをPro*C/C++アプリケーションで使用する場合は、oci.hヘッダー・ファイルをインクルードし、BLOBに対してOCIBlobLocator型のポインタ、CLOBおよびNCLOBに対してOCIClobLocator、またはBFILEに対してOCIBFileLocatorを宣言します。
NCLOBの場合は、次のいずれかの操作を行う必要があります。
C/C++宣言で'CHARACTER SET IS NCHAR_CS'句を使用します。
コマンドラインまたは構成ファイルで、NLS_CHARプリコンパイラ・オプションをあらかじめ指定し、NLS_NCHAR環境変数を設定する必要があります。
関連項目:
設定方法は次のとおりです。
/* In your precompiler program */ #include <oci.h> ... OCIClobLocator CHARACTER SET IS NCHAR_CS *a_nclob ;
または、Pro*C/C++をコールするときに、プリコンパイラ・オプションNLS_CHARを
NLS_CHAR=(a_nclob)
と設定している場合は、コードから、CHARACTER SET句を削除できます。
#include <oci.h> ... OCIClobLocator *a_nclob ;
他に次のように簡潔に宣言します。
/* In your precompiler program */ #include <oci.h> ... OCIBlobLocator *a_blob ; OCIClobLocator *a_clob ; OCIBFileLocator *a_bfile ;
LOBの初期化方法は、LOBの種類によって異なります。この項では、種類ごとに初期化方法を説明します。
BLOBを初期化して空にするには、EMPTY_BLOB()
関数を使用するか、ALLOCATE SQL文を使用します。CLOBおよびNCLOBの場合は、EMPTY_CLOB()
関数を使用します。EMPTY_BLOB()およびEMPTY_CLOB()の詳細は、『Oracle Database SQL言語リファレンス』
を参照してください。
これらの関数は、INSERT文のVALUES句内またはUPDATE文のSET句のソースでのみ使用できます。
次に例を示します。
EXEC SQL INSERT INTO lob_table (a_blob, a_clob) VALUES (EMPTY_BLOB(), EMPTY_CLOB()) ;
ALLOCATE文を実行すると、LOBロケータが割り当てられ、初期化後に空になります。つまり、次のコードを実行しても、前の例と同じ結果が得られます。
#include <oci.h> ... OCIBlobLocator *blob ; OCIClobLocator *clob ; EXEC SQL ALLOCATE :blob ; EXEC SQL ALLOCATE :clob ; EXEC SQL INSERT INTO lob_table (a_blob, a_clob) VALUES (:blob, :clob) ;
BFILEおよびFILENAMEのDIRECTORY別名を初期化するには、LOB FILE SET文を次のように使用します。
#include <oci.h> ... char *alias = "lob_dir" ; char *filename = "image.gif" ; OCIBFileLocator *bfile ; EXEC SQL ALLOCATE :bfile ; EXEC SQL LOB FILE SET :bfile DIRECTORY = :alias, FILENAME = :filename ; EXEC SQL INSERT INTO file_table (a_bfile) VALUES (:bfile) ;
DIRECTORYオブジェクトのネーミング規則およびDIRECTORYオブジェクト権限の詳細は、『Oracle Databaseアドバンスト・アプリケーション開発者ガイド』を参照してください。
また、INSERTまたはUPDATE文のBFILENAME('ディレクトリ', 'ファイル名')機能を使用して、BFILE列または特定行の属性を初期化し、実際の物理ディレクトリおよびファイル名を取得できます。
EXEC SQL INSERT INTO file_table (a_bfile) VALUES (BFILENAME('lob_dir', 'image.gif')) RETURNING a_bfile INTO :bfile ;
注意:
BFILENAME()では、ディレクトリまたはファイル名の権限、および物理ディレクトリの有無は確認されません。BFILEロケータを使用してファイルにアクセスしたときに、これらが確認され、ファイルにアクセスできない場合にはエラーが戻されます。
埋込みSQLのLOB CREATE TEMPORARY文を使用して最初に一時LOBを作成したときに、一時LOBは初期化され空になります。EMPTY_BLOB()およびEMPTY_CLOB()関数は、一時LOBでは使用できません。