ヘッダーをスキップ
Oracle TimesTen In-Memory Database C開発者ガイド
リリース11.2.1
B56048-01
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

4 TimesTenでのOracle Pro*C/C++プリコンパイラのサポート

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++プリコンパイラの概要

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でのPro*C/C++のサポートの概要

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 OCIサポート

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++アプリケーションにも当てはまります。

埋込みSQLの制限

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の制限」を参照してください。

埋込み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

ttSrcScanユーティリティ

既存の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++の使用

この項では、TimesTenのPro*C/C++アプリケーションの使用に関する次の内容について説明します。

Pro*C/C++アプリケーションの作成

Pro*C/C++アプリケーションを作成する前に、環境を設定する必要があります。

  1. クイック・スタート・デモに付属のTimesTen OCIファイルおよびPro*C/C++ Makeファイルを使用して、適切な環境設定を実行できます。これらのファイルは次の場所にあります。

    install_dir/quickstart/sample_code/oci/
    install_dir/quickstart/sample_code/proc/
    

    (ただし、クイック・スタートを別の場所にインストールしている場合を除きます。)

  2. 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ファイルを参照してください。

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

    % proc iname=sample.pc
    

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

  2. 生成されたCコード・ファイルをコンパイルします。 Linuxプラットフォームでは、次のようなコマンドを入力します。

    % gcc -c sample.c -I(instant_client)/sdk/include
    
  3. 生成されたオブジェクト・モジュールをSQLLIBのモジュールにリンクします。次に例を示します。

    % gcc -o sample sample.o -L(instant_client)/lib -lclntsh
    

Pro*C/C++からTimesTenデータ・ストアへの接続

この項では、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 接続パラメータ

パラメータ 説明

user

ユーザー名です。

pwd

ユーザー・パスワードです。

user_string

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

dbname

前のDECLARE DATABASE文で宣言されたデータベース識別子です。

host_variable

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

connect_string

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


tnsnamesまたは簡易接続の使用

Oracle tnsnamesまたは簡易接続メソッドを使用する場合、EXEC SQL CONNECT構文を簡略化できます。

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

EXEC SQL CONNECT :dbstring

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

または、ホスト変数にユーザー名、パスワードおよび簡易接続文字列を含めることもできます。 たとえば、dbstringuser1/pwd1@localhost/ttclient:timesten_clientを設定できます。

あるいは、TWO_TASKまたはLOCAL環境変数(使用オペレーティング・システムに適したほう)が、my_tnsnameまたはlocalhost/ttclient:timesten_clientに設定されている場合は、次の例のように接続できます。

EXEC SQL CONNECT :user1 IDENTIFIED BY :pwd1

Pro*C/C++でのIMDB Cache用Oracleパスワードの指定

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;
    

Pro*C/C++のデモ・プログラム

TimesTenには、Pro*C/C++のデモ・プログラムが付属しています。 これらのプログラムはquickstart/sample_code/procディレクトリにあります。このディレクトリのREADMEファイルに、デモのコンパイル方法および実行方法が記載されています。

詳細は、クイック・スタートのようこそページ(install_dir/quickstart.html)を参照してください。

TimesTenのPro*C/C++プリコンパイラ・オプション

この項では、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

サポートされていません。 両方の値(yes|no)を指定できますが、無視されます。

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;