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/mypassword@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データベースへの接続」を参照してください。
前の項で示した制限を前提として、この項では、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
実行可能ファイルは、TimesTenのインストール先のquickstart/sample_util
ディレクトリにあります。
入力ファイルまたはスキャン対象のプログラムのディレクトリ、およびttSrcScan
レポートの出力ディレクトリを指定します。その他のオプションも使用できます。詳細は、sample_util
ディレクトリにある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 OCIファイルおよびPro*C/C++ Makeファイルを使用して、適切な環境設定を実行できます。これらのファイルは次の場所にあります(標準のクイック・スタートの場所を想定しています)。
install_dir/quickstart/sample_code/oci/ install_dir/quickstart/sample_code/proc/
パス内でOracle Instant ClientディレクトリがOracle Databaseライブラリより前になるように、LD_LIBRARY_PATH
またはPATH
が設定されていることを確認します。install_dir
/bin/ttenv
スクリプトまたはquickstart/ttquickstartenv
スクリプトを使用すると、パスは適切に設定されます。環境変数およびttenvの詳細は、『Oracle TimesTen In-Memory Databaseインストレーション・ガイド』の環境変数に関する項を参照してください。
次に、次のような手順を使用して、Pro*C/C++アプリケーションを作成します。ここで示す手順は、UNIXシステムの基本的な例を表し、プログラムに他のインクルード(#include
)または他のライブラリへのリンクが含まれていないことを想定しています。instant_client
の指定は、Oracle Instant Clientがインストールされているディレクトリを表します。
詳細なプラットフォーム固有の例は、quickstart/sample_code/proc
ディレクトリのクイック・スタートPro*C/C++ Makeファイルを参照してください。
システム・プロンプトからproc
コマンドを使用して、Pro*C/C++ソース・ファイルをプリコンパイルします。次に例を示します。
% proc iname=sample.pc
proc
ユーティリティは.pc
ソース・ファイルを入力として受け取り、.c
ファイルを生成します。
生成されたCコード・ファイルをコンパイルします。Linuxプラットフォームでは、次のようなコマンドを入力します。
% gcc -c sample.c -I(instant_client
)/sdk/
生成されたオブジェクト・モジュールをSQLLIB
のモジュールにリンクします。次に例を示します。
% gcc -o sample sample.o -L(instant_client
)/lib -lclntsh
この項では、Pro*C/C++アプリケーションからTimesTenへの接続について説明します。TimesTen Pro*C/C++およびOCIでは、Oracle Instant Clientを使用してTimesTenデータベースに接続します。tnsnamesネーミング・メソッドまたは簡易接続ネーミング・メソッドを使用してデータベースに接続するための追加の構成手順については、「OCIからTimesTenデータベースへの接続」
を参照してください。
この項には、次の項目が含まれます。
注意: TimesTen接続は、親プロセスから継承することはできません。プロセスが子プロセスを作成(分岐)する前にデータベース接続をオープンした場合、子プロセスではそのデータベース接続を使用しないでください。Pro*C/C++では、子プロセスが誤って親プロセスから接続を継承するのを回避するため、子プロセスを作成する前に親プロセスでEXEC SQL COMMIT RELEASE を使用します。 |
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に接続するには、TimesTenデータベースのTNS名または簡易接続文字列を構成する必要があります。「OCIからTimesTenデータベースへの接続」
で説明するtnsnamesまたは簡易接続の手順を実行してください。
Pro*C/C++から、ホスト変数を使用して、ユーザー名、パスワードおよびTNS名を指定することができます。次に例を示します。
EXEC SQL CONNECT :dbstring
ここで、dbstring
はuser1/pwd1@my_tnsname
に設定されています。
あるいは、ホスト変数にユーザー名、パスワードおよび簡易接続文字列を指定することもできます。たとえば、dbstring
にuser1/pwd1@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データベースに存在している必要があります。たとえば、このOracle Databaseユーザーは、キャッシュ管理ユーザーまたはスキーマ・ユーザーになります。TimesTenキャッシュ・ユーザーのパスワードは、同じ名前を持つOracle Databaseユーザーと別のパスワードにすることができます。詳細は、『Oracle TimesTen Application-Tier Database Cacheユーザーズ・ガイド』のキャッシュ・インフラストラクチャの設定に関する説明を参照してください。
TimesTen CacheでPro*C/C++を使用する場合、TimesTenでは、TimesTenへのログイン時にEXEC SQL CONNECT
コールのパスワード・フィールドにOracle Databaseユーザーのパスワードを追加することで、Pro*C/C++を介してOracle Databaseユーザーのパスワードを渡すことができます。次の例のように、接続文字列で属性OraclePWD
を使用します。
text *cacheuser = (text *)"cacheuser1"; text *cachepwds = (text *)"ttpwd;OraclePWD=orclpwd"; text *dbname = (text *)"tt_tnsname"; .... EXEC SQL CONNECT :cacheuser IDENTIFIED BY :cachepwds AT :dbname
Oracle DatabaseユーザーのパスワードがTimesTenユーザーのパスワードと同じ場合でも、常にOraclePWD
を指定する必要があります。また、TimesTen CacheのOracle Databaseパスワードを指定する場合は、パスワードを別個のホスト変数として指定するEXEC SQL CONNECT
の形式を使用する必要があります。この例のcacheuser1
は、TimesTenキャッシュ・ユーザーの名前であると同時に、キャッシュされたOracle Database表にアクセスできるOracle Databaseユーザーの名前で、ttpwd
は、TimesTenキャッシュ・ユーザーのパスワードで、orclpwd
は、Oracle Databaseユーザーのパスワードで、tt_tnsname
は、接続するTimesTenデータベースのTNS名です。Oracle Databaseは、sys.odbc.ini
ファイルまたはユーザーodbc.ini
ファイルのTimesTen OracleNetServiceName
一般接続属性を使用して指定します。
または、TNS名とともにAT
句を使用するかわりに、TWO_TASK
またはLOCAL
環境変数を使用できます(「OCIからTimesTenデータベースへの接続」を参照)。
[myadmin]
のようにユーザー名を大カッコ内に指定し、パスワードを空の文字列""として指定することで、Pro*C/C++を介して外部で識別されたユーザー(外部ユーザー)として接続できます。
特に、TimesTenでは常に外部ユーザーであるインスタンス管理者として接続する場合に有効です。
外部で識別されたユーザーは、直接モードまたはローカル・ホスト上のデータベースへのクライアント/サーバー接続に使用できますが、リモート・ホスト上のデータベースへのクライアント/サーバー接続には使用できません。
次の例を想定してください。
text *instanceadmin = (text *)"[myadmin]"; text *instanceadminpwd = (text *)""; text *dbname = (text *)"tt_tnsname"; .... EXEC SQL CONNECT :instanceadmin IDENTIFIED BY :instanceadminpwd AT :dbname
この機能はOCIプロキシ構文を使用します。『Oracle Call Interfaceプログラマーズ・ガイド』のプロキシを介したクライアント・アクセスに関する説明を参照してください。
エラー状態およびエラー・レポートに関して、次のことに注意してください。
TimesTen Pro*C/C++アプリケーションのエラーでは、Oracle Databaseエラー・コードが返されます。TimesTenでは、同様の状況でOracleがレポートするOracle Databaseエラー・コードと同じエラー・コードをレポートしようとします。エラー・メッセージは、TimesTenカタログまたはOracle Databaseカタログのいずれかから取得されます。エラー・メッセージによっては、TimesTenエラー・コードを伴う場合もあります(該当する場合)。解析エラー・コードに依存するPro*C/C++アプリケーションは、チェックする必要があります。
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では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++プリコンパイラ・オプションのサポートを示します。
表4-2 TimesTenのPro*C/C++プリコンパイラ・オプションのサポート
オプション | 注意 |
---|---|
|
サポートされる値: |
|
サポート |
|
適用なし TimesTenでは |
|
サポートされる値: Oracle Databaseデフォルト値の |
|
適用なし TimesTenでは |
|
適用なし TimesTenでは |
|
適用なし TimesTenでは |
|
サポート |
|
サポート |
|
サポート |
|
サポートされる値: |
|
サポート |
|
適用なし TimesTenでは |
|
サポート |
|
サポートされる値: |
|
サポート |
|
サポート |
|
適用なし TimesTenではオブジェクトはサポートされていないため、設定は無効になります。 |
|
サポート |
|
サポート |
|
サポートされていません。 |
|
適用なし 両方の値を指定できますが、TimesTen OCIではアドバンスト・キューイングはサポートされていません。 |
|
サポート |
|
サポート |
|
サポート |
|
サポートされる値: |
|
サポート |
|
サポート |
|
サポート |
|
サポート |
|
サポート |
|
サポート |
|
サポート |
|
サポート |
|
サポート |
|
サポート |
|
サポート |
|
サポート |
|
サポートされる値: |
|
適用なし TimesTenではオブジェクトはサポートされていないため、設定は無効になります。 |
|
サポート |
|
サポート |
|
適用なし すべての値を指定できますが、TimesTenではOracle Database最適化はサポートされていません。 |
|
適用なし 両方の値を指定できますが、TimesTenではOracle Database最適化はサポートされていません。 |
|
サポート |
|
サポート |
|
サポート |
|
サポート |
|
適用なし 両方の値( |
|
サポート |
|
適用なし すべての Pro*C/C++アプリケーションでPL/SQLが使用される場合は、常にPro*C/C++は 重要: 「セマンティック・チェックの制限」を参照してください。 |
|
サポート |
|
サポート |
|
サポート |
|
サポート |
|
サポート |
|
サポート |
|
サポートされる値: |
|
サポート |
|
適用なし TimesTenではオブジェクトはサポートされていないため、設定は無効になります。 |
注意: 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;