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がインストールされているディレクトリを表します。

  1. システム・プロンプトからprocコマンドを使用して、Pro*C/C++ソース・ファイルをプリコンパイルします。次に例を示します:
    % proc iname=sample.pc

    procユーティリティは.pcソース・ファイルを入力として受け取り、.cファイルを生成します。

  2. 生成されたCコード・ファイルをコンパイルします。Linuxプラットフォームでは、次のようなコマンドを入力します。
    % gcc -c sample.c -I(instantclient)/sdk/include
  3. 生成されたオブジェクト・モジュールをSQLLIBのモジュールにリンクします。次に例を示します:
    % gcc -o sample sample.o -L(instantclient) -lclntsh

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 接続パラメータ

パラメータ 説明

user

ユーザー名

pwd

パスワード

user_string

userエントリとpwdエントリを別々に指定するのとは異なる方法

これは、user1/passwordのように、スラッシュで区切られたユーザー名とパスワードです。@記号の後に、dbnameを使用するかわりにデータベース識別子を含めることや、connect_stringを使用するかわりにTNS名または簡易接続文字列を含めることもできます。次の「tnsnamesまたは簡易接続の使用」の項にある例を参照してください。

dbname

DECLARE DATABASE文を使用してすでに宣言されているデータベース識別子

host_variable

値にデータベース識別子をとる変数

connect_string

TimesTenデータベースの有効なTNS名または簡易接続文字列

tnsnamesまたは簡易接続の使用

Pro*C/C++アプリケーションからTimesTenデータベースに接続するには、そのデータベースのTNS名または簡易接続文字列を構成する必要があります。

「OCIからTimesTenデータベースへの接続」で説明する、tnsnamesまたは簡易接続の手順を実行してください。

Pro*C/C++から、ホスト変数を使用して、ユーザー名、パスワードおよびTNS名を指定することができます。例:

EXEC SQL CONNECT :dbstring

ここで、dbstringuser1/password@my_tnsnameに設定されています。

あるいは、ホスト変数にユーザー名、パスワードおよび簡易接続文字列を指定することもできます。たとえば、dbstringuser1/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;