ヘッダーをスキップ
Oracle® TimesTen In-Memory Database C開発者ガイド
11gリリース2 (11.2.2)
B66444-05
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

4 TimesTenでのPro*C/C++のサポート

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

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での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でのOCIのサポート」を参照してください。ここの情報のほとんどは、Pro*C/C++アプリケーションにも該当することがあります。

埋込みSQLのサポートおよび制限

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

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

ttSrcScanユーティリティ

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

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

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++アプリケーションの作成

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

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

    install_dir/quickstart/sample_code/oci/
    install_dir/quickstart/sample_code/proc/
    
  2. パス内で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ファイルを参照してください。

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

    % proc iname=sample.pc
    

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

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

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

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

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

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

パラメータ 説明

user

ユーザー名

pwd

パスワード

user_string

別々のuserエントリとpwdエントリの代替

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

dbname

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

host_variable

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

connect_string

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


tnsnamesまたは簡易接続の使用

Pro*C/C++アプリケーションからTimesTenに接続するには、TimesTenデータベースのTNS名または簡易接続文字列を構成する必要があります。「OCIからTimesTenデータベースへの接続」で説明するtnsnamesまたは簡易接続の手順を実行してください。

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++でのTimesTen Cache用Oracle Databaseパスワードの指定

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データベースへの接続」を参照)。

Pro*C/C++での外部で識別されたユーザーとしての接続

[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;
    

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

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

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

TimesTen Pro*C/C++のその他の機能

この項では、TimesTen Pro*C/C++で使用できるその他の機能について説明します。

TimesTen Pro*C/C++での連想配列バインド

「TimesTen OCIでの連想配列バインド」の説明のとおり、TimesTen PL/SQLでの連想配列(以前の索引付き表またはPL/SQL表)は、INOUTまたは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 Pro*C/C++でのLOB

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データを分割して操作することはできます。)

Pro*C/C++でのLOBの簡易データ・インタフェースの使用

簡易データ・インタフェースでは、その他のスカラー・データ型の操作(EXEC SQL INSERTEXEC 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ロケータ・インタフェースの使用

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++に一時LOBを作成

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); 
Pro*C/C++での永続LOBのロケータへのアクセス

アプリケーションでは通常、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ロケータ・インタフェースを使用したLOBデータの読取りおよび書込み

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 FIRSTLOB 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をオープンすることは、必要となるリソースに関するヒントのようなものです。

OCILobRead()OCILobWrite()または同等の機能によってアクセスされている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++プリコンパイラ・オプション

この項では、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 Databaseデフォルト値の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 Database最適化はサポートされていません。

OUTLNPREFIX

適用なし

両方の値を指定できますが、TimesTenではOracle Database最適化はサポートされていません。

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;