Oracle TimesTen In-Memory DatabaseおよびOracle IMDB Cacheでは、Oracle Pro*C/C++プリコンパイラがサポートされます。 プリコンパイラは、TimesTenデータベースにアクセスする埋込みSQLおよびPL/SQLアプリケーションで使用できます。
この章の内容は次のとおりです。
この章では、Pro*C/C++に関する概要およびTimesTen固有の情報のみを示します。 一般的な詳細情報は、Oracle Databaseライブラリの『Pro*C/C++ Programmer's Guide』を参照してください。
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++コードは、TimesTenにOracle Instant Clientの一部として付属しているOracle 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でのOracle Call Interfaceのサポート」を参照してください。 その章の説明の多くは、Pro*C/C++アプリケーションにも当てはまります。
TimesTenでは、SQL92規格がサポートされています。 Oracleでは、SQL99規格がサポートされています。
TimesTen Pro*C/C++プリコンパイラでは、TimesTenおよびIMDB Cacheでサポートされていない機能の埋込みSQLはサポートされていません。 「TimesTenの制限」を参照してください。
また、TimesTenでのOracle Pro*C/C++プリコンパイラのサポートには、次の制限があります。
REGISTER CONNECTはサポートされていません。
ストアドJavaサブプログラムはサポートされていません。
SQLRowidGet()
は、SELECT FOR UPDATE文に続く場合にのみサポートされます。
TimesTenでのOracle Pro*C/C++プリコンパイラのサポートには、プリコンパイル時のセマンティック・チェックは含まれません。 セマンティック・チェックを指定するSQLCHECKプリコンパイラ・オプション設定は可能ですが、実行されません。
ただし、SEMANTICSを設定した場合、プリコンパイルのセマンティック・チェックは実行されませんが、データベース接続が行われることを認識することが重要です。 このため、SEMANTICSを設定する場合は、プリコンパイル時に次の要件があります。
TimesTenデータベースが稼働している必要があります。
コマンドラインまたはpcscfg.cfg
構成ファイルのいずれかでUSERIDプリコンパイラ・オプションを設定する必要があります。 既存のTimesTenユーザーのユーザー名とパスワード、および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データベースが稼働している必要があります。
既存のTimesTenユーザーを指定して、USERIDプリコンパイラ・オプションを設定する必要があります。 このオプションの設定の詳細は、前の項の「セマンティック・チェックの制限」を参照してください。
トランザクションに関して、TimesTenでのOracle Pro*C/C++プリコンパイラのサポートには次のものは含まれません。
SAVEPOINT SQL文
SET TRANSACTION SQL文
トランザクションのコミットおよびロールバックは実行できますが、SET TRANSACTION SQL文は使用できません。
複数コミットにまたがるフェッチ
分散トランザクション
接続に関して、TimesTenでのOracle Pro*C/C++プリコンパイラのサポートには次のものは含まれません。
ALTER AUTHORIZATION句
TimesTenデータベースへの自動接続
SYSDBA権限またはSYSOPER権限がTimesTenに存在しない場合、これらの権限を使用した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 TABLE: Oracleデータ型のみサポートされています。
DECLARE TYPE
EXPLAIN PLAN
IN SYSDBA MODE
IN SYSOPER MODE
すべてのLOB...コマンド
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がインストールされていない場合でも実行可能なスタンドアロン・ユーティリティであり、TimesTenでサポートされているどのプラットフォームでも動作します。入力としてソース・コード・ファイルを読み取り、出力としてHTMLおよびテキスト・ファイルを作成します。 サポートされていない項目が検出されると、それらの項目はログに記録され、代替が示されます。ttSrcScan
実行可能ファイルは、TimesTenのインストール先のquickstart/sample_util
ディレクトリにあります。
入力ファイルまたはプログラムをスキャンするディレクトリ、およびttSrcScan
レポートの出力ディレクトリを指定します。その他のオプションも使用できます。詳細は、sample_util
ディレクトリにあるREADMEファイルを参照してください。
この項では、TimesTenのPro*C/C++アプリケーションの使用に関する次の内容について説明します。
Pro*C/C++アプリケーションを作成する前に、環境を設定する必要があります。
クイック・スタート・デモに付属のTimesTen OCIファイルおよびPro*C/C++ Makeファイルを使用して、適切な環境設定を実行できます。これらのファイルは次の場所にあります。
install_dir/quickstart/sample_code/oci/ install_dir/quickstart/sample_code/proc/
(ただし、クイック・スタートを別の場所にインストールしている場合を除きます。)
LD_LIBRARY_PATHまたはPATHが、パス内でOracle Instant ClientディレクトリがOracle Databaseライブラリより前になるように設定されていることを確認します。 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/include
生成されたオブジェクト・モジュールをSQLLIBのモジュールにリンクします。次に例を示します。
% gcc -o sample sample.o -L(instant_client
)/lib -lclntsh
この項では、Pro*C/C++アプリケーションから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 接続パラメータ
パラメータ | 説明 |
---|---|
|
ユーザー名です。 |
|
ユーザー・パスワードです。 |
|
別々の |
|
前のDECLARE DATABASE文で宣言されたデータベース識別子です。 |
|
値にデータベース識別子をとる変数です。 |
|
TimesTenデータベースの有効なTNS名または簡易接続文字列です。 |
Oracle tnsnames
または簡易接続メソッドを使用する場合、EXEC SQL CONNECT構文を簡略化できます。
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
IMDB Cacheを使用するには、キャッシュされたOracle表からの選択およびその更新が可能なOracle Databaseユーザーと同じ名前を持つキャッシュ・ユーザーがTimesTenデータベースに存在している必要があります。たとえば、このOracleユーザーは、キャッシュ管理ユーザーまたはスキーマ・ユーザーであることができます。TimesTenキャッシュ・ユーザーのパスワードは、同じ名前を持つOracleユーザーと別のパスワードにすることができます。詳細は、『Oracle In-Memory Database Cacheユーザーズ・ガイド』のキャッシュ・インフラストラクチャの設定に関する項を参照してください。
IMDB CacheでPro*C/C++を使用する場合、TimesTenでは、Pro*C/C++を介してOracleユーザーのパスワードを渡すことができます。それには、TimesTenへのログイン時にEXEC SQL CONNECTコールのパスワード・フィールドにOracleユーザーのパスワードを追加します。次の例のように、接続文字列で属性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ユーザーのパスワードがTimesTenユーザーのパスワードと同じ場合でも、常にOraclePWD
を指定する必要があります。 また、IMDB CacheのOracleパスワードを指定する場合は、パスワードを別個のホスト変数として指定するEXEC SQL CONNECTの形式を使用する必要があります。 この例のcacheuser1
は、TimesTenキャッシュ・ユーザーの名前であると同時に、キャッシュされたOracle表にアクセスできるOracleユーザーの名前です。ttpwd
は、TimesTenキャッシュ・ユーザーのパスワードです。orclpwd
は、Oracleユーザーのパスワードです。tt_tnsname
は、接続するTimesTenデータベースのTNS名です。Oracle Databaseは、odbc.ini
ファイルまたはsys.odbc.ini
ファイルのTimesTen OracleNetServiceName
接続属性を使用して指定します。
または、TNS名とともにAT句を使用するかわりに、TWO_TASKまたはLOCAL環境変数を使用できます(「OCIからTimesTenデータ・ストアへの接続」を参照)。
エラー状態およびエラー・レポートに関して、次のことに注意してください。
TimesTen Pro*C/C++アプリケーションのエラーでは、Oracleエラー・コードが返されます。TimesTenでは、同様の状況でOracleがレポートするOracleエラー・コードと同じOracleエラー・コードをレポートしようとします。エラー・メッセージは、TimesTenカタログまたはOracleカタログのいずれかから取得されます。エラー・メッセージによっては、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++プリコンパイラ・オプションについて説明します。
表4-2に、TimesTenのPro*C/C++プリコンパイラ・オプションのサポートを示します。
表4-2 TimesTenのPro*C/C++プリコンパイラ・オプションのサポート
オプション | 注意 |
---|---|
AUTO_CONNECT |
サポートされる値: NO(デフォルト) |
CHAR_MAP |
サポート |
CINCR |
TimesTenではCPOOL=NOのみサポートされているため、この設定は無効になります。 |
CLOSE_ON_COMMIT |
サポートされる値: YES Oracleデフォルト値のNOは、TimesTenによって上書きされます。 |
CMAX |
TimesTenではCPOOL=NOのみサポートされているため、設定は無効になります。 |
CMIN |
TimesTenではCPOOL=NOのみサポートされているため、設定は無効になります。 |
CNOWAIT |
TimesTenではCPOOL=NOのみサポートされているため、設定は無効になります。 |
CODE |
サポート |
COMP_CHARSET |
サポート |
CONFIG |
サポート |
CPOOL |
サポートされる値: NO(デフォルト) |
CPP_SUFFIX |
サポート |
CTIMEOUT |
TimesTenではCPOOL=NOのみサポートされているため、設定は無効になります。 |
DB2_ARRAY |
サポート |
DBMS |
サポートされる値: NATIVE(デフォルト) |
DEF_SQLCODE |
サポート |
DEFINE |
サポート |
DURATION |
TimesTenではオブジェクトはサポートされていないため、設定は無効になります。 |
DYNAMIC |
サポート |
ERRORS |
サポート |
ERRTYPE |
サポートされていません。 |
EVENTS |
両方の値を指定できますが、TimesTen OCIではアドバンスト・キューイングはサポートされていません。 |
FIPS |
サポート |
HEADER |
サポート |
HOLD_CURSOR |
サポート |
IMPLICIT_SVPT |
サポートされる値: NO(デフォルト) |
INAME |
サポート |
INCLUDE |
サポート |
INTYPE |
サポート |
LINES |
サポート |
LNAME |
サポート |
LTYPE |
サポート |
MAX_ROW_INSERT |
サポート |
MAXLITERAL |
サポート |
MAXOPENCURSORS |
サポート |
MODE |
サポート |
NATIVE_TYPES |
サポート |
NLS_CHAR |
サポート |
NLS_LOCAL |
サポートされる値: NO(デフォルト) |
OBJECTS |
TimesTenではオブジェクトはサポートされていないため、設定は無効になります。 |
ONAME |
サポート |
ORACA |
サポート |
OUTLINE |
すべての値を指定できますが、TimesTenではOracle最適化はサポートされていません。 |
OUTLNPREFIX |
両方の値を指定できますが、TimesTenではOracle最適化はサポートされていません。 |
PAGELEN |
サポート |
PARSE |
サポート |
PREFETCH |
サポート |
RELEASE_CURSOR |
サポート |
RUNOUTLINE |
サポートされていません。 両方の値( |
SELECT_ERROR |
サポート |
SQLCHECK |
すべてのSQLCHECK設定を指定できますが、TimesTenではプリコンパイル時のセマンティック・チェックはサポートされていません。 Pro*C/C++アプリケーションでPL/SQLが使用される場合は、常にPro*C/C++はSQLCHECK設定がSEMANTICSである場合と同様に動作します。 重要: SEMANTICS(または同義のFULL)の設定では、プリコンパイルのセマンティック・チェックが実行されない場合にも、常にデータベースへの接続が行われます。 「セマンティック・チェックの制限」を参照してください。 |
STMT_CACHE |
サポート |
SYS_INCLUDE |
サポート |
THREADS |
サポート |
TYPE_CODE |
サポート |
UNSAFE_NULL |
サポート |
USERID |
サポート |
UTF16_CHARSET |
NCHAR_CHARSET設定のみがサポートされています。 |
VARCHAR |
サポート |
VERSION |
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;