TimesTenおよびTimesTen Cacheでは、CおよびC++アプリケーションのOracle Pro*C/C++プリコンパイラがサポートされています。プリコンパイラは、TimesTenデータベースにアクセスする埋込みSQLおよびPL/SQLアプリケーションで使用できます。
この章では、Pro*C/C++に関する概要およびTimesTen固有の情報について説明し、特にTimesTenでのPro*C/C++の使用とOracle DatabaseでのPro*C/C++の使用の違いについて強調します。Pro*C/C++の詳細は、Oracle Databaseライブラリの『Pro*C/C++プログラマーズ・ガイド』を参照してください。
第2章「ODBCでのTimesTenデータベースの使用」も参照してください。TimesTenの機能について興味深いと思われる情報が記載されています。
この章の内容は次のとおりです。
Oracle Pro*C/C++プリコンパイラを使用すると、SQL文またはPL/SQLブロックを直接CコードまたはC++コードに埋め込むことができます。さらに、CまたはC/C++プログラム・ホスト変数を埋込みSQLまたはPL/SQLで使用できます。
プリコンパイル・ステップを使用して、Pro*C/C++ソース・ファイルをCまたはC++のソース・ファイルに変換します。プリコンパイラはPro*C/C++ファイルを入力として受け入れ、埋込みSQL文を標準Oracleランタイム・ライブラリ・コールに変換し、後でコンパイルおよびリンクが可能な変更されたソース・コード・ファイルを生成します。Pro*C/C++のコードは、Oracle Instant Clientの一部としてTimesTenディストリビューションに付属する、Oracle DatabaseプリコンパイラSQLLIBライブラリとリンクされます。
TimesTenでのOracle Pro*C/C++プリコンパイラのサポートは、TimesTen OCIに依存します。TimesTen OCIは、Oracleクライアント・ライブラリおよびTimesTen ODBCライブラリに依存します。TimesTenアーキテクチャにおけるOCIおよびPro*C/C++の位置付けを確認するには、図3-1を参照してください。
この章では、TimesTenでのOracle Pro*C/C++プリコンパイラの使用に固有の情報を示します。TimesTenでのOracle Pro*C/C++プリコンパイラの構文および使用方法は、基本的にOracle Databaseの場合と同じです。
この項の以降の内容は次のとおりです。
TimesTenでのOracle Pro*C/C++プリコンパイラのサポートは、TimesTen OCIサポートに依存しているため、TimesTen OCIの制限がPro*C/C++アプリケーションに適用されます。
また、TimesTenでは、TimesTenに存在しない機能に関連するOCIコールはサポートされていません。
TimesTen OCIサポートの詳細は、第3章「TimesTenでのOCIのサポート」を参照してください。ここの情報のほとんどは、Pro*C/C++アプリケーションにも該当することがあります。
TimesTen Pro*C/C++プリコンパイラでは、TimesTenおよびTimesTen Cacheでサポートされていない機能の埋込みSQLはサポートされていません。「TimesTenの制限および相違点」を参照してください。
TimesTenではSQLLIB機能について、次のようなサポートが提供されています。
SQLErrorGetText(sqlglmt)がサポートされています。
SQLRowidGet()は、SELECT FOR UPDATE文に続く場合にのみサポートされます。
また、TimesTenでのOracle Pro*C/C++プリコンパイラのサポートには、次の制限があります。
REGISTER CONNECTはサポートされていません。
ストアドJavaサブプログラムはサポートされていません。
TimesTenでのOracle Pro*C/C++プリコンパイラのサポートには、プリコンパイル時のセマンティック・チェックは含まれません。セマンティック・チェックを指定するSQLCHECKプリコンパイラ・オプション設定は可能ですが、実行されません。
ただし、SEMANTICSを設定した場合、プリコンパイルのセマンティック・チェックは実行されませんが、データベース接続が行われることを認識することが重要です。このため、SEMANTICSを設定する場合は、プリコンパイル時に次の要件があります。
データベースが稼働している必要があります。
コマンドラインまたはpcscfg.cfg構成ファイルのいずれかでUSERIDプリコンパイラ・オプションを設定する必要があります。既存のTimesTenユーザーのユーザー名とパスワード、およびデータベースを指すTNS名を入力する必要があります。次の例では、パスワードの入力が求められます。
USERID=user1@my_tnsname
あるいは、USERID=user1/password@my_tnsnameと入力することもできます。ただし、セキュリティ上の理由から、コマンドラインまたは構成ファイルでパスワードを指定することはお薦めしません。
TNS名の使用方法および構文については、「Pro*C/C++からTimesTenデータベースへの接続」を参照してください。
PL/SQLを使用するPro*C/C++プログラムの詳細は、次の項の「埋込みPL/SQLの制限」を参照してください。
TimesTenでは、Pro*C/C++アプリケーションにPL/SQLブロックが含まれている場合、Pro*C/C++はSQLCHECK設定がSEMANTICSであるかのように動作します。この場合、プリコンパイルのセマンティック・チェックは実行されませんが、データベース接続が行われることを認識することが重要です。このため、PL/SQLをPro*C/C++アプリケーションで使用する場合は、プリコンパイル時に次の要件があります。
データベースが稼働している必要があります。
既存のTimesTenユーザーを指定して、USERIDプリコンパイラ・オプションを設定する必要があります。このオプションの設定の詳細は、前の項の「セマンティック・チェックの制限」を参照してください。
トランザクションに関して、TimesTenでのOracle Pro*C/C++プリコンパイラのサポートには次のものは含まれません。
SAVEPOINT SQL文
SET TRANSACTION SQL文
トランザクションのコミットおよびロールバックは実行できますが、SET TRANSACTION SQL文は使用できません。
複数コミットにまたがるフェッチ
分散トランザクション
接続に関して、TimesTenでのOracle Pro*C/C++プリコンパイラのサポートには次のものは含まれません。
ALTER AUTHORIZATION句
データベースへの自動接続
SYSDBA権限またはSYSOPER権限がTimesTenに存在しない場合、これらの権限を使用したデータベースへの接続。
TimesTenまたはOracle Databaseへの暗黙的接続(dblinks)
サポートされている接続構文の詳細は、「Pro*C/C++からTimesTenデータベースへの接続」を参照してください。
前の項で示したTimesTenの制限を前提として、この項では、Pro*C/C++ EXEC SQL実行可能コマンド、コマンドのカテゴリおよびTimesTenでサポートされていないか、一部のみサポートされているコマンド句の概要を示します。
ALTER AUTHORIZATION
CACHE FREE ALL
CALL
これはPL/SQLのコールでのみサポートされます。TimesTen組込みプロシージャをコールするには、動的SQL文を使用します。
すべてのCOLLECTION...コマンド
COMMIT FORCE '任意のテキスト'
COMMIT WORK COMMENT '任意のテキスト' RELEASE
COMMENT句はサポートされていません。
CONNECT BY
CONTEXT OBJECT OPTION GET
CONTEXT OBJECT OPTION SET
DECLARE CURSOR
WITH HOLD句はサポートされていません。
DECLARE TABLE
Oracle Databaseデータ型のみサポートされています。
DECLARE TYPE
EXPLAIN PLAN
IN SYSDBA MODE
IN SYSOPER MODE
LOCK TABLE
すべてのOBJECT...コマンド
PARTITION
REGISTER CONNECT
RETURN
RETURNING
SAVEPOINT
SET DESCRIPTOR
CHARACTER_SET_NAMEは設定できません。
SET TRANSACTION
START WITH
TO SAVEPOINT
既存のPro*C/C++プログラムがあり、そのプログラムでTimesTenでサポートされていないPro*C/C++機能が使用されているかどうかを確認する場合は、ttSrcScanコマンドライン・ユーティリティを使用すると、サポートされていない埋込みSQL関数および型に関してプログラムをスキャンできます。このユーティリティは、TimesTenまたはOracle Databaseがインストールされていない場合でも実行可能なスタンドアロン・ユーティリティであり、TimesTenでサポートされているどのプラットフォームでも動作します。入力としてソース・コード・ファイルを読み取り、出力としてHTMLおよびテキスト・ファイルを作成します。サポートされていない項目が検出されると、それらの項目はログに記録され、代替が示されます。入力ファイルまたはスキャン対象のプログラムのディレクトリ、およびttSrcScanレポートの出力ディレクトリを指定します。その他のオプションも使用できます。
ttSrcScanユーティリティは、Oracle Technology Networkのサイトから入手できます。詳細は、付属のREADMEファイルを参照してください。
この項では、TimesTenのPro*C/C++アプリケーションの使用に関する次の内容について説明します。
Pro*C/C++のシステム構成ファイルpcscfg.cfgには、Pro*C/C++ソース・コードをプリコンパイルするためのプリコンパイラ・オプションが含まれています。TimesTenでは、TimesTenによって提供されるこのファイルのバージョンを使用する必要があります。通常、これは、TimesTen ttenvスクリプトによりTimesTenが適切に構成されると、自動的にこのバージョンになります。
ttenvの詳細は、Oracle TimesTen In-Memory Databaseインストレーション、移行およびアップグレード・ガイドの環境変数を参照してください。
|
ノート: TimesTenで動作するOCIおよびPro*C/C++プログラムが適切に生成されるためには、OCIおよびPro*C/C++コンパイルにORACLE_HOMEを設定しないでください(以前に設定されていた場合は設定解除してください)。 |
Pro*C/C++アプリケーションを作成する前に、環境を設定する必要があります。
TimesTen Classicクイック・スタートOCIファイルおよびPro*C/C++ Makeファイルを使用して、適切な環境設定を実装できます。「TimesTenクイック・スタートおよびサンプル・アプリケーション」を参照してください。
パス内でOracle Instant ClientディレクトリがOracle Databaseライブラリより前になるように、LD_LIBRARY_PATHまたはPATHが設定されていることを確認します。timesten_home/bin/ttenvスクリプトを使用すると、パスは適切に設定されます。
次に、次のようなステップを使用して、Pro*C/C++アプリケーションを作成します。ここで示すステップは、UNIXシステムの基本的な例を表し、プログラムに他のインクルード(#include)または他のライブラリへのリンクが含まれていないことを想定しています。instant_clientの指定は、Oracle Instant Clientがインストールされているディレクトリを表します。
システム・プロンプトからprocコマンドを使用して、Pro*C/C++ソース・ファイルをプリコンパイルします。次に例を示します。
% proc iname=sample.pc
procユーティリティは.pcソース・ファイルを入力として受け取り、.cファイルを生成します。
生成されたCコード・ファイルをコンパイルします。Linuxプラットフォームでは、次のようなコマンドを入力します。
% gcc -c sample.c -I(instant_client)/sdk/include
生成されたオブジェクト・モジュールをSQLLIBのモジュールにリンクします。次に例を示します。
% gcc -o sample sample.o -L(instant_client) -lclntsh
この項では、Pro*C/C++アプリケーションからTimesTenデータベースへの接続について説明します。TimesTen Pro*C/C++およびTimesTen OCIでは、Oracle Instant Clientを使用してデータベースに接続します。tnsnamesネーミング・メソッドまたは簡易接続ネーミング・メソッドを使用してデータベースに接続するための追加の構成ステップについては、「OCIからTimesTenデータベースへの接続」を参照してください。
TimesTen Classicについては、次のトピックで説明します。
|
ノート:
|
TimesTenでは、次の接続構文がサポートされます。
EXEC SQL CONNECT{:user IDENTIFIED BY :pwd | :user_string}
[[AT{dbname |:host_variable}]USING :connect_string];
パラメータについては、表4-1を参照してください。
表4-1 接続パラメータ
| パラメータ | 説明 |
|---|---|
|
|
ユーザー名 |
|
|
パスワード |
|
|
別々の これは、 |
|
|
|
|
|
値にデータベース識別子をとる変数 |
|
|
TimesTenデータベースの有効なTNS名または簡易接続文字列 |
Pro*C/C++アプリケーションからTimesTenデータベースに接続するには、そのデータベースのTNS名または簡易接続文字列を構成する必要があります。「OCIからTimesTenデータベースへの接続」で説明するtnsnamesまたは簡易接続のステップを実行してください。
Pro*C/C++から、ホスト変数を使用して、ユーザー名、パスワードおよびTNS名を指定することができます。次に例を示します。
EXEC SQL CONNECT :dbstring
ここで、dbstringはuser1/password@my_tnsnameに設定されています。
あるいは、ホスト変数にユーザー名、パスワードおよび簡易接続文字列を指定することもできます。たとえば、dbstringにuser1/password@localhost/ttclient:timesten_clientを設定できます。
あるいは、TWO_TASKまたはLOCAL環境変数(使用オペレーティング・システムに適したほう)が、my_tnsnameまたはlocalhost/ttclient:timesten_clientに設定されている場合は、次の例のように接続できます。
EXEC SQL CONNECT :user1 IDENTIFIED BY :pwd1
TimesTen Cacheを使用するには、キャッシュされたOracle Database表からの選択およびその更新が可能なOracle Databaseユーザーと同じ名前を持つキャッシュ・ユーザーがTimesTen Classicデータベースに存在している必要があります。たとえば、このOracle Databaseユーザーは、キャッシュ管理ユーザーまたはスキーマ・ユーザーになります。TimesTenキャッシュ・ユーザーのパスワードは、同じ名前を持つOracle Databaseユーザーと別のパスワードにすることができます。詳細は、『Oracle TimesTen Application-Tier Database Cacheユーザーズ・ガイド』のキャッシュ・インフラストラクチャの設定に関する説明を参照してください。
TimesTen CacheでPro*C/C++を使用する場合、TimesTenでは、ログイン時にEXEC SQL CONNECTコールのパスワード・フィールドにOracle Databaseユーザーのパスワードを追加することで、Pro*C/C++を介してOracle Databaseユーザーのパスワードを渡すことができます。次の例のように、接続文字列で属性OraclePWDを使用します。
text *cacheuser = (text *)"cacheuser1"; text *cachepwds = (text *)"ttpassword;OraclePWD=oraclepassword"; text *dbname = (text *)"tt_tnsname"; .... EXEC SQL CONNECT :cacheuser IDENTIFIED BY :cachepassword AT :dbname
Oracle DatabaseユーザーのパスワードがTimesTenユーザーのパスワードと同じ場合でも、常にOraclePWDを指定する必要があります。また、TimesTen CacheのOracle Databaseパスワードを指定する場合は、パスワードを別個のホスト変数として指定するEXEC SQL CONNECTの形式を使用する必要があります。この例では、cacheuser1はTimesTenキャッシュ・ユーザーの名前であると同時に、キャッシュされたOracle Database表にアクセスできるOracle Databaseユーザーの名前で、ttpasswordはTimesTenキャッシュ・ユーザーのパスワードで、oraclepasswordはOracle Databaseユーザーのパスワードで、tt_tnsnameは接続するTimesTenデータベースのTNS名です。Oracle Databaseは、sys.odbc.iniファイルまたはユーザーodbc.iniファイルのTimesTen OracleNetServiceName一般接続属性を使用して指定します。
または、TNS名とともにAT句を使用するかわりに、TWO_TASKまたはLOCAL環境変数を使用できます(「OCIからTimesTenデータベースへの接続」を参照)。
エラー状態およびエラー・レポートに関して、次のことに注意してください。
TimesTen Pro*C/C++アプリケーションのエラーでは、Oracle Databaseエラー・コードが返されます。TimesTenでは、同様の状況でOracleがレポートするOracle Databaseエラー・コードと同じエラー・コードをレポートしようとします。エラー・メッセージは、TimesTenカタログまたはOracle Databaseカタログのいずれかから取得されます。エラー・メッセージによっては、TimesTenエラー・コードを伴う場合もあります(該当する場合)。解析エラー・コードに依存するPro*C/C++アプリケーションは、チェックする必要があります。
TimesTenはほとんどの一時的なエラーを自動的に解決します(これは、TimesTen Scaleoutで特に重要です)が、アプリケーションがORA-57005エラーまたはORA-57007エラーを検出した場合には必要に応じて現在のトランザクションまたは最新のAPIコールを再試行することをお薦めします。「一時的なエラー(OCI)」を参照してください。
TimesTenでは、エラーが発生した場合にエラー・ハンドラへ移動するためのWHENEVER SQLERRORディレクティブ、およびデータが見つからない状況が発生した場合に処理セクションヘ移動するためのWHENEVER NOT FOUNDディレクティブがサポートされています。TimesTenでは、WHENEVER SQLWARNINGディレクティブはサポートされていません。
例:
EXEC SQL WHENEVER NOT FOUND GOTO close_cursor; ... EXEC SQL WHENEVER SQLERROR GOTO error_handler;
この項では、TimesTen Pro*C/C++で使用できるその他の機能について説明します。
「TimesTen OCIでの連想配列バインド」の説明のとおり、TimesTen PL/SQLでの連想配列(以前の索引付き表またはPL/SQL表)は、IN、OUTまたはIN OUTバインド・パラメータとしてサポートされます。詳細および制限事項は、該当する項を参照してください。
連想配列は、PL/SQLブロックとPro*C/C++アプリケーション間だけでなく、OCIアプリケーション間でも渡すことができます。これらには、BINARY_INTEGER型またはPLS_INTEGER型のPL/SQL変数によって索引付けができます。
通常は、ホスト配列全体がPL/SQLに渡されますが、Pro*C/C++ ARRAYLEN文を使用すれば、より小さい配列サイズを指定できます。
詳細は、『Pro*C/C++プログラマーズ・ガイド』の埋込みPL/SQLに関する説明のPL/SQL表、ホスト配列およびARRAYLEN文に関する各説明を参照してください。
例4-1 Pro*C/C++の連想配列へのバインド
このコードの抜粋は、Pro*C/C++からPL/SQLの連想配列num_tabにバインドされる配列salary[]を示します。
...
float salary[100];
/* populate the host array */
EXEC SQL EXECUTE
DECLARE
TYPE NumTabTyp IS TABLE OF REAL
INDEX BY BINARY_INTEGER;
median_salary REAL;
n BINARY_INTEGER;
...
FUNCTION median (num_tab NumTabTyp, n INTEGER)
RETURN REAL IS
BEGIN
-- compute median
END;
BEGIN
n := 100;
median_salary := median(:salary, n);
...
END;
END-EXEC;
...
TimesTen ClassicではLOB (ラージ・オブジェクト)がサポートされています。これには、CLOB(Character LOB)、NCLOB(National Character LOB)およびBLOB(Binary LOB)が含まれます。
「LOBの使用」を参照してください。この項はODBC向けですが、LOBの概要、TimesTenとOracle Database LOBの違いおよびLOBのプログラミング・インタフェースについても説明しています。LOBロケータ、一時LOB、OCIでの簡易データ・インタフェースまたはLOBロケータの使用方法およびOCI LOBのその他の機能については、「TimesTen OCIでのLOB」も参照してください。
この項では、主要なPro*C/C++ LOBの機能およびTimesTen固有のサポートおよび制限に重点を置いています。
TimesTenでのLOBの追加情報は、『Oracle TimesTen In-Memory Database SQLリファレンス』のLOBのデータ型に関する説明を参照してください。
TimesTenでは、BFILE、SecureFile、LOBに対する配列読取りおよび書込みまたはLOBのコールバック関数をサポートしていないことに注意し、LOBの詳細情報およびPro*C/C++での使用方法は、『Pro*C/C++プログラマーズ・ガイド』のLOBに関する説明を参照してください。特に、その章にある、プログラムでのLOBの使用に関する説明を参照してください。
Pro*C/C++に関して、次の内容について説明します。
|
重要: OCIについての章で説明するとおり、TimesTenでは、アプリケーションで使用したLOBは、トランザクションの終了後は有効ではありません。 |
|
ノート: TimesTenでは、LOBのピース単位のデータ・インタフェースはOCIまたはPro*C/C++アプリケーションには適用されません。(ただし、LOBロケータ・インタフェースの機能を介して、LOBデータを分割して操作することはできます。) |
簡易データ・インタフェースでは、その他のスカラー・データ型の操作(EXEC SQL INSERTやEXEC SQL SELECTの使用など)と同様の方法で、アプリケーションによるLOBデータの操作が可能です。アプリケーションでは、対応する変数タイプと互換性のあるLOB型を使用できます。
アプリケーションでは、必要に応じてEMPTY_BLOB()関数またはEMPTY_CLOB()関数を使用して、永続LOBを初期化できます。これは、次に説明する、LOBロケータ・インタフェースでALLOCATEを使用することとほぼ同じです。次のような表について考えてみます。
EXEC SQL CREATE TABLE lob_table ( a_blob BLOB, a_clob CLOB );
...
EXEC SQL INSERT INTO lob_table (a_blob, a_clob)
VALUES (EMPTY_BLOB(), EMPTY_CLOB());
...
EXEC SQL CREATE TABLE data_table
( name VARCHAR2(30), length NUMBER(10), bincol BLOB, charcol CLOB );
次の例では、data_tableから選択したLOBデータをmyblobおよびmyclobに代入し、次に、代入したLOBデータをlob_tableに挿入します。
...
OCIBlobLocator *myblob;
OCIClobLocator *myclob;
...
EXEC SQL SELECT bincol, charcol INTO :myblob, :myclob FROM data_table
WHERE name = :key;
...
// Put data into lob_table.
...
EXEC SQL INSERT INTO lob_table (a_blob, a_clob) VALUES (:myblob, :myclob);
NCLOBを使用するには、次のように変数を宣言します。
OCIClobLocator CHARACTER SET IS NCHAR_CS *mynclob;
|
ノート: OCIまたはPro*C/C++を介した簡易データ・インタフェースでは、バインドのサイズが64KBに制限されます。 |
Pro*C/C++ LOBロケータ・インタフェースは、データベースまたは一時LOB(ピース単位またはチャンク全体)のどちらとも使用できます。
TimesTenでは、特にBFILE、SecureFile、LOBに対する配列の読取りおよび書込みまたはLOBのコールバック関数を対象とした機能がサポートされていないことに注意し、LOBのPro*C/C++文の詳細情報は、『Pro*C/C++プログラマーズ・ガイド』のLOB文に関する説明を参照してください。
エンドツーエンドの例は、『Pro*C/C++プログラマーズ・ガイド』のLOBに関する説明にあるlobdemo1.pcの例を参照してください。
関連情報は、OCIでのLOBロケータ・インタフェースの使用を参照してください。
|
ノート: Pro*C/C++構文で、機能性が十分でないために操作を完了するための指定を完全に行えない場合は、対応するOCI関数を代替として使用できます。 |
Pro*C/C++アプリケーションでは、最初にALLOCATEを使用してロケータを割り当ててから、CREATE TEMPORARY埋込みSQL機能を使用して一時LOBを作成できます。FREEを使用してロケータへの割当てを解放し、FREE TEMPORARYを使用して一時LOB自身を解放します。次に例を示します。
「OCIでの一時LOBの作成」も参照してください。
|
重要: TimesTenでは、一時LOBを作成すると、データベース・トランザクションがまだ進行していない場合は、データベース・トランザクションが作成されます。エラーとなる状況を回避するには、コミットまたはロールバックを実行してトランザクションをクローズしてください。 |
OCIClobLocator *tempclob; EXEC SQL ALLOCATE :tempclob; EXEC SQL LOB CREATE TEMPORARY :tempclob; ... // (Manipulate LOB as desired.) ... EXEC SQL FREE TEMPORARY :tempclob; EXEC SQL FREE :tempclob;
あるいは、LOB文字セット(ここではNCHAR)を指定するには、対応するOCI関数を使用できます。
status = OCILobCreateTemporary(svc, err, tempclob, OCI_DEFAULT, SQLCS_NCHAR,
OCI_TEMP_CLOB, TRUE, OCI_DURATION_TRANSACTION);
アプリケーションでは通常、SQL文を使用してLOBロケータを取得し、適切なAPI関数をロケータに渡すことで、データベースからLOBにアクセスします。
「OCIでの永続LOBのロケータへのアクセス」も参照してください。
前述した『Pro*C/C++プログラマーズ・ガイド』のLOBに関する項で説明しているlobdemo1.pcの例を次に抜粋します。この例では、CLOB license_txtおよび社会保険番号、氏名、および交通違反を集計したテキストが含まれる列(CLOB列)で構成される表license_tableを使用します。
OCIClobLocator *license_txt;
...
EXEC SQL ALLOCATE :license_txt;
...
EXEC SQL SELECT name, txt_summary INTO :name, :license_txt FROM license_table
WHERE sss = :sss;
Pro*C/C++アプリケーションでは、LOB OPENおよびLOB CLOSEを使用してLOBをオープンおよびクローズし、LOB READを使用してLOBデータを読み取り、LOB WRITEまたはLOB WRITE APPENDを使用してLOBデータに書き込みまたは追加し、LOB DESCRIBEを使用してLOBに関する情報を取得し、その他の各種Pro*C/C++機能を使用して様々なその他操作を行うことができます。Pro*C/C++ LOBロケータ・インタフェースのすべての機能については、『Pro*C/C++プログラマーズ・ガイド』のLOBに関する説明を参照してください。
データを書き込むには、LOB WRITE ONEを使用して、1チャンクでデータを書き込みます。TimesTenでは、LOB WRITE FIRST、LOB WRITE NEXTまたはLOB WRITE LAST(ピース単位のデータ・インタフェースの機能)はサポートしていません。
「OCI LOBロケータ・インタフェースを使用したLOBデータの読取りおよび書込み」も参照してください。
EXEC SQL LOB READ文の例を次に示します。
EXEC SQL LOB READ :amt FROM :blob INTO :buffer;
詳細は、『Pro*C/C++プログラマーズ・ガイド』の「LOB」にある、ファイルの読取り、BLOBのWRITEの例に関する説明を参照してください。
EXEC SQL LOB WRITE文の例(LOBデータの1チャンクでの書込み)を次に示します。
EXEC SQL LOB WRITE ONE :amt FROM :buffer INTO :blob;
詳細は、『Pro*C/C++プログラマーズ・ガイド』の「LOB」にある、BLOBのREAD、ファイルの書込みの例に関する説明を参照してください。
EXEC SQL LOB WRITE APPEND文の例を次に示します。
EXEC SQL LOB WRITE APPEND :amt FROM :writebuf INTO :blob;
|
ノート: LOBをオープンすることは、概念的にはファイルを開くことに似ていますが、技術的には異なります。LOBをオープンすることは、必要となるリソースに関するヒントのようなものです。
|
例4-2 Pro*C/C++ LOBロケータ・インタフェースを使用したLOBの書込み
前述した『Pro*C/C++プログラマーズ・ガイド』のLOBに関する項で説明しているlobdemo1.pcの例を次に抜粋します。
...
OCIClobLocator *a_clob;
char *charbuf;
ub4 ClobLen, WriteAmt;
int CharLen = strlen(charbuf);
int NewCharbufLen = CharLen + DATELENGTH + 4;
varchar *NewCharbuf;
NewCharbuf = (varchar *)malloc(2 + NewCharbufLen);
NewCharbuf->arr[0] = '\n';
NewCharbuf->arr[1] = '\0';
strcat((char *)NewCharbuf->arr, charbuf);
NewCharbuf->arr[CharLen + 1] = '\0';
strcat((char *)NewCharbuf->arr, curdate);
NewCharbuf->len = NewCharbufLen;
EXEC SQL LOB DESCRIBE :a_clob GET LENGTH INTO :ClobLen;
WriteAmt = NewCharbufLen;
EXEC SQL LOB WRITE ONE :WriteAmt FROM :NewCharbuf WITH LENGTH :NewCharbufLen
INTO :a_clob;
...
例4-3 Pro*C/C++ LOBロケータ・インタフェースを使用したLOBへの書込みおよび追加
この例では、前述の例と同様に、LOB WRITE ONEを使用します。次にLOB WRITE APPENDも使用して、その他のデータを追加します。ここでは、MAX_CHUNKSに達するまで、1KずつのチャンクでBLOBに書込みまたは追加を行います。
...
EXEC SQL select b into :blob from t where pk = 1 for update;
EXEC SQL LOB OPEN :blob READ WRITE;
// Write/append to the BLOB
for (i = 0; i < MAX_CHUNKS; i++) {
if (i==0) { // FIRST CHUNK
/*
Write the first piece
*/
EXEC SQL LOB WRITE ONE :amt FROM :writebuf INTO :blob;
}
else { // All Other Chunks
/*
At this point, APPEND all the next pieces
*/
EXEC SQL LOB WRITE APPEND :amt FROM :writebuf INTO :blob ;
}
...
}
...
この項では、TimesTenでサポートされているPro*C/C++プリコンパイラ・オプションについて説明します。
表4-2に、TimesTenのPro*C/C++プリコンパイラ・オプションのサポートを示します。
|
ノート: TimesTenでは、アドバンスト・キューイング、データベース最適化、ユーザー定義オブジェクトの機能や関連するオプションはサポートされていません。また、TimesTenではCPOOL=NOのみがサポートされ、関連するオプションはサポートされていません。 |
表4-2 TimesTenのPro*C/C++プリコンパイラ・オプションのサポート
| オプション | ノート |
|---|---|
|
|
サポートされる値: |
|
|
なし |
|
|
サポートされる値: Oracle Databaseデフォルト値の |
|
|
なし |
|
|
なし |
|
|
なし |
|
|
サポートされる値: |
|
|
なし |
|
|
なし |
|
|
サポートされる値: |
|
|
なし |
|
|
なし |
|
|
なし |
|
|
なし |
|
|
なし |
|
|
なし |
|
|
なし |
|
|
サポートされる値: |
|
|
なし |
|
|
なし |
|
|
なし |
|
|
なし |
|
|
なし |
|
|
なし |
|
|
なし |
|
|
なし |
|
|
なし |
|
|
なし |
|
|
なし |
|
|
なし |
|
|
サポートされる値: |
|
|
なし |
|
|
なし |
|
|
なし |
|
|
なし |
|
|
なし |
|
|
なし |
|
|
なし |
|
|
適用なし すべての Pro*C/C++アプリケーションでPL/SQLが使用される場合は、常にPro*C/C++は 重要: 「セマンティック・チェックの制限」を参照してください。 |
|
|
なし |
|
|
なし |
|
|
なし |
|
|
なし |
|
|
なし |
|
|
なし |
|
|
サポートされる値: |
|
|
なし |
|
ノート: TimesTenでは、CLOSE_ON_COMMITのデフォルト値はサポートされていません。TimesTenでは、CLOSE_ON_COMMIT=YESのみサポートされています。 |
プリコンパイラ・オプションは次の方法で設定できます。
コンパイル時に、構成ファイルpcscfg.cfgまたはPro*C/C++コマンドラインで設定
コマンドライン設定は、構成ファイルでの設定よりも優先されます。
実行時に、EXEC ORACLE OPTIONコマンドで設定
実行時の設定は、コンパイル時の設定よりも優先されます。
たとえば、TimesTenに付属の構成ファイルの一部を次に示します。
ltype=short parse=full close_on_commit=yes ...
次のコマンドラインは、構成ファイルでのltype=short設定よりも優先されます。
% proc ltype=long ... iname=sample.pc
次の実行時コマンドは、コマンドラインからのltype=long設定よりも優先されます。
EXEC ORACLE OPTION LTYPE=NONE;