TimesTenのPro*C/C++の概要
TimesTen用のPro*C/C++アプリケーションの使用を始める際の方法について説明します。
TimesTenのPro*C/C++用の環境および構成
Pro*C/C++のシステム構成ファイルpcscfg.cfg
には、Pro*C/C++ソース・コードをプリコンパイルするためのプリコンパイラ・オプションが含まれています。TimesTenでは、TimesTenによって提供されるこのファイルのバージョンを使用する必要があります。通常は、timesten_home
/bin/ttenv
スクリプトによりTimesTenが適切に構成されると、自動的にそのようになります。
Pro*C/C++アプリケーションを作成する前に、環境を設定する必要があります。TimesTen Classicクイック・スタートOCIファイルおよびPro*C/C++ Makeファイルを使用して、適切な環境設定を実装できます。「TimesTenクイック・スタートおよびサンプル・アプリケーションについて」を参照してください。
その後、パス内でOracle Instant ClientディレクトリがOracle Databaseライブラリより前になるように、LD_LIBRARY_PATH
またはPATH
が設定されていることを確認します。ttenv
スクリプトを使用すると、このパスは適切に設定されます。
ttenv
については、『Oracle TimesTen In-Memory Databaseインストレーション、移行およびアップグレード・ガイド』の環境変数を参照してください。
ノート:
TimesTenで動作するOCIおよびPro*C/C++プログラムが適切に生成されるためには、OCIおよびPro*C/C++コンパイルにORACLE_HOME
を設定しないでください(以前に設定されていた場合は設定解除してください)。
Pro*C/C++アプリケーションの作成
環境を設定したら、Pro*C/C++アプリケーションを作成する手順に従います。
ここで示すステップは、UNIXシステムの基本的な例を表し、プログラムに他のインクルード(#include
)または他のライブラリへのリンクが含まれていないことを想定しています。instantclient
の指定は、Oracle Instant Clientがインストールされているディレクトリを表します。
Pro*C/C++からTimesTenデータベースへの接続
Pro*C/C++アプリケーションからTimesTenデータベースに接続する方法を示します。TimesTen Pro*C/C++およびTimesTen OCIでは、Oracle Instant Clientを使用してデータベースに接続します。
tnsnames
ネーミング・メソッドまたは簡易接続ネーミング・メソッドを使用してデータベースに接続するための追加の構成ステップについては、「OCIからTimesTenデータベースへの接続」を参照してください。
TimesTen Classicについては、次のトピックで説明します。
ノート:
-
TimesTen Scaleoutでは、すべてのインスタンスで必要に応じて
tnsnames.ora
ファイルおよびsqlnet.ora
ファイルに、これまで定義したすべてのTimesTen接続可能オブジェクトのエントリが自動的に移入されることに注意してください。「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名または簡易接続文字列 |
tnsnamesまたは簡易接続の使用
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
Pro*C/C++でのキャッシュ用Oracle Databaseパスワードの指定
キャッシュ操作でPro*C/C++を使用する場合、TimesTenでは、ログイン時にEXEC SQL CONNECT
コールでパスワード・フィールドにOracle Databaseキャッシュ管理ユーザーのパスワードを追加することで、Pro*C/C++を介してそのパスワードを渡すことができます。
キャッシュ操作を使用するには、キャッシュされたOracle Database表からの選択およびその更新が可能なOracle Databaseキャッシュ管理ユーザーと同じ名前のキャッシュ管理ユーザーが、TimesTen Classicデータベースに存在している必要があります。このOracle Databaseキャッシュ管理ユーザーはスキーマ・ユーザーにもできます。TimesTenキャッシュ管理ユーザーのパスワードは、Oracle Databaseキャッシュ管理ユーザーとは別のパスワードにできます。『Oracle TimesTen In-Memory Databaseキャッシュ・ガイド』のキャッシュ・インフラストラクチャの設定を参照してください。
次の例のように、接続文字列で属性OraclePWD
を使用します。
text *cacheadmin = (text *)"cacheadmin1"; text *cachepwds = (text *)"ttpassword;OraclePWD=oraclepassword"; text *dbname = (text *)"tt_tnsname"; .... EXEC SQL CONNECT :cacheadmin IDENTIFIED BY :cachepassword AT :dbname
Oracle Databaseキャッシュ管理ユーザーのパスワードがTimesTenキャッシュ管理ユーザーのパスワードと同じである場合でも、必ずOraclePWD
を指定する必要があります。また、キャッシュ操作用のOracle Databaseパスワードを指定する場合は、パスワードを別個のホスト変数として指定する、EXEC SQL CONNECT
の書式を使用する必要があります。この例では、cacheadmin1
は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;