Oracle® TimesTen In-Memory Database

TTClassesガイド

11gリリース2(11.2.2)

B66724-05(原本部品番号:E21640-08)

2015年3月

Oracle TimesTen In-Memory Database TTClassesガイド, 11gリリース2(11.2.2)

B66724-05

Copyright © 2006, 2015, Oracle and/or its affiliates.All rights reserved.

このソフトウェアおよび関連ドキュメントの使用と開示は、ライセンス契約の制約条件に従うものとし、知的財産に関する法律により保護されています。ライセンス契約で明示的に許諾されている場合もしくは法律によって認められている場合を除き、形式、手段に関係なく、いかなる部分も使用、複写、複製、翻訳、放送、修正、ライセンス供与、送信、配布、発表、実行、公開または表示することはできません。このソフトウェアのリバース・エンジニアリング、逆アセンブル、逆コンパイルは互換性のために法律によって規定されている場合を除き、禁止されています。

ここに記載された情報は予告なしに変更される場合があります。誤りが無いことの保証はいたしかねます。誤りを見つけた場合は、オラクル社までご連絡ください。

このソフトウェアまたは関連ドキュメントを、米国政府機関もしくは米国政府機関に代わってこのソフトウェアまたは関連ドキュメントをライセンスされた者に提供する場合は、次の通知が適用されます。

U.S. GOVERNMENT END USERS: Oracle programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, delivered to U.S. Government end users are "commercial computer software" pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations.As such, use, duplication, disclosure, modification, and adaptation of the programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, shall be subject to license terms and license restrictions applicable to the programs.No other rights are granted to the U.S. Government.

このソフトウェアもしくはハードウェアは様々な情報管理アプリケーションでの一般的な使用のために開発されたものです。このソフトウェアもしくはハードウェアは、危険が伴うアプリケーション(人的傷害を発生させる可能性があるアプリケーションを含む)への用途を目的として開発されていません。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用する際、安全に使用するために、適切な安全装置、バックアップ、冗長性(redundancy)、その他の対策を講じることは使用者の責任となります。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用したことに起因して損害が発生しても、オラクル社およびその関連会社は一切の責任を負いかねます。

OracleおよびJavaはOracle Corporationおよびその関連企業の登録商標です。その他の名称は、それぞれの所有者の商標または登録商標です。

Intel、Intel Xeonは、Intel Corporationの商標または登録商標です。すべてのSPARCの商標はライセンスをもとに使用し、SPARC International, Inc.の商標または登録商標です。AMD、Opteron、AMDロゴ、AMD Opteronロゴは、Advanced Micro Devices, Inc.の商標または登録商標です。UNIXは、The Open Groupの登録商標です。

このソフトウェアまたはハードウェア、そしてドキュメントは、第三者のコンテンツ、製品、サービスへのアクセス、あるいはそれらに関する情報を提供することがあります。適用されるお客様とOracle Corporationとの間の契約に別段の定めがある場合を除いて、Oracle Corporationおよびその関連会社は、第三者のコンテンツ、製品、サービスに関して一切の責任を負わず、いかなる保証もいたしません。適用されるお客様とOracle Corporationとの間の契約に定めがある場合を除いて、Oracle Corporationおよびその関連会社は、第三者のコンテンツ、製品、サービスへのアクセスまたは使用によって損失、費用、あるいは損害が発生しても一切の責任を負いかねます。

目次

タイトルおよび著作権情報

はじめに

- 対象読者

- 関連ドキュメント

- 表記規則

- ドキュメントのアクセシビリティについて

新機能

- リリース11.2.2.0.0の新機能

1 TTClasses開発環境

- TTClassesの設定

- UNIXでのTTClassesの設定

- UNIX環境変数の設定

- UNIXでのTTClassesのコンパイル

- UNIXのコンパイル・オプション

- コンパイル後のTTClassesのインストール(UNIXのみ)

- WindowsでのTTClassesの設定

- Windows環境変数の設定

- WindowsでのTTClassesのコンパイル

- Windowsのコンパイル・オプション

- TTClassesコンパイラ・マクロ

- TTEXCEPT: C++例外のスロー

- TTC_USE_STRINGSTREAM、USE_OLD_CPP_STREAMS: C++ I/Oストリームの場合

- TTDEBUG: 追加のデバッグおよびエラー・チェック・ロジックの生成

- TT_64BIT: TTClassesの64-bitのTimesTenでの使用

- プラットフォーム固有のコンパイラ・マクロ

- アプリケーションのコンパイルおよびリンク

- UNIXでのアプリケーションのコンパイルおよびリンク

- Windowsでのアプリケーションのコンパイルおよびリンク

- ODBCドライバ・マネージャ使用時の考慮事項(Windows)

- TimesTen TTClassesデモについて

2 TTClassesについての理解とその使用方法

- TTClassesの概要

- TTCmd、TTConnectionおよびTTConnectionPoolの使用

- アクセス制御に関するTimesTen機能の考慮事項

- TimesTen接続の管理

- DSNの概要

- 接続および切断

- 接続のアクセス制御

- アクセス制御のための接続メソッド・シグネチャ

- アクセス制御のためのCREATE SESSION権限

- XLA接続のためのXLA権限

- TimesTenデータの管理

- パラメータのバインド

- 入力パラメータのバインド

- パラメータの登録

- 出力または入力/出力パラメータのバインド

- 重複パラメータのバインド

- REF CURSORの使用

- ROWIDの使用

- LOBの使用

- TimesTen LOBとOracle Database LOBの違い

- TTClassesでのLOBの簡易データ・インタフェースの使用

- TTClassesでのパススルーLOB

- SQL文の実行に対するタイムアウトまたはしきい値の設定

- TTClassesアプリケーションでの自動クライアント・フェイルオーバーの使用

- TTClassesロギングの使用

- TTClassesのXLAの使用

- トランザクション境界を使用しないXLA更新の確認

- トランザクション境界におけるXLA更新の確認

- アクセス制御がXLAに与える影響

3 クラスの説明

- 一般的に使用されるTTClasses

- TTGlobal

- 使用方法

- パブリック・メンバー

- パブリック・メソッド

- TTStatus

- 使用方法

- サブクラス

- パブリック・メンバー

- パブリック・メソッド

- TTConnection

- 使用方法

- パブリック・メンバー

- パブリック・メソッド

- TTConnectionPool

- 使用方法

- パブリック・メンバー

- パブリック・メソッド

- TTCmd

- 使用方法

- パブリック・メンバー

- 一般的な用途のバッチ以外の操作用のパブリック・メソッド

- TTCmdオブジェクトのプロパティを取得するためのパブリック・メソッド

- バッチ操作のためのパブリック・メソッド

- システム・カタログ・クラス

- TTCatalog

- パブリック・メンバー

- パブリック・メソッド

- TTCatalogTable

- パブリック・メンバー

- パブリック・メソッド

- TTCatalogColumn

- パブリック・メンバー

- パブリック・メソッド

- TTCatalogIndex

- パブリック・メンバー

- パブリック・メソッド

- TTCatalogSpecialColumn

- 使用方法

- パブリック・メンバー

- パブリック・メソッド

- XLAクラス

- TTXlaPersistConnection

- 使用方法

- パブリック・メンバー

- パブリック・メソッド

- TTXlaRowViewer

- 使用方法

- パブリック・メンバー

- パブリック・メソッド

- TTXlaTableHandler

- 使用方法

- パブリック・メンバー

- 保護メンバー

- パブリック・メソッド

- TTXlaTableList

- 使用方法

- パブリック・メンバー

- パブリック・メソッド

- TTXlaTable

- 使用方法

- パブリック・メンバー

- パブリック・メソッド

- TTXlaColumn

- 使用方法

- パブリック・メンバー

- パブリック・メソッド

索引

はじめに

Oracle TimesTen In-Memory Database (TimesTen)は、迅速な応答およびスループット用にメモリーが最適化されたリレーショナル・データベースです。実行時にはデータベース全体がメモリーに常駐し、リカバリおよび再起動できるようにディスク記憶域に保存されます。レプリケーション機能によって、高可用性が実現します。TimesTenでは、OracleインタフェースであるPL/SQL、OCIおよびPro*C/C++に加えて、標準的なアプリケーション・インタフェースであるJDBC、ODBCおよびODP.NETがサポートされます。TimesTenは、単独で使用することもOracle Databaseのキャッシュとして使用することもできます。

また、TimesTenでは、TTClassesライブラリを提供しています。これはC++プログラム用のTimesTenへの使用しやすい高パフォーマンスなインタフェースです。このライブラリでは、ODBCの最も一般的な機能を含めたラッパーが提供されます。

このドキュメントにはTTClassesライブラリの使用方法およびリファレンス情報が記載されています。

この章の構成は、次のとおりです。

- 対象読者

- 関連ドキュメント

- 表記規則

- ドキュメントのアクセシビリティについて

対象読者

このマニュアルは、C++を使用してTimesTenを管理およびアクセスするアプリケーション開発者を対象としています。

ユーザーは、使用する特定のプログラミング・インタフェース以外に、TimesTen、SQL(Structured Query Language)、データベース操作およびODBCに精通している必要があります。

関連ドキュメント

TimesTenのドキュメントは、次の場所のOracle Technology Networkで入手できます。

http://www.oracle.com/technetwork/database/database-technologies/timesten/documentation/index.html

Oracle Databaseドキュメントも、次の場所のOracle Technology Networkで入手できます。これは、OCIやPro*C/C++など、TimesTenでサポートされているが、詳しく説明されていないOracle Databaseの機能で役立ちます。

http://www.oracle.com/pls/db112/homepage

特に、次のOracle Databaseドキュメントが役立ちます。

- 『Oracle Call Interfaceプログラマーズ・ガイド』

- 『Pro*C/C++プログラマーズ・ガイド』

- 『Oracle Databaseグローバリゼーション・サポート・ガイド』

- 『Oracle Database Net Services管理者ガイド』

- 『Oracle Database SQL言語リファレンス』

このマニュアルでは、ODBC APIについて言及することがあります。ODBC APIのリファレンス・ドキュメントは、Microsoft社などの様々なサード・パーティから入手できます。次に例を示します。

http://msdn.microsoft.com/en-us/library/ms714562(VS.85).aspx

TimesTenでは、ODBC 2.5、拡張レベル1と、『Oracle TimesTen In-Memory Database C開発者ガイド』のTimesTen ODBC関数およびオプションに関する説明に示されている拡張レベル2の追加機能がサポートされています。

表記規則

TimesTenは複数のプラットフォームをサポートしています。このマニュアルに記述されている内容は、特に表記しないかぎり、サポートされるすべてのプラットフォームに適用されます。Windowsは、サポートされているすべてのWindowsプラットフォームを表します。UNIXという用語は、サポートされるすべてのUNIXおよびLinuxプラットフォームを表します。TimesTenでサポートされているプラットフォーム・バージョンの詳細は、『Oracle TimesTen In-Memory Databaseリリース・ノート』のプラットフォームに関する説明を参照してください。

注意:
TimesTenドキュメントでは、用語としての「データ・ストア」と「データベース」は同じです。両方の用語は、TimesTenデータベースを指します。

このマニュアルでは次の表記規則を使用します。

規則

意味

イタリック体

イタリックは、ユーザーが特定の値を指定するプレースホルダ変数を示します。

monospace

固定幅フォントは、コード、コマンド、URL、クラス名、関数名、メソッド名、属性名、ディレクトリ名、ファイル名、画面に表示されるテキスト、または入力するテキストを示します。

固定幅フォントのイタリック

固定幅フォントのイタリック体は、置き換える必要があるコード例の変数です。次に例を示します。
Driver=install_dir/lib/libtten.sl

install_dirをご使用のTimesTenインストール・ディレクトリに置き換えます。

[ ]

大カッコは、カッコ内の項目を任意に選択することを表します(大カッコは、入力しないでください)。

{ }

中カッコは、カッコ内の項目のうち、1つが必須であることを表します(中カッコは、入力しないでください)。

|

選択項目の引数を区切る縦線(パイプ)。

. . .

引数の後の水平の省略記号は、1行のコマンドラインで複数の引数を使用できることを表します。

%

%は、UNIXのシェル・プロンプトを表します。

#

#は、UNIXのルート・プロンプトを表します。

TimesTenのマニュアルでは、次の変数を使用して、パス、ファイルおよびユーザー名を表します。

規則

意味

install_dir

TimesTenの現在のリリースがインストールされているディレクトリのパスです。

TTinstance

TimesTenのインストールで指定するインスタンス名です。インストール時に、英数字の一意のインスタンス名でTimesTenの各インストールを識別する必要があります。この名前はインストール・パスに表示されます。

bitsまたはbb

32または64の2桁の数字は、32-bitまたは64-bitのオペレーティング・システムを表します。

releaseまたはrr

リリース番号の最初の3つの部分(ドットが付く場合と付かない場合があります)。リリース番号の最初の3つの部分は、TimesTenのメジャー・リリースを表します。たとえば、1122または11.2.2はTimesTen 11gリリース2(11.2.2)を表します。

DSN

データソースの名前(TimesTenデータベース用)です。

ドキュメントのアクセシビリティについて

Oracleのアクセシビリティについての詳細情報は、Oracle Accessibility ProgramのWebサイト(http://www.oracle.com/pls/topic/lookup?ctx=acc&id=docacc)を参照してください。

Oracle Supportへのアクセス

サポートを購入したOracleのお客様は、My Oracle Supportにアクセスして電子サポートを受けることができます。詳細情報は(http://www.oracle.com/pls/topic/lookup?ctx=acc&id=info)か、聴覚に障害のあるお客様は(http://www.oracle.com/pls/topic/lookup?ctx=acc&id=trs)を参照してください。

新機能

この項では、このマニュアルに記載されているOracle TimesTen In-Memory Database 11gリリース2(11.2.2)の新機能の概要の説明と、詳細情報を参照するためのガイドへのリンクを示します。

リリース11.2.2.0.0の新機能

- LOBサポート
TimesTenではLOB(ラージ・オブジェクト)がサポートされています。これには、CLOB(Character LOB)、NCLOB(各国語LOB)およびBLOB(バイナリLOB)が含まれます。

TTClassesのサポートの詳細は、「LOBの使用」を参照してください。

- 非永続XLAの非推奨
非永続XLAモードの機能は非推奨となり、このマニュアルから削除されています。永続XLAのみにユーティリティおよびAPIを使用してください。

1 TTClasses開発環境

この章では、TTClasses開発環境の使用を開始する際に役立つ情報を示します。

TTClassesは、TimesTenのインストール時にコンパイルおよび事前構成されます。TTClassesがコンパイルされたものとは別のC++ランタイムを使用する場合は、make(UNIX)またはnmake(Microsoft Windows)ユーティリティを使用してライブラリを再コンパイルする必要があります。

ここでは、TTClasses自体の環境変数とコンパイルについての説明、およびTTClassesアプリケーションのコンパイルとリンクに関する情報を示し、TTClassesのクイック・スタート・デモ・アプリケーションを紹介します。この付録は、次の項で構成されています。

- TTClassesの設定

- アプリケーションのコンパイルおよびリンク

- TimesTen TTClassesデモについて

TTClassesの設定

この項では、TTClassesの設定方法について、次の内容で説明します。

- UNIXでのTTClassesの設定

- WindowsでのTTClassesの設定

- TTClassesコンパイラ・マクロ

UNIXでのTTClassesの設定

この項では、UNIX環境でTTClassesを設定する方法を、次の内容で説明します。

- UNIX環境変数の設定

- UNIXでのTTClassesのコンパイル

- UNIXのコンパイル・オプション

- コンパイル後のTTClassesのインストール(UNIXのみ)

UNIX環境変数の設定

TTClassesを使用するには、シェル環境変数がinstall_dir/binディレクトリの適切なttenvスクリプト、つまりUNIXプラットフォームの場合ttenv.shまたはttenv.cshのいずれか(シェルに応じていずれかを使用)で正しく設定されていることを確認します。詳細は、『Oracle TimesTen In-Memory Databaseインストレーション・ガイド』の環境変数に関する説明を参照してください。

これを直接実行するかわりに、必要なスクリプトの行をログイン初期化スクリプト(例: .profileまたは.cshrc)に追加することができます。

UNIXでのTTClassesのコンパイル

アプリケーションのリンクで問題が発生する場合は、TTClassesのコンパイルに使用したものとは別のC++ランタイムを使用したことが原因である可能性があるため、ライブラリをmakeユーティリティで再コンパイルします。

TTClassesを再コンパイルする場合は、ttclassesディレクトリに移動します(ここでinstall_dirは、TimesTenのインストール・ディレクトリです)。

$ cd install_dir/ttclasses

最初からコンパイルしなおすには、make cleanを実行します。

$ make clean

直接接続の場合にTTClassesを再コンパイルするには、次のようにします。

$ make

クライアント/サーバー接続の場合にTTClassesを再コンパイルするには、MakefileCS Makeファイルを使用します。

$ make -f MakefileCS

UNIXのコンパイル・オプション

UNIX環境でTTClassesをコンパイルする際に、次のmakeターゲット・オプションを利用できます。

- all: 共有最適化済ライブラリ(複数可)をビルドします(デフォルト)。これは、直接接続の場合はMakefileと、クライアント/サーバー接続の場合はMakefileCSと使用します。

- shared_opt: 共有最適化済ライブラリをビルドします。現在、これはallと同じ結果になります。

- shared_debug: 共有デバッグ・ライブラリをビルドします。

- static_opt : 静的最適化済ライブラリをビルドします。

- static_debug: 静的デバッグ・ライブラリをビルドします。

- opt: 最適化済ライブラリ(共有および静的)をビルドします。

- debug: デバッグ・ライブラリ(共有および静的)をビルドします。

- clean: TTClassesライブラリおよびオブジェクト・ファイルを削除します。

makeターゲットを指定するには、コマンドラインでmakeターゲット名を使用します。

たとえば、TTClassesの共有デバッグ・バージョンをビルドするには、次を実行します。

$ make clean shared_debug

コンパイル後のTTClassesのインストール(UNIXのみ)

コンパイルの後、TimesTenインスタンスの全ユーザーがTTClassesを使用できるようにするために、ライブラリをインストールします。UNIXシステムにTTClassesライブラリをインストールする手順は次のとおりです。

$ cd install_dir/ttclasses
$ make install

WindowsでのTTClassesの設定

この項では、Windows環境にTTClassesを設定する方法について、次の内容で説明します。

- Windows環境変数の設定

- WindowsでのTTClassesのコンパイル

- Windowsのコンパイル・オプション

注意:
Windowsでは、TTClassesライブラリはコンパイル後、自動的にインストールされます。

Windows環境変数の設定

再コンパイルの前に、PATH、INCLUDEおよびLIB環境変数が正しいVisual Studioのディレクトリをポイントしていることを確認します。これには、適切なVisual Studio C++バッチ・ファイル(たとえば、VCVARS32.BATまたはVSVARS32.BAT)を実行します。

その後、次を実行してTimesTenの環境変数を設定します(インストール時に設定されていない場合)。

install_dir\bin\ttenv.bat

WindowsでのTTClassesのコンパイル

アプリケーションのリンクで問題が発生する場合は、TTClassesのコンパイルに使用したものとは別のC++ランタイムを使用したことが原因である可能性があるため、ライブラリをnmakeユーティリティで再コンパイルします。

TTClassesを再コンパイルする場合は、ttclassesディレクトリに移動します(ここでinstall_dirは、TimesTenのインストール・ディレクトリです)。

install_dir\ttclasses

最初からコンパイルしなおすには、nmake cleanを実行します。

install_dir\ttclasses> nmake clean

その後、再コンパイルします。デフォルトで、これは直接接続およびクライアント/サーバー接続の両方で使用できます。

install_dir\ttclasses> nmake

Windowsのコンパイル・オプション

Windows環境でTTClassesをコンパイルする際に、次のmakeターゲット・オプションを利用できます。

- all: 直接接続およびクライアント/サーバー接続用に最適化済共有ライブラリをビルドします(デフォルト)。

- client: クライアント/サーバー用のみに最適化済共有ライブラリをビルドします。

- msdm: Microsoftドライバ・マネージャ用に共有最適化済ライブラリをビルドします。

- clean: TTClassesライブラリおよびオブジェクト・ファイルを削除します。

makeターゲットを指定するには、コマンドラインでmakeターゲット名を使用します。

たとえば、クライアント/サーバーのTTClassesライブラリのみをビルドするには、次を実行します。

install_dir\ttclasses> nmake clean client

TTClassesコンパイラ・マクロ

必要に応じて、TTClassesのMakeファイルを手動で変更して、TTClassesコンパイラ・マクロにフラグを追加できます。UNIXの場合、-Dflagnameを追加します。Windowsの場合、/Dflagnameを追加します。

この項では、次のコンパイラ・マクロについて説明します。

- TTEXCEPT: C++例外のスロー

- TTC_USE_STRINGSTREAM、USE_OLD_CPP_STREAMS: C++ I/Oストリームの場合

- TTDEBUG: 追加のデバッグおよびエラー・チェック・ロジックの生成

- TT_64BIT: TTClassesの64-bitのTimesTenでの使用

- プラットフォーム固有のコンパイラ・マクロ

TTEXCEPT: C++例外のスロー

TTClassesでにC++例外がスローさせるようにするには、-DTTEXCEPTフラグを使用してTTClassesとアプリケーションをコンパイルします。(TTClassesはデフォルトでこの方法でコンパイルされます。)すべてのTTClasses関数コールの前後に{try/catch}ブロックを配置し、TTStatus型の例外を捕捉します。

または、推奨されませんが、TTClassesとアプリケーションをTTEXCEPTを無効にしてコンパイルする操作モードもあります。このモードでは、以前のTimesTenリリースの場合のように、明示的なTTStatus&パラメータを使用した古いメソッド・バージョンを使用してエラーが処理されます。

「TTStatus」を参照してください。

TTC_USE_STRINGSTREAM、USE_OLD_CPP_STREAMS: C++ I/Oストリームの場合

C++ストリームには複数のタイプがあり、それぞれに互換性はありません。TimesTenは2つの関連フラグを提供します。アプリケーションで使用するストリームに応じて、設定するフラグが決まったり、またはいずれのフラグも設定しないかどうかが決まります(次に、新しいストリーム型から古い型の順に示します)。

- <iostream>を含め、ostringstreamクラスを使用するストリームの場合、TTC_USE_STRINGSTREAMフラグを設定します。

- <iostream>を含め、ostrstreamクラスを使用するストリームの場合、いずれのフラグも設定しません。これは、ほとんどのプラットフォームおよびコンパイラのデフォルトです。

- <iostream.h>を含め、ostrstreamクラスを使用するストリームの場合、USE_OLD_CPP_STREAMSフラグを設定します。これは、一部の古いプラットフォームおよびコンパイラのデフォルトです。

TTClasses Makeファイルを確認します。フラグが適切に設定されていない場合、Makeファイルを適切に更新して、TTClassesを再コンパイルした後、以前のTTClassesライブラリ・ファイルを再コンパイルしたものに置き換えます。

以降の項も参照してください。

TTC_USE_STRINGSTREAM: ostringstreamを使用するC++ I/Oストリーム・コードの場合

このコンパイラ・フラグは、ostringstreamクラスを使用しC++ストリーム・タイプを確実にサポートするC++コンパイラで使用するためのものです。プログラムでC++ストリーム・コードを使用し、<iostream>を含め、ostringstreamクラスを使用する場合、TTClassesは-DTTC_USE_STRINGSTREAMも設定してコンパイルする必要があります。

その場合、USE_OLD_CPP_STREAMSフラグは設定しないことも注意します。

注意:
バージョン3.2以上のgccでは、デフォルトでTTC_USE_STRINGSTREAMフラグがinstall_dir/include/ttclasses/TTIostream.hに設定されています。

いずれも使用しない: ostrstreamを使用するC++ I/Oストリーム・コードの場合

プログラムでC++ストリーム・コードを使用し、<iostream>を含め、ostrstreamクラスを使用する場合、TTC_USE_STRINGSTREAMフラグもUSE_OLD_CPP_STREAMSも設定しないでください。

USE_OLD_CPP_STREAMS: ostrstreamを使用する古いC++ I/Oストリーム・コード

このコンパイラ・フラグは、<iostream>をサポートしない、古いC++コンパイラのためのものです。プログラムで古いC++ストリーム・コードを使用し、<iostream.h>を含め、ostrstreamクラスを使用する場合、TTClassesは-DUSE_OLD_CPP_STREAMSも設定してコンパイルする必要があります。

その場合、TTC_USE_STRINGSTREAMフラグは設定しないでください。

TTDEBUG: 追加のデバッグおよびエラー・チェック・ロジックの生成

追加のデバッグ情報を生成するには、-DTTDEBUGを使用してTTClassesをコンパイルします。この追加情報はパフォーマンスを多少低下させるため、このフラグは(本番ではなく)開発システムでのみ使用してください。

TT_64BIT: TTClassesの64-bitのTimesTenでの使用

64-bitのTimesTenアプリケーションを作成する場合は、-DTT_64BITを使用してTTClassesをコンパイルします。

プラットフォーム固有のコンパイラ・マクロ

次のコンパイラ・マクロは、プラットフォームまたはコンパイラの特定の組合せに固有のものです。これらのコンパイラ・マクロを手動で指定する必要はありません。これらが使用されるかどうかは、configureプログラムで選択されたMakeファイルによって決定されます。

- gcc: 任意のプラットフォームでgccを使用する場合、-DGCCフラグを使用してTTClassesをコンパイルします。

アプリケーションのコンパイルおよびリンク

ここでは、UNIXおよびWindowsでTTClassesアプリケーションをコンパイルおよびリンクする方法について説明します(WindowsでODBCドライバ・マネージャを使用する場合の考慮事項に関する項もあります)。

また、関連情報については『Oracle TimesTen In-Memory Database C開発者ガイド』の次の項を参照してください。

- ダイレクト・ドライバとクライアント・ドライバの使用の対比、Windows上でドライバ・マネージャを使用するかどうかなど、TimesTenのリンク・オプションに関する一般情報については、リンク・オプションに関する説明

- アプリケーションのコンパイルおよびリンクに関する説明

UNIXでのアプリケーションのコンパイルおよびリンク

アプリケーションをコンパイルする場合、install_dir/include/ttclassesディレクトリにあるTTClassesヘッダー・ファイルを含めます。これは、このディレクトリのTTInclude.hを、次のように含めるだけで実行できます。

次のコンパイル・コマンドを使用します。

-Iinstall_dir/include

コードで、次の行を使用します。

#include <ttclasses/TTInclude.h>

TTClasses XLAプログラムには、次も含める必要があります。

#include <ttclasses/TTXla.h>

次の表に、UNIXプラットフォームでアプリケーションのリンクに使用できるTTClassesライブラリをリストします。

使用方法

ライブラリ

TimesTen直接接続

libttclasses.so

TimesTenクライアント/サーバー接続

libttclassesCS.so

たとえば、次をリンク・コマンドに追加すると、クライアント・ドライバが使用されます。

-Linstall_dir/lib -lttclassesCS

-Lオプションを指定すると、リンカーでライブラリ・ファイル用のTimesTen libディレクトリが検索されます。-lttclassesCSオプションを指定すると、ドライバでリンクが行われます。

Solarisでは、デフォルトのTimesTen ODBCクライアント・ドライバは、Studio 11を使用してコンパイルされています。このライブラリによって、Sun Studio 11 C/C++コンパイラでコンパイルされたアプリケーションをTimesTen Clientに直接リンクできます。

AIXでは、アプリケーションとTimesTen ODBCクライアント・ドライバをリンクする場合、リンク・コマンドには、クライアント・ドライバの後に、C++ランタイム・ライブラリを含める必要があります(クライアント・ドライバはC++で記述されており、AIXでは自動的にはリンクされないため)。

-Linstall_dir/lib -lttclassesCS -lC_r

quickstart/sample_code/ttclassesディレクトリのMakeファイルを使用すると、独自のMakeファイルを作成できます。

Windowsでのアプリケーションのコンパイルおよびリンク

アプリケーションをコンパイルする場合、install_dir\include\ttclassesディレクトリにあるTTClassesヘッダー・ファイルを含めます。これは、このディレクトリのTTInclude.hを、次のように含めるだけで実行できます。

次のコンパイル・コマンドを使用します。

/Iinstall_dir\include

コードで、次の行を使用します。

#include <ttclasses/TTInclude.h>

TTClasses XLAプログラムには、次も含める必要があります。

#include <ttclasses/TTXla.h>

次の表に、Windowsプラットフォームでアプリケーションのリンクに使用できるTTClassesライブラリをリストします。

使用方法

ライブラリ

TimesTen直接接続

ttclasses1122.lib

TimesTenクライアント/サーバー接続

ttclasses1122CS.lib

Microsoft ODBCドライバ・マネージャ

ttclasses1122DM.lib
次の「ODBCドライバ・マネージャ使用時の考慮事項(Windows)」の項を参照してください。

リンク・コマンドに、install_dir\lib\ttclasses1122.libなどの適切なライブラリを追加します。

quickstart\sample_code\ttclassesディレクトリのMakeファイルを使用すると、独自のMakeファイルを作成できます。

ODBCドライバ・マネージャ使用時の考慮事項(Windows)

WindowsでODBCドライバ・マネージャを使用する場合、TTClassesには次の制限があることに注意してください。(これらの制限は、TimesTenクイック・スタートで提供されているデモのttdmドライバ・マネージャには適用されません。)

- XLA機能はサポートされません。

- REF CURSOR機能はサポートされません。

- このドライバ・マネージャでは、ODBCの標準ではないLOBロケータAPIまたはLOBデータ型はサポートしていません。ただし、ユーザーは「LOBの使用」で説明するとおり、LOBの簡易データ・インタフェースは使用できます。

また、ドライバ・マネージャは、TimesTenで使用する場合、SQL_C_BIGINTおよびSQL_C_TINYINTのODBC Cデータ型もサポートしていません。ドライバ・マネージャを使用する場合、シグネチャでこれらのデータ型のいずれかを使用するメソッドをコールすることはできません(たとえば、TTCmdのgetColumn()、getColumnNullable()、getNextColumn()、getNextColumnNullable()、setParam()、getParam()またはBindParameter()の各メソッドの適用可能なオーバーロード・バージョンなどです)。

注意:
TimesTenでは、WindowsとUNIX両方用のドライバ・マネージャを用意しており、クイック・スタート・サンプル・アプリケーションが付属しています。このドライバ・マネージャは完全にはサポートされていません。TimesTenのダイレクト・ドライバおよびクライアント・ドライバのみのサポートに限定されています。前述の機能またはパフォーマンスの制限はありません。直接接続およびクライアント/サーバー接続の両方を同時に使用する必要のあるアプリケーションでは、パフォーマンスにあまり影響を与えず、このドライバ・マネージャを使用してこれを実現できます。

TimesTen TTClassesデモについて

C++環境を構成した後、TimesTenクイック・スタート・デモ・アプリケーションをコンパイルおよび実行することで、すべてが適切に設定されたことを確認できます。クイック・スタートのようこそページ(install_dir/quickstart.html)の「SAMPLE PROGRAMS」の下にあるリンクで、次の事項の説明を参照してください。

- デモ・スキーマおよび設定: build_sampledbスクリプト(UNIXでは.shまたはWindowsでは.bat)は、サンプル・データベースおよびデモ・スキーマを作成します。デモの使用を開始する前に、これを使用する必要があります。

- デモ環境および設定: ttquickstartenvスクリプト(UNIXでは.shまたは.csh、Windowsでは.bat)(通常、TimesTenの設定に使用するttenvスクリプトのスーパーセット)によって、デモ環境を設定します。いずれかのデモをコンパイルおよび実行するセッションに入るたびに、これを使用する必要があります。

- デモおよび設定: install_dir/quickstart/sample_codeディレクトリの下にあるサブディレクトリには、TTClassesおよびXLA用のデモが提供されています。デモのコンパイルおよび実行方法については、サブディレクトリにあるREADMEファイルを参照してください。

- デモの実行内容: 「SAMPLE PROGRAMS」の下の「TTClasses(C++)」をクリックすると、各デモの概要を参照できます。

2 TTClassesについての理解とその使用方法

この章では、TTClassesの概要とベスト・プラクティスについて説明します。内容は次のとおりです。

- TTClassesの概要

- TTCmd、TTConnectionおよびTTConnectionPoolの使用

- アクセス制御に関するTimesTen機能の考慮事項

- TimesTen接続の管理

- TimesTenデータの管理

- TTClassesロギングの使用

- TTClassesのXLAの使用

TTClassesの概要

TimesTen C++ Interface Classesライブラリ(TTClasses)は、データベースへのアクセスに使用する最も一般的なODBC機能のラッパーを提供します。これは、ODBCよりも使用しやすく、パフォーマンスも低下させないAPIに対する需要に応えるために開発されました。

ODBCの詳細は、ODBC APIのリファレンス・マニュアルを参照してください。TimesTenでは、ODBC 2.5、拡張レベル1と、『Oracle TimesTen In-Memory Database C開発者ガイド』のTimesTen ODBC関数およびオプションに関する説明に示されている拡張レベル2の追加機能がサポートされています。

TTClassesは、TimesTenのODBCインタフェースにC++インタフェースを提供するだけでなく、TimesTenのトランザクション・ログAPI(XLA)へのインタフェースも提供します。XLAではデータベース内の1つ以上の表を監視できます。その表が他のアプリケーションによって変更されると、その変更がXLAを介して監視アプリケーションに通知されます。XLA機能が最も一般的に使用される局面に対して、TTClassesは便利なインタフェースを提供します。XLAの一般的な情報については、『Oracle TimesTen In-Memory Database C開発者ガイド』のXLAおよびTimesTenのイベント管理に関する説明を参照してください。

TTClassesは、TimesTen Data Managerを使用するアプリケーション・ソフトウェアを作成する際のベスト・プラクティスの推進も目的としています。このライブラリは、TimesTenを最適な方法で使用します。たとえば、自動コミットはデフォルトでは無効化されています。パラメータ化されたSQLが推奨されており、TTClassesでのその使用方法は、手動でコーディングされたODBCよりはるかに簡単になっています。

TTCmd、TTConnectionおよびTTConnectionPoolの使用

TTClassesは様々な方法で使用可能ですが、次の一般的な方法は成功実績があり、様々なアプリケーションで簡単に適用できます。

リアルタイム・アプリケーションでは、最適なパフォーマンスを得るために、準備済のSQL文を使用する必要があります。アプリケーションで使用されるすべてのSQL文について、文ごとに個別のTTCmdオブジェクトを使用して、アプリケーションの開始時に準備するのが理想的です。ODBCでは(したがってTTClassesでも)、文が特定の接続にバインドされるため、アプリケーションで使用される文の完全なセットが、データベースとのすべての接続に関連付けられるということがよく起こります。

これを実現する簡単な方法は、TTConnectionから導出されるアプリケーション固有のクラスを開発することです。たとえば、XYZという名前のアプリケーションには、XYZConnectionというクラスを作成できます。XYZConnectionクラスには、アプリケーションで使用する準備済のSQL文を表すプライベートTTCmdメンバーを含め、これでは、これらのプライベートTTCmdメンバーを介してアプリケーション固有のデータベース機能を実装する新しいパブリック・メソッドを提供します。

TTCmdオブジェクトは、使用前にSQL文(SELECT、INSERT、UPDATEまたはDELETE)と関連付ける必要があります。関連付けはPrepare()メソッドを使用して行います。これによってSQL文がコンパイルおよび最適化され、SQL文が効率的に実行されるようになります。Prepare()メソッドは文を準備するだけで、文を実行しない点に注意してください。

通常、TimesTenでは、性能の向上のために文はパラメータ化されます。次のようなSQL文を考えてみます。

SELECT col1 FROM table1 WHERE C = 10;
SELECT col1 FROM table1 WHERE C = 11;

これよりも、パラメータ化された1つの文を準備し、それを複数回実行した方がより効率的です。

SELECT col1 FROM table1 WHERE C = ?;

「?」の値は、TTCmd::setParam()メソッドを使用して実行時に指定します。

ODBCを直接使用する場合と違い、列またはパラメータを明示的にSQL文にバインドする必要はありません。TTCmdは、準備する際にすべての必要な列を自動的に定義しバインドします。パラメータは実行時にバインドされます。

準備は比較的負荷の高い操作であることに注意してください。アプリケーションは、(TTConnection::Connect()を使用して)TimesTenへの接続を確立する際に、その接続に関連付けられたすべてのTTCmdオブジェクトを準備する必要があります。アプリケーションのこのメイン実行ループの前に、すべてのSQL文を準備してください。

通常の操作の場合(TTEXCEPTフラグを使用してTTClassesおよびアプリケーションがコンパイルされる)、この操作中にエラーまたは警告が発生すると、TTStatusオブジェクトがスローされます。通常、TTClassesメソッドでエラーまたは警告が発生すると、この方法で例外がスローされます(アプリケーションはそれを適切に取得して処理する必要があります)。詳細は、「TTEXCEPT: C++例外のスロー」と「TTStatus」を参照してください。TTClassesのクイック・スタート・デモ・アプリケーションでも、これの処理例を確認できます。(「TimesTen TTClassesデモについて」を参照してください。)

注意:
必要な特定のgetまたはsetメソッドがTTConnectionまたはTTCmdにない場合は、TTConnection::getHdbc()およびTTCmd::getHandle()メソッドを使用して、基礎となるODBC接続ハンドルおよび文ハンドルに直接アクセスできます。同様に、ODBC環境ハンドルにはTTGlobal::sqlhenv()メソッドでアクセスします。

例2-1 接続クラスの定義

TTConnectionから継承されるクラスの例を次に示します。

class XYZConnection : public TTConnection {
private:
TTCmd updateData;
TTCmd insertData;
TTCmd queryData;

public:
XYZConnection();
~XYZConnection();
virtual void Connect (const char* connStr, const char* user, const char* pwd);
void updateUser ();
void addUser (char* nameP);
void queryUser (const char* nameP, int* valueP);
};

この例では、XYZConnectionオブジェクトがTimesTenへの接続であり、アプリケーション固有の3つの操作(addUser()、updateUser()およびqueryUser())の実行に使用できるようになっています。これらの操作はXYZアプリケーションに固有です。これらの3つのメソッドの実装では、アプリケーションのデータベース操作を実装するために、updateData、insertDataおよびqueryData TTCmdオブジェクトを使用できます。

アプリケーションのSQL文を準備するために、XYZConnectionクラスは、TTConnection基本クラスから提供されるConnect()メソッドをオーバーロードします。XYZConnection::Connect()メソッドは、データベース接続を確立するために、基本クラスのConnect()メソッドをコールし、さらに、TTCmdオブジェクトごとにPrepare()メソッドもコールして、後で使用するSQL文を準備します。

例2-2 Connect()メソッドの定義

次に、XYZConnection::Connect()メソッドの実装例を示します。

void
XYZConnection::Connect(const char* connStr, const char* user, const char* pwd)
{
try {
TTConnection::Connect(connStr, user, pwd);
updateData.Prepare(this, "update mydata v set foo = ? where bar = ?");
insertData.Prepare(this, "insert into mydata values(?,0)");
queryData.Prepare(this, "select i from mydata where name = ?");
}
catch (TTStatus st) {
cerr << "Error in XYZConnection::Connect: " << st << endl;
}
return;
}

このConnect()メソッドにより、XYZConnectionオブジェクトとそのアプリケーション固有のメソッドが完全に動作可能になります。

この方法は、TTConnectionPoolクラスの設計でも非常に有効です。アプリケーションは、XYZConnection型のオブジェクトを多数作成し、それらをTTConnectionPoolオブジェクトに追加できます。TTConnectionPool::ConnectAll()がコールされると、アプリケーションはプール内のデータベースへのすべての接続を接続し、すべてのSQL文を準備します。切断するには、TTConnectionPool::DisconnectAll()を使用します。「TTConnectionPool」の使用方法の説明を参照してください(重要な情報があります)。

このアプリケーションの設計により、データベースへのアクセスがアプリケーションのビジネス・ロジックから簡単に分離できます。XYZConnectionクラスのみに、データベース固有のコードが含まれるようになります。

このアプリケーション設計の例は、TimesTenクイック・スタートに付属のいくつかのTTClassesのサンプル・プログラムで確認できます。「TimesTen TTClassesデモについて」を参照してください。

他の構成が可能なことに注意してください。アプリケーションで使用されるSQL文が、アプリケーション自体にハードコードされるのではなく、データベース内の表にリストされるよう、このスキームをさらに拡張したユーザーもいます。このようにすれば、アプリケーションの変更ではなくデータベースの変更によって、データベースの機能の変更を実装できます。

例2-3 Disconnect()メソッドの定義

次に、XYZConnection::Disconnect()メソッドの実装例を示します。

void
XYZConnection::Disconnect()
{
updateData.Drop();
insertData.Drop();
queryData.Drop();

TTConnection::Disconnect();
}

アクセス制御に関するTimesTen機能の考慮事項

TimesTenには、表、ビュー、マテリアライズド・ビュー、順序およびシノニムなどのデータベース・オブジェクトについて、オブジェクトレベルの解決法でデータベース・アクセスを制御する機能が含まれています。これらの機能の概要は、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』のアクセス制御の管理に関する説明を参照してください。『Oracle TimesTen In-Memory Database C開発者ガイド』のアクセス制御のためのTimesTen機能の検討に関する説明も参照してください。

このマニュアルで説明されている、または例で使用されている問合せ、SQL DML文またはSQL DDL文では、ユーザーは、その文を実行するための適切な権限を持っていることを前提としています。たとえば、表に対するSELECT文では、その表の所有権、その表に関して付与されているSELECT権限またはSELECT ANY TABLEシステム権限が必要です。

特定のSQL文に必要な権限については、『Oracle TimesTen In-Memory Database SQLリファレンス・ガイド』のSQL文に関する説明を参照してください。

権限は、SQLのGRANT文で付与され、SQLのREVOKE文で取り消されます。一部の権限は、各ユーザーがメンバーであるPUBLICロールを介して、すべてのユーザーに付与されます。このロールの詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス・ガイド』のPUBLICロールに関する項を参照してください。

これ以外にもアクセス制御は、データベースへの接続(「接続のアクセス制御」を参照)、接続属性の設定、XLAの使用(「アクセス制御がXLAに与える影響」を参照)、およびCユーティリティ関数の実行に影響します。

注意:

- アクセス制御は無効にできません。

- アクセス制御の権限は、データベースでSQLが準備されるときと実行されるときの両方で確認され、パフォーマンス・コストの大部分は準備時に発生します。

TimesTen接続の管理

この項では、データベースへの接続について、次の内容で説明します。

- DSNの概要

- 接続および切断

- 接続のアクセス制御

DSNの概要

『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』では、データベースのDSN(データソース名)の作成について説明しています。作成するDSNのタイプは、アプリケーションがデータベースに直接接続するか、クライアント接続するかによって異なります。

データベースに直接接続する場合は、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』のTimesTenデータベースの管理に関する説明を参照してください。UNIXまたはWindowsから直接接続するためのDSNの作成方法に関する説明があります。

データベースへのクライアント接続を作成する場合は、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』のTimesTen ClientおよびTimesTen Serverの使用方法に関する説明を参照してください。UNIXまたはWindowsからクライアント/サーバー接続を行うためのDSNの作成方法に関する説明があります。

注意:
TimesTen接続は、親プロセスから継承できません。子プロセスの作成前に(分岐)プロセスでデータベース接続が開かれた場合、子ではその接続を使用しないようにする必要があります。

接続および切断

「TTCmd、TTConnectionおよびTTConnectionPoolの使用」で説明しているXYZConnectionクラスを使用すると、次の例のようにTimesTenに対して切断および接続できます。

例2-4 TimesTenに対する接続および切断

...

XYZConnection conn;
char connStr[256];
char user[30];
char pwd[30];

...

try {
conn.Connect(connStr, user, pwd);
}
catch (TTWarning st) {
cerr << "Warning connecting to TimesTen: " << st << endl;
}
catch (TTError st) {
cerr << "Error connecting to TimesTen " << st << endl;
exit(1);
}

// ... Work with the database connection...

try {
conn.Disconnect();
}
catch (TTStatus st) {
cerr << "Error disconnecting from TimesTen: " << st << endl;
exit(1);
}

接続のアクセス制御

この項では、TTClassesを使用しデータベースに接続する方法に関連する、アクセス制御機能について説明します。

一般的なアクセス制御の概要については、「アクセス制御のためのTimesTen機能の検討」を参照してください。

アクセス制御のための接続メソッド・シグネチャ

TTConnection、TTConnectionPoolおよびTTXlaPersistConnectionクラスには、次のメソッド・シグネチャが定義されています。

virtual void
TTConnection::Connect(const char* connStr)

virtual void
TTConnection::Connect(const char* connStr, const char* username,
const char* password)

virtual void
TTConnection::Connect(const char* connStr,
DRIVER_COMPLETION_ENUM driverCompletion)

void
TTConnectionPool::ConnectAll(const char* connStr)

void
TTConnectionPool::ConnectAll(const char* connStr, const char* username,
const char* password)

virtual void
TTXlaPersistConnection::Connect(const char* connStr, const char* username,
const char* password, const char* bookmarkStr,
bool createBookmarkFlag)

virtual void
TTXlaPersistConnection::Connect(const char* connStr,
DRIVER_COMPLETION_ENUM driverCompletion,
const char * bookmarkStr, bool createBookmarkFlag)

virtual void
TTXlaPersistConnection::Connect(const char* connStr, const char* username,
const char* password, const char* bookmarkStr)

virtual void
TTXlaPersistConnection::Connect(const char* connStr,
DRIVER_COMPLETION_ENUM driverCompletion,
const char * bookmarkStr)

注意:

- 接続文字列(connStr値)では、DSN=testdb;uid=brian;pwd=welcomeのようにユーザー名とパスワードを指定できます。接続文字列、ユーザー名およびパスワードを引数として取るシグネチャについては、そのユーザー名とパスワード引数は接続文字列で指定されたユーザー名またはパスワードよりも優先されることに注意してください。

- DRIVER_COMPLETION_ENUM値の詳細は、「TTConnection」を参照してください。

アクセス制御のためのCREATE SESSION権限

データベースに接続するための権限は、CREATE SESSION権限を使用して、インスタンス管理者以外のすべてのユーザーに明示的に付与する必要があります。これはシステム権限です。この権限は、直接またはPUBLICロールを使用して、管理者がユーザーに付与する必要があります。例および詳細は、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』のアクセス制御の管理に関する説明を参照してください。

XLA接続のためのXLA権限

CREATE SESSION権限の他に、ユーザーにはXLA接続を作成し、XLA機能を実行するためのXLA権限を付与する必要があります(「アクセス制御がXLAに与える影響」を参照)。

TimesTenデータの管理

この項では、データの操作に関して、次の内容で説明します。

- パラメータのバインド

- REF CURSORの使用

- ROWIDの使用

- LOBの使用

- SQL文の実行に対するタイムアウトまたはしきい値の設定

パラメータのバインド

この項では、SQL文のパラメータのバインドについて説明します。TTCmdクラスには、パラメータをバインドするメソッドsetParam()とBindParameter()(バッチ操作用)が用意されています。また、出力および入力/出力パラメータをサポートするため、またはデフォルトのバインド・タイプを上書きするためのregisterParam()も用意されています。パラメータが重複する場合は、TimesTenモードまたはOracleモードを判断するために、DuplicateBindMode TimesTen接続属性をサポートする機能も用意されています。

注意:
TimesTenのバインド・メカニズム(アーリー・バインディング)はOracle Databaseのバインド・メカニズム(レイト・バインディング)とは異なります。TimesTenは、問合せの準備の前にデータ型を必要とします。そのため、各バインド・パラメータのデータ型が指定されていないかSQL文から推測できないと、エラーが発生します。たとえば次のような文が、これに該当します。

SELECT 'x' FROM DUAL WHERE ? = ?;

この問題には、たとえば次のように対処できます。

SELECT 'x' from DUAL WHERE CAST(? as VARCHAR2(10)) =
CAST(? as VARCHAR2(10));

内容は、次のとおりです。

- 入力パラメータのバインド

- パラメータの登録

- 出力または入力/出力パラメータのバインド

- 重複パラメータのバインド

注意:
TimesTen開発者ガイドで使用される「バインド・パラメータ」という用語(ODBC用語に準拠)は、TimesTenのPL/SQLのマニュアルで使用される「バインド変数」という用語(Oracle Database PL/SQL用語に準拠)と同じです。

入力パラメータのバインド

バッチ以外の操作では、TTCmd::setParam()メソッドを使用しSQL文の入力パラメータをバインドします(パラメータの位置とバインドする値を指定します)。バッチ操作では、TTCmd::BindParameter()メソッドを使用します。(バッチ操作の使用例については、例3-5「ExecuteBatch()メソッドの使用方法」を参照してください。)

バッチ以外の操作については、例2-5で、表に行を挿入するためにパラメータをバインドするクラスSampleConnectionのスニペットを示しています。(この例は、TimesTenクイック・スタート・デモのbasics.cppから引用されています。「TimesTen TTClassesデモについて」を参照してください。)この例ではConnect()メソッドの実装については省略されているため、Connect()の実装については例2-2を参照してください。

次のように定義される表basicsがあるとします。

create table basics (name char(10) not null primary key, i tt_integer);

例2-5 行を挿入するためのパラメータのバインド(バッチ以外の場合)

class SampleConnection : public TTConnection
{
using TTConnection::Connect;

private:
TTCmd        insertData;
...

protected:

public:
SampleConnection();
~SampleConnection();
virtual void Connect(const char* connStr,
DRIVER_COMPLETION_ENUM driverCompletion);
void insert(char* nameP);
...

...
// Assume a Connect() method implemented with the following:
// insertData.Prepare(this, "insert into basics values(:name, :value)");
...
}

//----------------------------------------------------------------------

void
SampleConnection::insert(char* nameP)
{
static long i = 0;
insertData.setParam(1, nameP);
insertData.setParam(2, i++);
insertData.Execute();
}

//----------------------------------------------------------------------

...

int
main(int argc, char** argv)
{
...
char name[10];
SampleConnection conn;
...

// Assume conn is an open connection.
sprintf(name, "Robert");
try {
conn.insert(name);
}
catch (TTStatus st) {
cerr << "Error inserting row " << name << ":" << st << endl;
conn.Rollback();
}
}

パラメータの登録

TTCmdクラスには、SQLデータ型、精度、パラメータのスケール(該当する場合)およびパラメータが入力、出力または入力/出力であるかどうかを指定できるメソッドregisterParam()が用意されています。registerParam()コールは、出力または入力/出力パラメータに関して必要です(REF CURSOR(出力のみ)、あるいはPL/SQL RETURNING INTO句(出力のみ)、プロシージャまたは関数からのパラメータが考えられます)。

入力パラメータについては、TTClassesは、デフォルトでsetParam()またはBindParameter()コールに対して、表2-1のマッピングに従って、バインドされたCデータ型からSQLデータ型を導出します。通常、入力パラメータにregisterParam()コールは不要ですが、特定のSQLデータ型、精度またはスケールを使用する必要がある場合は、コールすることが可能です。

表2-1 TTClasses Cデータ型のSQLデータ型へのマッピング

Cデータ型

SQLデータ型

char*

SQL_CHAR、SQL_VARCHAR

void*

SQL_BINARY、SQL_VARBINARY

double

SQL_FLOAT、SQL_DOUBLE

DATE_STRUCT

SQL_DATE

float

SQL_REAL、SQL_DECIMAL

int

SQL_INTEGER

SQLBIGINT

SQL_BIGINT

SQLCHAR*

SQL_VARCHAR

SQLINTEGER

SQL_INTEGER

SQLSMALLINT

SQL_SMALLINT

SQLTINYINT

SQL_TINYINT

SQLWCHAR*

SQL_WCHAR、SQL_WVARCHAR

TIME_STRUCT

SQL_TIME

TIMESTAMP_STRUCT

SQL_TIMESTAMP

SQLHSTMT

SQL_REFCURSOR

重要:
ドライバ・マネージャを使用している場合、前述の表のすべてのCデータ型がサポートされている訳ではありません。「ODBCドライバ・マネージャ使用時の考慮事項(Windows)」を参照してください。

registerParam()コールは、関連するsetParam()またはBindParameter()コールの前後どちらかで使用可能であり、そのSQLデータ型、精度、スケール(該当する場合)に関しては優先されます。

メソッドのシグネチャは、次のように指定します。

inline void
TTCmd::registerParam(int pno,
int inputOutputType,
int sqltype,
int precision = 0,
int scale = 0)

- pnoは文内のパラメータの位置を示します。

- inputOutputTypeは、TTCmd::PARAM_IN、TTCmd::PARAM_OUTまたはTTCmd::PARAM_INOUTです。

- sqltypeはSQLデータ型のデータです(たとえば、SQL_INTEGER)。

- precisionとscale(いずれもオプション)は、ODBC SQLBindParameterコールの場合と同様に使用します。プリミティブ型(intなど)については、precisionとscaleの設定は無視されます。

注意:
例については、次の「出力または入力/出力パラメータのバインド」の項を参照してください。その他のリファレンス情報は、「registerParam()」を参照してください。

出力または入力/出力パラメータのバインド

TTClassesでは、REF CURSOR(出力のみ)などの出力および入/出力パラメータ、OUTまたはIN OUTパラメータを持つPL/SQLプロシージャまたはファンクションからのパラメータ、またはRETURNING INTO句からのパラメータ(出力のみ)がサポートされています。

TTClassesにSQL文内のパラメータが出力または入力/出力であるかを通知するには、前述の項で説明したTTCmd::registerParam()メソッドを使用する必要があります。このメソッド・コールでは、intputOutputTypeの設定に適宜TTCmd::PARAM_OUTまたはTTCmd::PARAM_INOUTを使用します。

バッチ以外の操作では、SQL文の実行後に、適切なTTCmd::getParam()メソッドを使用し出力値を取得します(パラメータの位置および値の配置先の変数を指定します)。各データ型にはシグネチャがあります。

バッチ操作では、TTCmd::BindParameter()を、出力パラメータ、入力/出力パラメータまたは入力パラメータに使用します。これは文が実行される前にコールされます。文の実行後、出力値用のデータはBindParameter()コールで指定したバッファ内に配置されます。BindParameter()には、データ型ごとにシグネチャがあります。バッチ操作の入力/出力パラメータ用には、文の実行前にBindParameter()が1回のみコールされます。指定したバッファには、実行前には入力が含まれ、文の実行後には出力が含まれます。

次の例は、出力および入力/出力パラメータの使用方法を示す部分的なコードです。

例2-6 入力および入力/出力パラメータの使用(バッチ以外の場合)

この例では、入力および出力パラメータを使用します。setParam()コールで、入力パラメータ:aの値をバインドされます。getParam()コールで、出力パラメータ:bの値を取得されます。この出力パラメータも、必要に応じて登録されます。

...
// t1 has a single TT_INTEGER column
cmd.Prepare(&conn, "insert into t1 values (:a) returning c1 into :b");
cmd.setParam(1, 99);
cmd.registerParam(2, TTCmd::PARAM_OUT, SQL_INTEGER);
cmd.Execute();
SQLINTEGER outval;

if (cmd.getParam(2, &outval))
cerr << "The output value is null." << endl;
else
cerr << "The output value is " << outval << endl;
...

例2-7 入力および出力パラメータの使用(バッチの場合)

この例では、バッチ操作で入力パラメータおよび出力パラメータを使用します。最初のBindParameter()コールは、最初のパラメータ:aの入力データを提供します。2番目のBindParameter()コールは、2番目のパラメータ:bの出力データ用にバッファを提供します。

...
#define BATCH_SIZE  5
int input_int_array[BATCH_SIZE] = { 91, 92, 93, 94, 95 };
int output_int_array[BATCH_SIZE] = { -1, -1, -1, -1, -1 };
int numrows;

cmd.PrepareBatch(&conn, "insert into t1 values (:a) returning c1 into :b",
BATCH_SIZE);
cmd.BindParameter(1, BATCH_SIZE, input_int_array);
cmd.BindParameter(2, BATCH_SIZE, output_int_array);
cmd.registerParam(2, TTCmd::PARAM_OUT, SQL_INTEGER);
numrows = cmd.ExecuteBatch(BATCH_SIZE);
...

例2-8 入力/出力パラメータの使用

この例では、入力/出力パラメータを使用します。これは必要に応じて登録できます。setParam()コールはその入力値をバインドし、getParam()コールはその出力値を取得します。

...
cmd.Prepare(&conn, "begin :x := :x + 1; end;");
cmd.registerParam(1, TTCmd::PARAM_INOUT, SQL_INTEGER);
cmd.setParam(1, 99);
cmd.Execute();
SQLINTEGER outval;

if (cmd.getParam(1, &outval))
cerr << "The output value is null." << endl;
else
cerr << "The output value is " << outval << endl;
...

例2-9 出力および入力/出力パラメータの使用

この例では出力および入力/出力パラメータを使用します。次のPL/SQLプロシージャがあるとします。

create or replace procedure my_proc (
a in number,
b in number,
c out number,
d in out number ) as

begin
c := a + b;
d := a + b - d;
end my_proc;

このプロシージャの入力パラメータは、この例ではバインド・パラメータとしてではなく定数として取られるため、OUTパラメータおよびIN OUTパラメータのみがバインドされます。必要に応じて両方が登録されます。setParam()コールは、IN OUTパラメータ:var1の入力値を提供します。最初のgetParam()コールは、OUTパラメータ:sumの値を取得します。2番目のgetParam()コールは、IN OUTパラメータ:var1の出力値を取得します。

...
cmd.Prepare(&conn, "begin my_proc (10, 5, :sum, :var1); end;");
cmd.registerParam (1, TTCmd::PARAM_OUT, SQL_DECIMAL, 38);
cmd.registerParam (2, TTCmd::PARAM_INOUT, SQL_DECIMAL, 38);
cmd.setParam(2, "99");
cmd.Execute();
SQLINTEGER outval1, outval2;

if (cmd.getParam(1, &outval1))
cerr << "The first output value is null." << endl;
else
cerr << "The first output value is " << outval << endl;
if (cmd.getParam(2, &outval2))
cerr << "The second output value is null." << endl;
else
cerr << "The second output value is " << outval << endl;
...

重複パラメータのバインド

TimesTenでは、SQL文内の重複するパラメータのバインドに、2つの個別のモードがサポートされています。Oracleモードでは、TimesTen接続属性の設定がDuplicateBindMode=0(デフォルト)であり、同じパラメータ名が複数回出現しても、別のパラメータとみなされます。従来のTimesTenモードでは、DuplicateBindMode=1であり、同じパラメータ名が複数回出現すると同じパラメータとみなされます(以前のTimesTenリリースと同様)。

注意:
詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のDuplicateBindModeおよび『Oracle TimesTen In-Memory Database C開発者ガイド』のSQL文での重複するパラメータのバインドに関する説明を参照してください。

たとえば、次の問合せがあるとします。

SELECT * FROM employees
WHERE employee_id < :a AND manager_id > :a AND salary < :b;

Oracleモードの場合、パラメータの位置番号が割り当てられると、名前の重複に関係なく、パラメータの出現ごとに番号が割り当てられます。アプリケーションは、少なくとも各パラメータ名の最初の出現時に値をバインドする必要があります。特定のパラメータ名がそれ以降に出現した場合は、アプリケーションはその出現に対して別の値をバインドすることも、そのパラメータの出現をバインドしないこともできます。後者の場合、最初の出現時と同じ値がそれ以降の出現時に使用されます。いずれの場合も、出現ごとに異なるパラメータ位置番号が付けられます。

TimesTenモードでは、重複パラメータを含むSQL文は、異なるパラメータ名のみが別のパラメータとみなされるように解析されます。バインドは、パラメータ名が最初に出現した位置に基づいて行われます。以降に出現する同じパラメータ名には、独自の位置番号は与えられず、同じパラメータ名の出現にはすべて同じ値が使用されます。

例2-10 パラメータの重複: Oracleモード

この例では、Oracleモードで、前述のSQL文でのaの2回目の出現に対して異なる値を使用します。

mycmd.setParam(1, ...); // first occurrence of :a
mycmd.setParam(2, ...); // second occurrence of :a
mycmd.setParam(3, ...); // occurrence of :b

aの両方の出現に対して同じ値を使用するには、次のように指定します。

mycmd.setParam(1, ...); // both occurrences of :a
mycmd.setParam(3, ...); // occurrence of :b

パラメータbは、位置3に存在するとみなされ、パラメータ数は3とみなされます。

例2-11 パラメータの重複: TimesTenモード

前述のSQL文は、TimesTenモードの場合、aの2回の出現は単一のパラメータとみなされ、個別にバインドすることはできません。

mycmd.setParam(1, ...); // both occurrences of :a
mycmd.setParam(2, ...); // occurrence of :b

TimesTenモードの場合、パラメータbは位置3ではなく位置2に存在するとみなされ、パラメータ数は2とみなされます。

REF CURSORの使用

REF CURSORはPL/SQLの概念で、SQLの結果セット上のカーソルに対するハンドルであり、PL/SQLとアプリケーションの間で渡すことができます。TimesTenでは、このカーソルをPL/SQL内で開くことができるため、REF CURSORをアプリケーションに渡して処理することができます。この使用方法は、OUT REF CURSORであり、これはPL/SQLに関するOUTパラメータです。すべての出力パラメータと同様に、これはTTCmd::registerParam()メソッドで登録する必要があります。(「パラメータの登録」および「出力または入力/出力パラメータのバインド」を参照してください。)

TimesTenの実装では、REF CURSORは別の文ハンドルにアタッチされています。アプリケーションは、1つの文ハンドルにREF CURSORパラメータを持つSQL文を準備し、次に、この文の実行前に、2つ目の文ハンドルをREF CURSORの値としてバインドします。この文の実行後、アプリケーションはこの結果の記述、バインドおよびフェッチを、結果セットの場合と同じAPIを使用して実行することができます。

TTCmdオブジェクトは単一のSQL文をカプセル化するため、TTClassesでは2つのTTCmdオブジェクトが使用してこのREF CURSORモデルをサポートします。

REF CURSORの詳細は、『Oracle TimesTen In-Memory Database PL/SQL開発者ガイド』のPL/SQL REF CURSORに関する説明を参照してください。

重要:

- PL/SQLからアプリケーションへのOUT REF CURSORのみがサポートされるのに加えて、TimesTenでは、1つの文で1つのREFCURSORのみがサポートされます。

- 「ODBCドライバ・マネージャ使用時の考慮事項(Windows)」に示すとおり、ODBCドライバ・マネージャを使用する場合、REF CURSORの機能はTTClassesではサポートされません。(この制限は、TimesTenクイック・スタートで提供しているデモのttdmドライバ・マネージャには該当しません。)

次に説明する、TTClassesでREF CURSORを使用する手順を、以降の例2-12で示します。

1. REF CURSORを返すPL/SQL文に対して、TTCmdオブジェクトを宣言します(この例ではcmdPLSQL)。

2. TTCmd*ポインタを宣言して、REF CURSOR用の2つ目のTTCmdオブジェクトをポイントします(この例ではcmdRefCursor)。

3. 最初のTTCmdオブジェクト(cmdPLSQL)を使用してPL/SQL文を準備します。

4. 最初のTTCmdオブジェクトのTTCmd::registerParam()メソッドを使用して、このREF CURSORを出力パラメータとして登録します。

5. 最初のTTCmdオブジェクトを使用して、文を実行します。

6. 最初のTTCmdオブジェクトのTTCmd::getParam()メソッドを使用して、REF CURSORを2つ目のTTCmdオブジェクト(&cmdRefCursorを使用)に取得します。REF CURSORには、getParam(int paramNo、TTCmd** rcCmd)のシグネチャがあります。

7. REF CURSORのTTCmdオブジェクトから結果をフェッチして、必要に応じて処理します。

8. 最初のTTCmdオブジェクトを削除します。

9. REF CURSORのTTCmdオブジェクトへのポインタを削除します。

10. delete文を発行して、REF CURSORのTTCmdオブジェクトを削除します。

例2-12 REF CURSORの使用

この例では、PL/SQL無名ブロックからREF CURSORを取得および処理します。説明については、前述の手順を参照してください。

...
TTCmd  cmdPLSQL;
TTCmd* cmdRefCur;
TTConnection conn;
...

// c1 is a TT_INTEGER column.
cmdPLSQL.Prepare(&conn, "begin open :rc for select c1 from t; end;")
cmdPLSQL.registerParam(1, TTCmd::PARAM_OUT, SQL_REFCURSOR);
cmdPLSQL.Execute();

if (cmdPLSQL.getParam(1, &cmdRefCur) == false)
{
SQLINTEGER fetchval;

while (!cmdRefCursor->FetchNext()) {
cmdRefCur->getColumn(1, &fetchval);
}
cmdRefCursor->Drop();
delete cmdRefCursor;
}

cmdPLSQL.Drop();

TTClassesでREF CURSORを使用する場合は、次のような使用上の注意があります。

- PL/SQLとアプリケーションの間でREF CURSORを渡す場合、TimesTenでは、PL/SQLからアプリケーションへのOUT REF CURSORのみと、単一のREF CURSORのみを返す文がサポートされます。

- 他のデータ型に対するTTCmd::getParam()コールとは異なり、REF CURSOR用のTTCmd**パラメータを使用したgetParam()コールは1回のみコールできます。それ以降のコールではNULLが返されます。REF CURSORを2度取得する必要がある場合は、文を再実行する必要があります。

- 文を複数回実行する場合は、そのたびにREF CURSORパラメータを登録する必要があります。たとえば、ループ内で文の実行、REF CURSORパラメータの取得およびREF CURSORからのフェッチを行うには、次のようにパラメータの登録もループ内で行う必要があります。

cmdPLSQL.Prepare(...);

loop
cmdPLSQL.registerParam(...);
cmdPLSQL.Execute();
cmdPLSQL.getParam(...);
fetch loop
end loop

これを次の例2-13に示します。

- どのTTCmdオブジェクト(REF CURSOR用のものを含む)も、ODBC文ハンドルが割り当てられます。REF CURSOR文ハンドルは、Drop()文の実行時に削除され、そのリソースはdelete文の後に解放されます。

例2-13 ループでのREF CURSORの使用

この例では、ループでREF CURSORを使用します。次の宣言とTTConnectionインスタンスconnを想定しています。

...
TTCmd query;
TTCmd* ref_cur;
...

ループは次のとおりです。

...
cerr << "Selecting values using cursor" << endl;
query.Prepare(&conn, "begin open :rc for select c1 from t1; end;");

for (int round = 0; round < ROUNDS; round++) {
cerr << "executing ref cursor round# " << (round+1) << endl;
query.registerParam(1, TTCmd::PARAM_OUT, SQL_REFCURSOR);
query.Execute();
query.getParam(1, &ref_cur);

while(true) {
fetch_next = ref_cur -> FetchNext();
if (fetch_next == 1)
break;

ref_cur -> getColumn(1, &val);
cerr << "val = " << val << endl;
}
ref_cur->Drop();
delete ref_cur;
}

conn.Commit();
query.Drop();
...

ROWIDの使用

表の各行には、ROWIDと呼ばれる一意の識別子があります。アプリケーションでは、ROWID疑似列から行のROWIDを取得します。ROWIDはバイナリまたは文字形式で表すことができます。

アプリケーションは、リテラルのROWID値を、SQL文のWHERE句などで、一重引用符で囲んだCHAR定数として指定できます。

ODBC SQLデータ型のSQL_ROWIDは、SQLデータ型のROWIDと対応します。

パラメータおよび結果セット列では、ROWIDは、Cデータ型のSQL_C_BINARY、SQL_C_WCHARおよびSQL_C_CHARとの間で双方向に変換可能です。SQL_C_CHARは、ROWIDのデフォルトのCデータ型です。ROWIDのサイズは、SQL_C_BINARYとしては12バイト、SQL_C_CHARとしては18バイトおよびSQL_C_WCHARとしては36バイトです。

通常、TTClassesでは文字列としてのROWIDがサポートされていますが、TTClassesアプリケーションでは、ROWIDを文字列としてではなくROWID型としてPL/SQL無名ブロックに渡せるようになったことに注意してください。これを行うには、例2-14のように、TTCmd::registerParam()メソッドを使用してROWID入力パラメータをSQL_ROWID型として登録するする必要があります。

例2-14 ROWIDの使用

...
TTConnection conn;
TTCmd cmd;
...
cmd.Prepare(&conn, "begin delete from t1 where rowid = :x; end;");
cmd.registerParam(1, TTCmd::PARAM_IN, SQL_ROWID);
cmd.setParam(1, rowid_string);
cmd.Execute();
...

ROWIDおよびROWIDデータ型(使用方法および有効期間を含む)の詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス』のROWIDデータ型およびROWIDに関する説明を参照してください。

注意:
TimesTenでは、PL/SQL型のUROWIDはサポートされません。

LOBの作業

TimesTenではLOB(ラージ・オブジェクト)がサポートされています。これには、CLOB(Character LOB)、NCLOB(各国語LOB)およびBLOB(バイナリLOB)が含まれます。

LOBの概要およびCおよびC++でのLOBプログラミング・インタフェースの詳細は、『Oracle TimesTen In-Memory Database C開発者ガイド』のLOBの使用に関する説明を参照してください。LOBの簡易データ・インタフェースのみをTTClassesに適用可能です。

この項では、TTClassesでのLOBの使用について、次の内容で説明します。

- TimesTen LOBとOracle Database LOBの違い

- TTClassesでのLOBの簡易データ・インタフェースの使用

重要:
TimesTenでは、アプリケーションで使用されるLOBは、トランザクションが終了すると無効になります。

注意:
TimesTenでは、データベースのキャラクタ・セットがTIMESTEN8の場合、CLOBはサポートされません。

次の情報も参照できます。

- TimesTenでのLOBに関する詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス・ガイド』のLOBのデータ型に関する説明を参照してください。

- LOBでのプログラミングに関する一般的な情報については、『Oracle Database SecureFilesおよびラージ・オブジェクト開発者ガイド』を参照してください(TimesTenの機能のみには限定されていません)。

TimesTen LOBとOracle Database LOBの違い

次の点に注意してください。

- LOBのTimesTenでの実装とOracle Databaseでの実装の主要な違いは、TimesTenでは、アプリケーションで使用されるLOBは、トランザクションが終了すると無効になるということです。そのようなLOBは、コミットまたはロールバック後、明示または暗黙にかかわらず、無効になります。これは、Oracle Databaseの動作としてTimesTenのDDLCommitBehaviorが0(デフォルト)に設定されている場合のすべてのDDL文の後の場合も含みます。

- TimesTenでは、BFILE、SecureFile、LOBに対する配列の読取りおよび書込みおよびLOBのコールバック関数はサポートされていません。

- TimesTenでは、LOBの配列のバインドはサポートされていません。

- TimesTenでは、LOBのバッチ処理はサポートされていません。

- BLOBの場合、TimesTenでの16進リテラルの使用に違いがあります(詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス』の定数のHexadecimalLiteralに関する説明を参照してください)。

TTClassesでのLOBの簡易データ・インタフェースの使用

アプリケーションは、他のスカラー型同様、簡易データ・インタフェースでバインドおよび定義することによってLOBデータにアクセスできます。TTClassesの簡易データ・インタフェースでは、パラメータのバインドにgetParam()とsetParam()を使用し、結果行の定義にはgetColumn()またはgetColumnNullable()を使用します。アプリケーションは、SQLデータ型を使用してバインドまたは定義することが可能で、このSQLデータ型は次に示すように対応する変数型と互換性があります。

- BLOBデータには、SQLデータ型のSQL_LONGVARBINARYとCデータ型のSQL_C_BINARYを使用します。

- CLOBデータには、SQLデータ型のSQL_LONGVARCHARとCデータ型のSQL_C_CHARを使用します。

- NCLOBデータには、SQLデータ型のSQL_WLONGVARCHARとCデータ型のSQL_C_WCHARを使用します。

注意:

- TTClassesでは、LOBのバッチ・モードはサポートされていません。

- CLOBまたはNCLOBを、Cデータ型のSQL_C_BINARYとバインドすることは禁止されています。

例2-15に、TTClassesでのLOBの簡易データ・インタフェースの使用例を示します。

例2-15 TTClassesでのLOBの使用

この例は、作成および移入済のNCLOB、BLOBおよびCLOB列がある表を前提としています。これらのLOB型に対して実行されるメソッドは、NCHAR、BINARYおよびCHARの場合とそれぞれ同じです。

#ifdef _WIN32
#include <ttcommon.h>
#endif
#include "TTInclude.h"
#define LOB_COL_SIZE 4194304

int main(int argc, char** argv) {

TTConnection conn;
TTCmd query;
char conn_str[100] = "... your connection string ...";
char tbl_name[20] = "... test table name ...";

int num_rows = 0;
char query_stmt[1000];
int fetch_next;
int value_is_null = 0;
int column_type;
SQLWCHAR * unicode_val;
u_char * binary_val;
char * alfanum_val;
int b_len;
int u_len;

cerr << "Connecting to TimesTen <" << conn_str << ">" << endl;

try {
conn.Connect(conn_str);
sprintf(query_stmt, "select * from %s", tbl_name);
query.Prepare(&conn, query_stmt);
query.Execute();
const int num_result_cols = query.getNColumns();

while (true) {
// loop until no rows found
// fetch a row; if no more rows, break out of loop
// FetchNext returns 0 for success, 1 for SQL_NO_DATA_FOUND
fetch_next = query.FetchNext();
if (fetch_next == 1)
break;

for (int col = 1; col <= num_result_cols; col++) {
value_is_null = 0;
column_type = query.getColumnType(col);

switch (column_type) {

case SQL_WLONGVARCHAR:

value_is_null = query.getColumnNullable(col,
(SQLWCHAR**) & unicode_val, &u_len);
if (value_is_null) {
cerr << "NCLOB value is NULL";
} else {
cerr << "NCLOB value length = " << u_len << endl;
// do something with NCLOB value
}
break;

case SQL_LONGVARBINARY:

value_is_null = query.getColumnNullable(col,
(void**) & binary_val, &b_len);
if (value_is_null) {
cerr << "BLOB value is NULL";
} else {
cerr << "BLOB value length = " << b_len << endl;
// do something with BLOB value
}
break;

case SQL_LONGVARCHAR:

alfanum_val = (char*) malloc(LOB_COL_SIZE + 1);
value_is_null = query.getColumnNullable(col, alfanum_val);
if (value_is_null) {
cerr << "CLOB value is NULL";
} else {
cerr << "CLOB value length = " << strlen(alfanum_val) << endl;
// do something with BLOB value
}
free(alfanum_val);
break;

default:
break;
}
}

num_rows++;
cerr << "row " << num_rows << " fetched" << endl;
}
cerr << num_rows << " rows returned" << endl;
} catch (TTError err) {
cerr << "\nError" << err << endl;
}
query.Drop();
conn.Disconnect();
return 0;
}

TTClassesでのパススルーLOB

パススルーLOBは、TimesTenを介してアクセスするOracle Database内のLOBであり、TimesTen LOBとして公開され、TimesTenによってTimesTen LOBとほぼ同様にサポートされますが、次のことに注意する必要があります。

- TimesTen LOBのサイズ制限は、パススルーによるOracle DatabaseのLOBの格納には適用されません。

- TimesTenのローカルLOBと同様に、アプリケーションで使用されるパススルーLOBは、トランザクションが終了すると無効になります。

SQL文の実行に対するタイムアウトまたはしきい値の設定

TimesTenには、SQL文またはプロシージャ・コールの実行時間を制限する方法として、タイムアウト値の設定と、しきい値の設定の2つがあります。前者の場合、タイムアウト期間に達すると、文の実行が停止し、エラーがスローされます。値0はタイムアウトがないことを示します。後者の場合、しきい値に達すると、SNMPトラップがスローされますが実行は継続されます。

問合せのタイムアウト制限は、SQL文がアクティブに実行されている場合にのみ有効です。コミット中またはロールバック中にはタイムアウトは発生しません。

TTCmdオブジェクトに対し、これらを設定するには、TTCmdメソッドのsetQueryTimeout()およびsetQueryThreshold()を指定します。これらのメソッドは、TimesTenの接続属性SqlQueryTimeoutおよびQueryThresholdによってぞれぞれ指定される設定をオーバーライドする点に注意してください。

getQueryThreshold()メソッドでは、現在のしきい値の設定を読み取ることもできます。

これらの機能は、TTClassesでは、文レベルのみで使用でき、接続レベルでは使用できません。

関連情報については、『Oracle TimesTen In-Memory Database C開発者ガイド』のSQL文の実行のためのタイムアウトまたはしきい値の設定に関する説明を参照してください。

注意:
ロック・タイムアウト値およびSQL問合せのタイムアウト値の両方が指定されている場合は、まず、2つの値の小さい方の値によってタイムアウトが発生します。ロック・タイムアウトについては、『Oracle TimesTen In-Memory Databaseリファレンス』のttLockWait(組込みプロシージャ)またはLockWait(一般接続属性)に関する説明、またはOracle TimesTen In-Memory Databaseトラブルシューティング・ガイドのデッドロックとタイムアウトの確認に関する説明を参照してください。

TTClassesアプリケーションでの自動クライアント・フェイルオーバーの使用

TTClassesには、独自の自動クライアント・フェイルオーバー機能はありませんが、ODBCアプリケーションの場合と同様にTTClassesアプリケーションでTimesTen自動クライアント・フェイルオーバーを構成できます。これについては、『Oracle TimesTen In-Memory Database C開発者ガイド』の自分のアプリケーションでの自動クライアント・フェイルオーバーの使用に関する説明を参照してください。この機能の概要について、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』の自動クライアント・フェイルオーバーの使用に関する説明も参照してください。

TTClassesロギングの使用

TTClassesには、アプリケーションでデバッグ情報を取得するためのログ機能が用意されています。TTClassesのログは、プロセスと関連付けられます。特定のプロセスに対してロギングを有効にし、そのプロセスに対して1つの出力ログのストリームを作成できます。

TTClassesでは、様々なレベルのロギング情報をサポートしています。各ログ・レベルでの出力については、例2-17を参照してください。

ログ・レベルTTLOG_WARNは、TTClassesアプリケーションの開発時に非常に便利です。また、このログ・レベルではデータベースへの問合せ計画が生成されるため、本番アプリケーションにも適しています。

冗長度の高いログ・レベル(TTLOG_INFOおよびTTLOG_DEBUG)では大量のログ・データが生成されるため、アプリケーションのパフォーマンスに悪影響がある場合があります。これらのログ・レベルは本番環境では使用しないでください。

TTClassesロギングではstdoutまたはstderrのいずれかに出力することもできますが、TTClassesログ・ファイルに直接書き込むことをお薦めします。TTClassesのログ情報を、TTLOG_WARNのログ・レベルで/tmp/ttclasses.log出力ファイルに出力する方法を例2-16に示します。

注意:
デフォルトでは、TTClassesロギングは無効になっています。

例2-16 TTClassesログ情報の出力

ofstream output;
output.open("/tmp/ttclasses.log");
TTGlobal::setLogStream(output);
TTGlobal::setLogLevel(TTLog::TTLOG_WARN);

TTClassesを初めて使用するユーザーは、TTClassesロギングを試して、ログ・レベルTTLOG_ERRORでエラーがどのように出力されるか、ログ・レベルTTLOG_INFOおよびTTLOG_DEBUGで生成される情報の量を確認してください。

TTGlobalクラスを使用してロギングを行う方法の詳細は、「TTGlobal」を参照してください。

TTClassesのXLAの使用

トランザクション・ログAPI(XLA)とは、指定したデータベース表への変更についてTimesTenを監視し、これらの変更の通知をリアルタイムで受信するアプリケーションを実装できる関数のセットです。

XLAの主な目的は、トリガーに対する、高性能で非同期の代替手段を提供することです。

XLAは、データベース内の特定の表への変更の通知を返すとともに、これらのデータベース変更のトランザクション境界に関する情報も返します。この項では、トランザクション境界を使用しない例および使用する例を使用して、トランザクション境界のみでの更新(XLAアプリケーションでの一般的な要件)を確認する方法を示します。

この項のトピックは、次のとおりです。

- トランザクション境界を使用しないXLA更新の確認

- トランザクション境界におけるXLA更新の確認

- アクセス制御がXLAに与える影響

XLAの詳細は、『Oracle TimesTen In-Memory Database C開発者ガイド』のXLAおよびTimesTenイベント管理に関する説明を参照してください。また、TTClassesのクイック・スタート・デモで、XLAのデモが提供されています。「TimesTen TTClassesデモについて」を参照してください。

重要:

- 「ODBCドライバ・マネージャ使用時の考慮事項(Windows)」に示すとおり、XLA機能はODBCドライバ・マネージャに接続されたアプリケーションでは使用できません。

- XLAブックマークがスタックした場合(これは先にブックマークを削除したり変更追跡を無効にしない状態で、XLAアプリケーションが予期せず停止したか、切断されると発生する可能性があります)、トランザクション・ログ・ファイルが過度に蓄積されていることがあります。この蓄積によって、ディスク領域が一杯になる場合があります。この状況の監視および解決に関する情報は、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』のトランザクション・ログ・ファイルの蓄積の監視に関する説明を参照してください。

注意:

- LOB列がある表をサブスクライブすることは可能ですが、LOB値自体の情報は入手できません。

- LOBを含む列は空(長さ0)またはnull(値が実際にNULLの場合)と通知されます。null列とnull以外の列の違いは、この方法で判別できます。

- XLAリーダーは、インメモリー列圧縮を使用する表をサブスクライブできません。

トランザクション境界を使用しないXLA更新の確認

例2-17に、トランザクション境界を使用しないXLAの基本的な使用方法を示します。

HandleChange()メソッド内では、レコードがinsertか、updateか、deleteかに応じて、HandleInsert()、HandleUpdate()、HandleDelete()のいずれかの適切なメソッドがコールされます。

XLAレコードが特定のトランザクションにおける最後のレコードかどうかを示すフラグにユーザーがアクセスできるのは、HandleChange()内です。したがって、例2-17のループ内で、HandleChange()メソッドが、トランザクション境界に関する情報をループに渡して、この情報がconn.ackUpdates()をコールするタイミングに影響を与えることができるようにする方法はありません。

1つのトランザクションにつきレコードが数個しかない一般的な状況では、これは問題になりません。fetchUpdatesWait()コールで最大1000個のレコードを返すようXLAに要求しても、通常は数個のレコードが返されるだけです。XLAはできるだけ速くレコードを返し、データベース内で膨大な数のトランザクションが発生していても、通常はXLAレコードを一度に数個ずつ、短時間で取得することができ、XLAは最後に返されたレコードがトランザクション境界上にあることを確認します。たとえば、XLAに1000個のレコードを要求して、15個しか返されない場合は、15番目のレコードがほぼ確実にトランザクションの終了に当たります。

XLAによって、次のいずれかが保証されます。

- 完了したトランザクション(おそらくXLAレコードの単一バッチにおける複数のトランザクション)でレコードのバッチが終了すること。

または

- レコードのバッチに部分トランザクションが含まれ、同じバッチ内に完了したトランザクションがないこと、およびトランザクション境界に達するまで、その単一トランザクションの後続のXLAレコードのバッチが返されること。

例2-17 TTClassesのXLAプログラム

次の例に、TTClassesのXLAプログラムの一般的なメイン・ループを示します。(また、シグナル・ハンドラも存在すると仮定しています。)

TTXlaPersistConnection conn; // XLA connection
TTXlaTableList list(&conn); // tables being monitored
ttXlaUpdateDesc_t ** arry; // pointer to returned XLA records
int records_fetched;
// ...

while (!signal_received) {
// fetch the updates
conn.fetchUpdatesWait(&arry, MAX_RECS_TO_FETCH, &records_fetched, ...);

// Interpret the updates
for(j=0;j < records_fetched;j++){
ttXlaUpdateDesc_t *p;
p = arry[j];
list.HandleChange(p, NULL);
} // end for each record fetched

// periodically call ackUpdates()
if (/* some condition is reached */) {
conn.ackUpdates();
}
}

トランザクション境界におけるXLA更新の確認

XLAアプリケーションでは、XLAレコードのバッチにおける最後のレコードにトランザクション境界があるかどうか検証し、このトランザクション境界のみでackUpdates()をコールする必要があります。このように、アプリケーション、システムまたはデータベースが失敗した場合、システムのリカバリ後はXLAブックマークがトランザクションの始めにあることなります。これは、操作に多数の行が関連する場合に特に重要です。データベースに対して挿入、更新、削除のバルク操作を実行する場合に、XLAアプリケーションが1000個のレコードを要求すると、1000個のレコードすべてが受信される場合もされない場合もあります。XLAを介して最後に返されるレコードには、おそらくトランザクション終了フラグが設定されていません。実際、トランザクションによって10,000個のレコードが変更された場合、トランザクション境界に達するまでに1000個のXLAレコードのブロックを最低でも10個フェッチする必要があります。

ただし、ackUpdates()は相対的に負荷の高い操作であるため、トランザクション境界ごとにackUpdates()をコールすることはお薦めしません。ユーザーは、リカバリ時間およびディスク容量の要件において、システムの全体的なスループットのバランスをとる必要があります。(XLAにそのログ・ファイルを参照するブックマークがある場合、チェックポイント操作ではTimesTenのトランザクション・ログ・ファイルを削除できない点に注意してください。関連情報は、『Oracle TimesTen In-Memory Databaseリファレンス』のttLogHoldsに関する説明を参照してください。)システムのスループット、リカバリ時間およびディスク領域の要件に応じ、アプリケーションによっては、1分ごとにackUpdates()を1回または複数回コールすることが適切である場合もあれば、1時間に1回または数回しかコールする必要がない場合もあります。

HandleChange()メソッドには、HandleChange()とメインXLAループとの間で情報の受渡しを可能にする第2のパラメータがあります。前述の例2-17と例2-18の特にdo_acknowledgeの設定とHandleChange()コールの&do_acknowledgeパラメータを比較してください。

例2-18 トランザクション境界を使用するTTClassesのXLAプログラム

この例では、ackUpdates()は、このXLAレコードのバッチがトランザクション境界にあることがdo_acknowledgeフラグによって示された場合にのみコールされます。(この例では、シグナル・ハンドラも存在すると仮定しています。)

TTXlaPersistConnection conn; // XLA connection
TTXlaTableList list(&conn); // tables being monitored
ttXlaUpdateDesc_t ** arry; // ptr to returned XLA recs
int records_fetched;
int do_acknowledge;
int j;

// ...
while (!signal_received) {
// fetch the updates
conn.fetchUpdatesWait(&arry, MAX_RECS_TO_FETCH, &records_fetched, ...);

do_acknowledge = FALSE;

// Interpret the updates
for(j=0;j < records_fetched;j++){
ttXlaUpdateDesc_t *p;
p = arry[j];
list.HandleChange(p, &do_acknowledge);
} // end for each record fetched

// periodically call ackUpdates()
if (do_acknowledge == TRUE  /* and some other conditions ... */ ) {
conn.ackUpdates();
}
}

XLAのメイン・ループに対するこの変更だけではなく、HandleChange()メソッドをオーバーロードして、2つパラメータを持つ(ttXlaUpdateDesc_t*、void* pData)ようにする必要があります。「HandleChange()」を参照してください。pDataパラメータの使用方法は、クイック・スタートのxlasubscriber1のデモのとおりです。(「TimesTen TTClassesデモについて」を参照してください。)

アクセス制御がXLAに与える影響

データベース内の処理に与えるTimesTenアクセス制御の影響の概要については、「アクセス制御に関するTimesTen機能の考慮事項」を参照してください。アクセス制御はXLAに影響を与えます。

システム権限XLAは、XLAリーダーとしてTimesTenに接続する場合(CREATE SESSION権限も必要)、XLA関連のTimesTen C関数を実行する場合、およびXLA関連のTimesTen組込みプロシージャを実行する場合など、すべてのXLA機能で必要になります。

詳細は、『Oracle TimesTen In-Memory Database C開発者ガイド』のアクセス制御がXLAに与える影響に関する説明を参照してください。

注意:
XLA権限を持つユーザーは、データベースで実行されるすべてのDML文の通知を受信できます。その結果、XLA権限を持つユーザーは、この権限がない場合にアクセスが許可されていなかったデータベース・オブジェクトに関する情報を取得可能になります。実際、XLA権限は、実質的にSELECT ANY TABLE、SELECT ANY VIEWおよびSELECT ANY SEQUENCE権限と同じです。

3 クラスの説明

このリファレンスの章では、TTClassesの外部クラスおよびそのメソッドについて説明します。内容は次のとおりです。

- 一般的に使用されるTTClasses

- システム・カタログ・クラス

- XLAクラス

注意:
この章で説明するメソッドのほとんどでは、コール・シーケンスの終わりにTTStatus&パラメータを含むシグネチャもサポートされています。これは、メソッド・コールの例外を抑制し、かわりにエラーに関して手動でTTStatusオブジェクトを処理する状況に対応するためです。ただし、このモードの使用は推奨されないため、このシグネチャについての説明は特に記載されていません。詳細および例については、「TTStatus」の「使用方法」に関する項を参照してください。

一般的に使用されるTTClasses

この項では、次のクラスについて説明します。

- TTGlobal

- TTStatus

- TTConnection

- TTConnectionPool

- TTCmd

TTGlobal

TTGlobalクラスは、TTClassesのロギング機能を提供します。

使用方法

TTGlobalロギング機能は、TTClassesプログラム内で発生する問題のデバッグに非常に役立つことがあります。ただし、冗長度の高いロギング・レベル(TTLog::TTLOG_INFOおよびTTLog::TTLOG_DEBUG)の場合は、膨大な出力が生成される可能性があることに注意してください。これらのロギング・レベルは、開発時または不具合の診断時に使用してください。これらは、多くの本番環境には適していません。

マルチスレッド・プログラムからロギングを行う際、ディスクへの書込み時に、プログラムの別スレッドからのログ出力が入り混じる問題が発生する場合があります。この問題を軽減するには、次の例のように、ios_base::unitbuf I/Oストリーム・マニピュレータを使用してostreamバッファリングを無効にし、TTClassesのロギングがロギング・レベルTTLog::TTLOG_ERRでapp_log.txtファイルに送信されるようにします。

ofstream log_file("app_log.txt");
log_file << std::ios_base::unitbuf;
TTGlobal::setLogStream(log_file);
TTGlobal::setLogLevel(TTLog::TTLOG_ERR);

TTGlobalの使用方法の詳細は、「TTClassesロギングの使用」を参照してください。

パブリック・メンバー

なし

パブリック・メソッド

メソッド

説明

disableLogging()

TTClassesのロギングを無効にします。

setLogLevel()

TTClassesロギングの冗長レベルを指定します。

setLogStream()

TTClassesのロギング情報の送信先を指定します。

sqlhenv()

基礎となるODBC環境オブジェクト(SQLHENV型)を返します。

disableLogging()

static void disableLogging()

このメソッドは、すべてのTTClassesロギングを無効にします。次の2つの文は同一であることに注意してください。

TTGlobal::disableLogging();
TTGlobal::setLogLevel(TTLog::TTLOG_NIL);

setLogLevel()

static void setLogLevel(TTLog::TTLOG_LEVEL level)

このメソッドは、TTClassesロギングの冗長レベルを指定します。表3-1に、TTClassesのロギング・レベルを示します。これらのレベルは累積されます。

表3-1 TTClassesのロギング・レベル

ロギング・レベル

説明

TTLog::TTLOG_NIL

ロギングは実行されません。

TTLog::TTLOG_FATAL_ERR

致命的エラー(TTClassesメソッドの重大な誤用)が記録されます。

TTLog::TTLOG_ERR

すべてのエラー(SQL_ERRORリターン・コードなど)が記録されます。

TTLog::TTLOG_WARN

(デフォルト)警告とTTCmd::Prepare()に対するすべてのコールが記録されます(準備中のSQL文字列も含む)。データベース・オプティマイザのすべての問合せ計画が出力されます。

TTLog::TTLOG_INFO

情報メッセージ(TTCmdおよびTTConnectionオブジェクトのほとんどのメソッドに対するコールなど)も記録されます。該当するSQL文字列も含まれます。

TTLog::TTLOG_DEBUG

デバッグ用の追加情報(TTCmd::Execute()に対する各コールにバインドされたすべてのパラメータの値など)も記録されます。

たとえば、ロギング・レベルをTTLog::TTLOG_ERRに設定するには、次の行をプログラムに追加します。

TTGlobal::setLogLevel(TTLog::TTLOG_ERR);

setLogStream()

static void setLogStream(ostream& stream)

TTClassesのロギング情報の送信先を指定します。デフォルトでは、TTClassesロギングが有効な場合、stderrにロギングします。このメソッドを使用すると、ロギングをapp_log.txtに設定する次の例のように、ユーザー・アプリケーションはロギングをファイル(または他の任意のostream&)に指定できます。

ofstream log_file("app_log.txt");
TTGlobal::setLogStream(log_file);

sqlhenv()

static SQLHENV sqlhenv()

基礎となるODBC環境オブジェクトを取得します。

TTStatus

TTStatusクラスは、TTClassesライブラリ内の他のクラスで、エラーおよび警告の例外を捕捉するために使用されます。TTStatusは、ODBC関数SQLErrorの付加価値C++ラッパーと考えることができます。

使用方法

TTClassesのエラー処理方法として推奨されるモードは、エラーまたは警告が発生した場合に必ずTTStatusオブジェクトが例外としてスローされることです。これを行うには、TTClassesライブラリとアプリケーションを、TTEXCEPTプリプロセッサ変数を有効にしてコンパイルする必要があります。(TTClassesはデフォルトでこの方法でコンパイルされます。)これによって、C++アプリケーションで{try/catch}ブロックによる障害の検出とリカバリが可能となります。

例3-1にTTStatusの標準的な使用方法を示します。例3-3も参照してください。

例3-1 例外処理

...
TTCmd    myCmd;

try {
myCmd.ExecuteImmediate(&conn, "create table dummy (c1 int)");
}

catch (TTStatus st) {
cerr << "Error creating table: " << st << endl;
// Rollback, exit(), throw -- whatever is appropriate
}

TTStatusでの使用がサポートされる別のモードでは(ただし一般的ではない)、TTEXCEPTが有効な場合に、例外を選択的に抑制し、アプリケーションがTTStatusオブジェクトのエラー状態の有無を手動で確認できるようになります。このモードは、特定のメソッド・コールに対して使用可能で、それには、値TTStatus::DO_NOT_THROWでTTStatusオブジェクトを初期化し、そのオブジェクトをメソッド・コールの最後のパラメータとして渡します。この章で説明するTTClassesのメソッドのほとんどで、コール・シーケンスの最後のパラメータとして、このTTStatus&パラメータを含むシグネチャもサポートされています。

次の例3-2に、この使用方法を示します。

例3-2 例外の抑制

...
TTCmd    myCmd;
TTStatus myStat(TTStatus::DO_NOT_THROW);

myCmd.ExecuteImmediate(&conn, "create table dummy (c1 int)", myStat);
if (myStat.rc == SQL_ERROR)
{
// handle the error
}
...

別の操作モードでは(推奨されていません)、TTClassesとアプリケーションをTTEXCEPTフラグを無効にしてコンパイルします。この場合、例外はスローされず、エラーを処理するにはメソッド・コール内のTTStatus&パラメータを使用する方法しかありません。この方法でコンパイルすると、より新しいメソッド・シグネチャは(TTStatus&パラメータなし)は利用できなくなります。

サブクラス

TTStatusには、次のサブクラスがあります。

- TTError

- TTWarning

TTError

TTErrorはTTStatusのサブクラスであり、ODBCエラー(リターン・コードSQL_ERROR、SQL_INVALID_HANDLE)をカプセル化するために使用されます。

TTWarning

TTWarningはTTStatusのサブクラスであり、ODBC警告(リターン・コードSQL_SUCCESS_WITH_INFO)をカプセル化するために使用されます。

ODBC警告(たとえば、RETURN RECEIPT警告)は、通常ODBCエラーほど重大ではないので、一般的は別のロジックを使用して処理する必要があります。ODBCエラーは、プログラムを記述して処理する必要があります。プログラムによるODBC警告の処理が保証される場合もありますが、通常は単純にログに記録するだけで十分です。

例3-3に、TTErrorサブクラスとTTWarningサブクラスの使用方法を示します。

例3-3 例外処理時のエラーと警告の区別

この例では、TTErrorとTTWarningの使用方法を示します。ODBCエラーでは、TTErrorオブジェクトがスローされます。ODBC警告では、TTWarningオブジェクトがスローされます。

// catching TTError & TTWarning exceptions

try {
// some TTClasses method calls
}
catch (TTWarning warn) {
cerr << "Warning encountered: " << warn << endl;
}
catch (TTError err) {
// handle the error; this could be a serious problem
}

パブリック・メンバー

メンバー

説明

rc

失敗したODBCコールからのリターン・コード(SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_ERROR、SQL_NO_DATA_FOUNDまたはSQL_INVALID_HANDLE)です

native_error

ODBCコールに失敗した場合のTimesTenネイティブ・エラー番号(存在する場合)です

odbc_error

ODBCコールに失敗した場合のODBCエラー状態です

err_msg

ODBCコールに失敗した場合のASCII形式の出力可能なエラー・メッセージです

TTSTATUS_ENUM

エラー・ステータスおよびエラー処理の列挙です
TTStatusオブジェクトを初期化し、メソッド・コールの例外を抑制するには値TTStatus::DO_NOT_THROWを使用します。例3-2を参照してください。

パブリック・メソッド

メソッド

説明

isConnectionInvalid()

データベース接続が無効であるかどうかを示します。

ostream()

エラーをストリームに出力します。

throwError()

TTStatusオブジェクトからエラーをスローします(一般的には使用しません)。

isConnectionInvalid()

bool isConnectionInvalid() const

データベース接続が無効の場合はTRUEを返し、有効の場合はFALSEを返します。無効とは、具体的にはTimesTenエラー846または994が発生したときのことを意味します。それらのエラーの詳細は、『Oracle TimesTen In-Memory Databaseエラー・メッセージおよびSNMPトラップ』のエラー0から999に関する説明を参照してください。

ostream()

friend ostream& operator<<(ostream&, TTStatus& stat)

このメソッドでは、エラーをストリームに出力します。

throwError()

void throwError()

これは標準的ではない、例外をスローする代替の方法です。多くの場合、次の2つのコードのブロックは同等ですが、前者の方がより標準的です。

try {
// ...
if (/* something has gone wrong */)
throw stat;
}
catch (TTStatus st) {
cerr << "Caught exception: " << st << endl;
}

または

try {
// ...
if (/* something has gone wrong */)
stat.throwError();
}
catch (TTStatus st) {
cerr << "Caught exception: " << st << endl;
}

TTConnection

TTConnectionクラスは、データベースに対する接続という概念をカプセル化します。TTConnectionは、ODBC接続ハンドル(SQLHDBC)の付加価値C++ラッパーと考えることができます。

使用方法

TimesTenを使用するすべてのアプリケーションは、1つ以上のTTConnectionオブジェクトを作成する必要があります。

同時に複数のスレッドからTimesTenを使用するマルチスレッド・アプリケーションでは、TTConnectionオブジェクトを複数作成する必要があります。次のいずれかの方法を使用します。

- スレッドの作成時に、各スレッドに1つのTTConnectionオブジェクトを作成します。

- アプリケーション・プロセスの開始時に、TTConnectionオブジェクトのプールを作成します。それらはプロセス内の複数のスレッドで共有されます。このオプションの詳細は、「TTConnectionPool」を参照してください。

TimesTen接続は、親プロセスから継承できません。プロセスが、子プロセスを作成する(分岐)前にデータベース接続を開いた場合、子が同じ接続を使用することはできません。子が親のデータベース接続を使用しようとすると、アプリケーションが失敗したりコア・ダンプが発生する場合があります。

接続および切断は、比較的負荷の高い操作であるため、アプリケーションでは頻繁にデータベース接続を行ったり、切断しないようにする必要があります。また、短期間の接続では準備済文のメリットがなくなります。そのかわりに、アプリケーション・プロセスの開始時にデータベース接続を確立し、そのプロセスの存続中はそれを再利用します。

「TTCmd、TTConnectionおよびTTConnectionPoolの使用」も参照してください。

注意:
基礎となるODBC接続オブジェクトを直接操作する必要がある場合は、TTConnection::getHdbc()メソッドを使用します。

データベースに接続する権限は、CREATE SESSION権限を使用して、直接またはPUBLICロールを介してユーザーに付与する必要があります。「接続のアクセス制御」を参照してください。

パブリック・メンバー

メンバー

説明

DRIVER_COMPLETION_ENUM

接続先データベースの指定を求めるプロンプトを表示するかどうかを指定します(これは、接続文字列でデータベースが指定されているかどうかにも左右されます)。
有効な値は、TTConnection::DRIVER_NOPROMPT、TTConnection::DRIVER_COMPLETE、TTConnection::DRIVER_PROMPTおよびTTConnection::DRIVER_COMPLETE_REQUIREDです。これらは、標準のODBC SQLDriverConnect関数のSQL_DRIVER_NOPROMPT、SQL_DRIVER_COMPLETE、SQL_DRIVER_PROMPTおよびSQL_DRIVER_COMPLETE_REQUIREDの値と対応します。

パブリック・メソッド

メソッド

説明

Commit()

データベースにトランザクションをコミットします。

Connect()

新しいデータベース接続を開きます。

Disconnect()

データベース接続を閉じます。

DurableCommit()

データベースに対する永続コミット操作を実行します。

getHdbc()

この接続と関連付けられているODBC接続ハンドル(型SQLHDBC)を返します。

GetTTContext()

接続のコンテキスト値を返します。

isConnected()

オブジェクトがTimesTenに接続されている場合はTRUEを返します。

Rollback()

最後のCommit()またはRollback()へのコールの後に、この接続を介して行われたデータベースの変更をロールバックします。

SetAutoCommitOff()

接続の自動コミットを無効にします。

SetAutoCommitOn()

接続の自動コミットを有効にします。

SetIsoReadCommitted()

接続のトランザクション分離レベルをTXN_READ_COMMITTEDに設定します。

SetIsoSerializable()

接続のトランザクション分離レベルをTXN_SERIALIZABLEに設定します。

SetLockWait()

TimesTen組込みプロシージャttLockWaitをコールして、接続のロック・タイムアウト間隔を設定します。

SetPrefetchCloseOff()

TT_PREFETCH_CLOSE接続オプションを無効にします。

SetPrefetchCloseOn()

TT_PREFETCH_CLOSE接続オプションを有効にします。これは、TimesTenへのクライアント/サーバー接続でのSELECT問合せのパフォーマンスを最適化する場合に有効です。

SetPrefetchCount()

TimesTen ODBCドライバSQLFetchコールがSELECT文をプリフェッチする行数をユーザー・アプリケーションによって調整できます。

Commit()

void Commit()

データベースにトランザクションをコミットします。これにより、Commit()またはRollback()メソッドへの最後のコール後に、接続で実行されたすべての操作がコミットされます。エラーが発生するとTTStatusオブジェクトが例外としてスローされます。「Rollback()」も参照してください。

Connect()

virtual void Connect(const char* connStr)
virtual void Connect(const char* connStr, const char* username,
const char* password)
virtual void Connect(const char* connStr, DRIVER_COMPLETION_ENUM driverCompletion)

新しいデータベース接続を開きます。connStrパラメータで指定された接続文字列を使用して接続が作成されます。ユーザーとパスワードを、接続文字列の一部、別のパラメータまたはDRIVER_COMPLETION_ENUM値として(「Publicメンバー」を参照)指定します。後述のメソッドDisconnect()も参照してください。

データベースに接続する権限は、CREATE SESSION権限を使用して、直接またはPUBLICロールを介してユーザーに付与する必要があります。「接続のアクセス制御」を参照してください。

例3-4 Connect()メソッドの使用およびエラーの確認

エラーが発生するとTTStatusオブジェクトが例外としてスローされます。すべての例外の警告は通常は情報を示すもので、通常は無視しても問題ありません。Connect()メソッドを使用する場合は、次のロジックの使用が推奨されます。

TTWarningとTTErrorは、TTStatusのサブクラスです。

TTConnection conn;
...

try {
conn.Connect("DSN=mydsn", "myuser", "mypassword");
}
catch (TTWarning warn) {
// warnings from Connect() are usually informational
cerr << ''Warning while connecting to TimesTen: '' << warn << endl;
}
catch (TTError err) {
// handle the error; this could be a serious problem
}

Disconnect()

void Disconnect()

データベース接続を閉じます。エラーが発生するとTTStatusオブジェクトが例外としてスローされます。前述のメソッドConnect()も参照してください。

DurableCommit()

void DurableCommit()

データベースに対する永続コミット操作を実行します。永続コミット操作により、インメモリー・トランザクション・ログ・バッファがディスクにフラッシュされます。このメソッドでは、TimesTen組込みプロシージャttDurableCommitがコールされます。

詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のttDurableCommitに関する説明を参照してください。

getHdbc()

SQLHDBC getHdbc()

この接続と関連付けられているODBC接続ハンドルを返します。

GetTTContext()

void GetTTContext(char* output)

各データベース接続に一意な値である接続のコンテキスト値を返します。接続のコンテキストは、たとえば、TimesTenのttStatusユーティリティを使用し、TimesTen接続をPID(プロセスID)と関連付けるために使用できます。

コンテキスト値は、outputパラメータを介して返されます(CHAR[17]以上の配列が必要です)。

このメソッドにより、TimesTen組込みプロシージャttContextがコールされます。詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のttContextに関する説明を参照してください。

isConnected()

bool isConnected()

オブジェクトが(Connect()メソッドによって)TimesTenに接続されている場合はTRUE、そうでない場合はFALSEを返します。

Rollback()

void Rollback()

トランザクションをロールバック(取消)します。最後のCommit()またはRollback()へのコールの後に、この接続を介して行われたデータベースの変更は取り消されます。エラーが発生するとTTStatusオブジェクトが例外としてスローされます。「Commit()」も参照してください。

SetAutoCommitOff()

void SetAutoCommitOff()

接続の自動コミットを無効にします。後述のメソッドSetAutoCommitOn()も参照してください。

TimesTenは自動コミットが無効の場合にのみ最適なパフォーマンスで実行されるため、このメソッドはTTConnection::Connect()によって自動的にコールされます。

自動コミットが無効の場合、SELECT文をコミットするには、TTCmd::Close()を明示的にコールする必要があることに注意してください。

SetAutoCommitOn()

void SetAutoCommitOn()

接続の自動コミットを有効に設定します(つまり、すべてのSQL文を独自のトランザクションで実行します)。前述のメソッドSetAutoCommitOff()も参照してください。

TimesTenは、自動コミットが無効の場合、より迅速に実行されるので、SetAutoCommitOn()は一般的には推奨されません。

SetIsoReadCommitted()

void SetIsoReadCommitted()

接続のトランザクション分離レベルをTXN_READ_COMMITTEDに設定します。コミット読取り分離レベルは、単一トランザクションのパフォーマンスと複数接続の優れた同時実行性という最善の組合せを提供します。後述のメソッドSetIsoSerializable()も参照してください。

SetIsoSerializable()

void SetIsoSerializable()

接続のトランザクション分離レベルをTXN_SERIALIZABLEに設定します。通常、シリアライズ可能分離レベルは個別のトランザクションでは優れたパフォーマンスを提供しますが、同時実行性はきわめて低下します。ほぼすべての状況下で、シリアライズ可能分離レベルよりもコミット読取り分離レベルの方が適切です。前述のメソッドSetIsoReadCommitted()も参照してください。

SetLockWait()

void SetLockWait(int secs)

TimesTen組込みプロシージャttLockWaitをパラメータ(secs)付きでコールして、接続のロック・タイムアウト時間を設定します。一般的には、ほとんどのアプリケーションでロックのタイムアウトには2秒または3秒で十分です。デフォルトのロック・タイムアウト時間は10秒です。

詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のttLockWaitに関する説明を参照してください。

SetPrefetchCloseOff()

void SetPrefetchCloseOff()

TT_PREFETCH_CLOSE接続オプションを無効にします。後述のメソッドSetPrefetchCloseOn()も参照してください。

SetPrefetchCloseOn()

void SetPrefetchCloseOn()

TT_PREFETCH_CLOSE接続オプションをオンにします(これは、クライアント/サーバー・アプリケーションでのシリアライズ可能トランザクションのSELECT問合せパフォーマンスを最適化する場合に便利です)。この方法は、TimesTenに直接接続するアプリケーションには何もメリットがないことに注意してください。前述のメソッドSetPrefetchCloseOff()も参照してください。

『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』のシリアライズ可能なトランザクションに対するTT_PREFETCH_CLOSEの有効化に関する説明を参照してください。

SetPrefetchCount()

void SetPrefetchCount(int numrows)

TimesTen ODBCドライバがSELECT文に対して内部で一度にフェッチする行数を、クライアント/サーバー・アプリケーションによって調整できます。numrowsの値の範囲は1から128である必要があります。

この方法は、TimesTenに直接接続するアプリケーションには何もメリットがないことに注意してください。

注意:
このメソッドは、TTCmd::FetchNext()を複数回実行することと同等ではありません。そのかわりに、このパラメータを適切に使用すると、TTCmd::FetchNext()の各コールにかかる時間が短縮されます。

TT_PREFETCH_COUNTの詳細は、『Oracle TimesTen In-Memory Database C開発者ガイド』の複数行のデータのプリフェッチに関する説明を参照してください。

TTConnectionPool

TTConnectionPoolクラスは、マルチスレッド・アプリケーションによって、接続のプールの管理に使用されます。

通常、マルチスレッド・アプリケーションは次のいずれかの方法を使用して作成します。

- スレッドの数が相対的に少なく、さらにスレッドの存続時間が長い場合は、アプリケーションの存続期間中使用される、異なる接続に各スレッドを割り当てることができます。この使用例では、TTConnectionPoolクラスは必要ありません。

- プロセス内のスレッドの数が多い場合、またはスレッドの存続時間が短い場合は、アイドル状態の接続のプールを確立します。これらの接続は、アプリケーションの存続期間使用されます。スレッドは、データベース・トランザクションを実行する必要がある場合、プールからアイドル状態の接続を確認し、そのトランザクションを実行して、接続をプールに返します。これは、TTConnectionPoolクラスを使用した使用例です。

コンストラクタには2種類の形式があります。

TTConnectionPool()

または

TTConnectionPool(const int size);

ここで、sizeはプールの最大接続数を指定します。これを指定しないと、最大接続数は128です。size設定を指定し、TimesTenのConnections属性に設定されている最大接続数よりも大きな値を指定した場合、接続数がConnectionsの値を超えるとエラーが発生することに注意してください。『Oracle TimesTen In-Memory Databaseリファレンス』の接続に関する説明を参照してください。

注意:
全体のパフォーマンスを最高にするには、データベース・サーバーのCPUごとにデータベースへの同時直接接続が1つか2つあるようにすることが推奨されます。同時直接接続の数(接続プールのサイズ)は、データベース・サーバーのCPU数の2倍は超えないようにしてください。ただし、クライアント/サーバー接続では、CPUごとにさらに多くの接続が効率的にサポートされます。

使用方法

アプリケーションは、TTConnectionPoolクラスを使用するために、クラスの単一のインスタンスを作成します。その後、TTConnectionクラスまたはユーザー・クラスのいずれかのインスタンスであるTTConnectionを拡張するオブジェクトをいくつか作成しますが、これではそのConnect()メソッドは直接にはコールしません。かわりに、アプリケーションではTTConnectionPool::AddConnectionToPool()メソッドを使用し接続オブジェクトをプールに配置し、その後TTConnectionPool::ConnectAll()をコールし、TimesTenへのすべての接続を確立します。バックグラウンドでは、ConnectAll()が、そのConnect()メソッドをコールするためにすべてのTTConnectionオブジェクト間をループします。

TimesTenアプリケーションのスレッドは、getConnection()メソッドとfreeConnection()メソッドを使用し、アイドル状態の接続を取得および返します。

「TTCmd、TTConnectionおよびTTConnectionPoolの使用」も参照してください。

重要:
TTConnectionPoolを使用しTTConnectionを拡張する場合、コール・シーケンスにdriverCompletionがあるTTConnection::Connect()メソッドは、(対応するTTConnectionPool::ConnectAll()メソッドがないため)オーバーライドしないようにする必要があります。かわりに、次のいずれかのConnect()メソッドをオーバーライドします。

virtual void Connect(const char* connStr)
virtual void Connect(const char* connStr, const char* username,
const char* password)

その後、適切な対応するConnectAll()メソッドを使用します。

データベースに接続する権限は、CREATE SESSION権限を使用して、直接またはPUBLICロールを介してユーザーに付与する必要があります。「接続のアクセス制御」を参照してください。

パブリック・メンバー

なし

パブリック・メソッド

メソッド

説明

AddConnectionToPool()

TTConnectionオブジェクト(おそらくはTTConnectionから導出されたクラスのオブジェクト)を接続プールに追加します。

ConnectAll()

すべてのTTConnectionオブジェクトを同時にTimesTenに接続します。

DisconnectAll()

接続プール内のすべての接続をTimesTenから切断します。

freeConnection()

別のスレッドへの再割当てができるよう、接続をプールに返します。

getConnection()

スレッドの接続プールからアイドル状態の接続を確認します。

getStats()

TTConnectionPoolオブジェクトに接続プールのステータス情報を問い合せます。

AddConnectionToPool()

int AddConnectionToPool(TTConnection* connP)

このメソッドは、TTConnectionオブジェクト(おそらくはTTConnectionから導出されたクラスのオブジェクト)を接続プールに追加するために使用します。エラーがない場合は、-1が返されます。「freeConnection()」も参照してください。

ConnectAll()

void ConnectAll(const char* connStr)
void ConnectAll(const char* connStr, const char* username, const char* password)

AddConnectionToPool()によってアプリケーションのすべてのTTConnectionオブジェクトが接続プールに追加された後、ConnectAll()メソッドを使用して、すべてのTTConnectionオブジェクトを同時にTimesTenに接続できます。connStrパラメータで指定された接続文字列を使用して接続が作成されます。ユーザーとパスワードを、接続文字列の一部または別のパラメータとして指定します。次のメソッドDisconnectAll()も参照してください。

エラーが発生するとTTStatusオブジェクトが例外としてスローされます。

データベースに接続する権限は、CREATE SESSION権限を使用して、直接またはPUBLICロールを介してユーザーに付与する必要があります。「接続のアクセス制御」を参照してください。

DisconnectAll()

void DisconnectAll()

接続プール内のすべての接続をTimesTenから切断します。前述のメソッドConnectAll()も参照してください。

アプリケーションでは、プロセス障害の分析とリカバリに関連するオーバーヘッドを回避するために、終了の前にDisconnectAll()をコールする必要があります。エラーが発生するとTTStatusオブジェクトが例外としてスローされます。

freeConnection()

void freeConnection(TTConnection* connP)

別のスレッドへの再割当てができるよう、接続をプールに返します。アプリケーションでは、トランザクション中の接続を解放しないでください。TTConnection::Commit()またはRollback()は、TTConnectionオブジェクトがfreeConnection()に渡される直前にコールされる必要があります。「AddConnectionToPool()」も参照してください。

getConnection()

TTConnection* getConnection(int timeout_millis=0)

接続プールからスレッドで使用するアイドル状態の接続があるかを確認します。アイドル状態のTTConnectionオブジェクトへのポインタが返されます。スレッドはその後、トランザクションを実行し、Commit()またはRollback()のいずれかでそれを終了してから、freeConnection()メソッドを使用して接続をプールに返します。

プール内にアイドル状態の接続がない場合は、freeConnection()のコールによって接続がプールに返されるまで、getConnection()をコールするスレッドがブロックされます。オプションのタイムアウトをミリ秒単位で指定できます。これが指定された場合、getConnection()は、最大でtimeout_millisミリ秒間、使用可能な接続を待機します。その時間内に使用可能な接続がなかった場合、getConnection()はコール元にNULLを返します。

getStats()

void getStats(int* nGets, int* nFrees, int* nWaits, int* nTimeouts,
int* maxInUse, int* nForcedCommits)

TTConnectionPoolにステータス情報を問い合せます。次のデータが返されます。

- nGets: getConnection()に対するコール数

- nFrees: freeConnection()に対するコール数

- nWaits: 接続が返されるまでgetConnection()に対するコールが待機する必要があった回数

- nTimeouts: タイムアウトしたgetConnection()に対するコール数

- maxInUse: 同時に使用された接続の最大数の最高水準

- nForcedCommits: freeConnection()によって接続がプールにチェックインされる前に、その接続に対してCommit()をコールする必要があった回数
このカウンタが0(ゼロ)以外の場合は、ユーザー・アプリケーションが接続をプールに返す前にTTConnection::Commit()またはRollback()をコールしていません。

TTCmd

TTCmdオブジェクトは、アプリケーション・プログラムで複数回使用される単一のSQL文をカプセル化します。TTCmdは、ODBC文(SQLHSTMT)ハンドルの付加価値C++ラッパーとみなすことができます。

TTCmdには、次の3種類のパブリック・メソッドがあります。

- 一般的な用途のバッチ以外の操作用のパブリック・メソッド

- TTCmdオブジェクトのプロパティを取得するためのパブリック・メソッド

- バッチ操作のためのパブリック・メソッド

重要:
いくつかのTTCmdメソッドは、ODBCドライバ・マネージャとともに使用するとエラーを返します。詳細は、「ODBCドライバ・マネージャ使用時の考慮事項(Windows)」を参照してください。

使用方法

プログラムで複数回実行される各SQL文には、独自のTTCmdオブジェクトが必要です。これらのTTCmdオブジェクトは、プログラムの初期化時にそれぞれ1回準備され、プログラムの実行時にExecute()メソッドで複数回実行されます。

ExecuteImmediate()メソッドは、少数回のみ実行する必要のあるデータベース操作でのみ使用します。ExecuteImmediate()はどのタイプのSELECT文とも互換性がないことに注意してください。かわりに、すべての問合せでPrepare()とExecute()を使用する必要があります。また、ExecuteImmediate()は、後で、挿入、更新または削除された行数を調べるために、getRowcount()を使用してポーリングされるINSERT、UPDATEまたはDELETE文とも互換性がありません。これらの制限は、一部の特別な状況(表の作成または削除など)を除き、ExecuteImmediate()の使用を避けるために課されています。

「TTCmd、TTConnectionおよびTTConnectionPoolの使用」も参照してください。

注意:
基礎となるODBC文を直接操作する必要がある場合は、TTCmd::getHandle()メソッドを使用してください。

TimesTenには、表、ビュー、マテリアライズド・ビュー、順序およびシノニムなどのデータベース・オブジェクトについて、オブジェクトレベルの解決法でデータベース・アクセスを制御する機能が含まれています。「アクセス制御に関するTimesTen機能の考慮事項」を参照してください。

パブリック・メンバー

メンバー

説明

TTCMD_PARAM_INPUTOUTPUT_TYPE

これは、パラメータの登録時、そのパラメータが入力、出力または入力/出力のどれかを指定するために使用します。サポートされる値は、PARAM_IN、PARAM_INOUTおよびPARAM_OUTです。「パラメータの登録」を参照してください。

一般的な用途のバッチ以外の操作用のパブリック・メソッド

メソッド

説明

Close()

アプリケーションでの行のフェッチが終了したら、結果セットを閉じます。

Drop()

準備済のSQL文とそれに関連付けられたすべてのリソースを解放します。

Execute()

実行のために準備されたSQL文を起動します。

ExecuteImmediate()

事前に準備されていないSQL文を起動します。

FetchNext()

結果セットの行を1行ずつフェッチします。行のフェッチに成功した場合は0を、フェッチする行がなくなった場合は1を返します。

getColumn()

結果セットの現在の行の指定した列の値を取得します。

getColumnLength()

指定された列の長さをバイト単位で返します。

getColumnNullable()

結果セットの現在の行の指定した列の値を取得し、値がNULL値であるかどうかを示すブールを返します。

getHandle()

基礎となるODBC文ハンドルを取得します。

getMaxRows()

SELECT文によって返される行の数の現在の制限を返します。

getNextColumn()

結果セットの現在の行の次の列の値を取得します。

getNextColumnNullable()

結果セットの現在の行の次の列の値を取得し、値がNULL値であるかどうかを示すブールを返します。

getParam()

準備済のSQL文の実行後、各コールは指定した出力または入力/出力パラメータの出力値を取得します。

getQueryThreshold()

問合せのしきい値を取得します。

getRowCount()

最近実行されたSQL操作の影響を受けた行の数を返します。

isColumnNull()

現在の列の指定した行値がNULLであるかどうかを示します。

Prepare()

SQL文とTTCmdオブジェクトを関連付けます。

printColumn()

現在の行の指定した列の値を出力ストリームに出力します。

registerParam()

バインド用にパラメータを登録します。これは、入力または入力/出力パラメータで必要です。

RePrepare()

準備済文の文ハンドルが無効化された場合、これによって文を再準備できます。

setMaxRows()

SELECT文によって返される行の数に制限を設定します。

setParam()

準備済のSQL文を実行する前に、各コールは指定したパラメータの値を設定します。

setParamLength()

指定した入力パラメータの長さをバイト単位で設定します。

setParamNull()

準備済のSQL文を実行する前にパラメータの値をNULLに設定します。

setQueryThreshold()

各SQL文の実行時間制限のしきい値を設定します。これを超過した場合、サポート・ログに警告が書き込まれ、SNMPトラップがスローされます。

setQueryTimeout()

SQL文のタイムアウト値を設定します。

Close()

void Close()

Execute()メソッドを使用してSQL SELECT文を実行すると、結果セットから行をフェッチするために使用できるカーソルがオープンされます。アプリケーションが結果セットから行をフェッチし終えたら、Close()メソッドを使用してクローズする必要があります。

結果セットを閉じることに失敗すると、行のロックが保持される時間が長くなりすぎるため、同時実行性の問題、メモリー・リークおよびその他のエラーが発生する可能性があります。

エラーが発生するとTTStatusオブジェクトが例外としてスローされます。

Drop()

void Drop()

準備済のSQL文を今後使用しない場合は、Drop()メソッドをコールして、その文とそれに関連付けられたリソースを解放できます。再度Prepare()をコールすると、TTCmdオブジェクトを別の文に再利用できます。

複数のTTCmdオブジェクトを使用して複数のSQL文を実行した方が、より効率的です。特定のSQL文を今後使用しない場合にのみ、Drop()メソッドを使用してください。

エラーが発生するとTTStatusオブジェクトが例外としてスローされます。

Execute()

void Execute()

setParam()コールで必要なパラメータ値を定義後、このメソッドは、Prepare()メソッドを使用して実行されるよう事前準備されたSQL文を起動します。エラーが発生するとTTStatusオブジェクトが例外としてスローされます。

SQL文がSELECT文の場合は、このメソッドによって問合せが実行されますが、結果セットから行が返されません。FetchNext()メソッドを使用すると、結果セットから一度に1行ずつフェッチされます。該当するすべての行がフェッチされたら、Close()メソッドを使用して結果セットを閉じます。SELECT以外のSQL文の場合は、カーソルがオープンされないため、Close()メソッドをコールする必要はありません。

TimesTenには、表、ビュー、マテリアライズド・ビュー、順序およびシノニムなどのデータベース・オブジェクトについて、オブジェクトレベルの解決法でデータベース・アクセスを制御する機能が含まれています。アクセス制御の権限は、データベースでSQLが準備されるときと実行されるときの両方で確認され、パフォーマンス・コストの大部分は準備時に発生します。「アクセス制御に関するTimesTen機能の考慮事項」を参照してください。

ExecuteImmediate()

int ExecuteImmediate(TTConnection* cP, const char* sqlp)

このメソッドは、事前に準備されていないSQL文を起動します。

少数回のみ実行されるSQL文については、Prepare()およびExecute()のかわりにExecuteImmediate()を使用すると便利です。DDL文(CREATE TABLE、DROP TABLEなど)や、使用頻度が低く結果セットを返さないDML文(DELETE FROM table_nameなど)にExecuteImmediate()を使用します。

ExecuteImmediate()は、結果セットを返すSQL文と互換性がありません。また、ExecuteImmediate()によって実行された文は、後でgetRowCount()(DML操作によって影響を受けた行の数を取得する)を使用して問い合せることができません。このため、ExecuteImmediate()は自動的にgetRowCount()をコールし、その値がこのメソッドの整数の戻り値となります。

エラーが発生するとTTStatusオブジェクトが例外としてスローされます。

FetchNext()

int FetchNext()

Execute()メソッドを使用して準備済のSQL SELECT文を実行した後、FetchNext()メソッドを使用して、結果セットから一度に1行ずつフェッチします。

結果セットから1行をフェッチした後に、オーバーロードされた適切なgetColumn()メソッドを使用して、現在の行から値をフェッチします。

結果セットに行がなくなると、FetchNext()は1を返します。行が返されると、FetchNext()は0を返します。

Execute()メソッドを使用してSELECTを実行した後、要求されるすべての行がフェッチされてから、Close()メソッドで結果セットを閉じる必要があります。Close()メソッドをコールした後は、FetchNext()メソッドを使用して結果セットからそれ以上の行をフェッチできないことに注意してください。

エラーが発生するとTTStatusオブジェクトが例外としてスローされます。

getColumn()

void getColumn (int cno, TYPE* valueP)
void getColumn (int cno, TYPE* valueP, int* byteLenP)

getColumn()メソッドおよびgetColumnNullable()メソッドでは、結果セットの現在の行の列の値をフェッチできます。getColumn()またはgetColumnNullable()をコールする前に、FetchNext()メソッドをコールして、SELECT文の結果セットの次の(または最初の)行をフェッチする必要があります。SQL文はExecute()メソッドを使用して実行されます。

各getColumn()コールは、特定の列に関連付けられた値を返します。列は序数で参照され、1はSELECT文で指定された最初の列を示します。すべての場合において、getColumn()メソッドに渡される最初の引数cnoは、値がフェッチされる列の序数です。2番目の引数valuePは、指定された列の値を保存する変数のポインタです。この引数の型は、返される列の型に依存します。表に示すとおり、NCHAR、NVARCHARおよびバイナリ型については、メソッド・コールでbyteLenPを指定します(これは、valuePバッファに書き込まれるバイト数の整数値へのポインタです)。

TTClassesライブラリは、大規模なデータ型の変換セットをサポートしません。準備済のSQLの出力列ごとに、適切なバージョンのgetColumn()をコールする必要があります。誤ったバージョンをコールする(たとえば、整数の列をchar*値にフェッチしようとする)と、例外がスローされます(TTStatusオブジェクト)。

NUMBER列から整数型のデータをフェッチする場合、getColumn()では、SQLTINYINT、SQLSMALLINT、SQLINTEGERおよびSQLBIGINTのバージョンがサポートされています。これらは、スケール・パラメータが0に設定された、NUMBER(p)またはNUMBER(p,0)などのNUMBERフィールドのみに適しています。前述の関数の精度範囲を次に示します。

関数

精度範囲

SQLTINYINT

0<=p<=2

SQLSMALLINT

0<=p<=4

SQLINTEGER

0<=p<=9

SQLBIGINT

0<=p<=18

アプリケーションがデータベースから情報を取得するために使用する変数に列内のすべての値が収まるようにするには、データ型NUMBER(p)のすべての表列に対してSQLBIGINTを使用します(ここで、0 <= p <= 18です)。次に例を示します。

getColumn(int cno, SQLBIGINT* iP)

表3-2には、サポートされるTimesTenの列型と、各パラメータ型での使用に適したgetColumn()とgetColumnNullable()のバージョンを示します。

表3-2 サポートされるTimesTenの表の列型のgetColumn()のバージョン

データ型

サポートされるgetColumn()のバージョン

TT_TINYINT

getColumn(cno, SQLTINYINT* iP)

TT_SMALLINT

getColumn(cno, SQLSMALLINT* iP)

TT_INTEGER

getColumn(cno, SQLINTEGER* iP)

TT_BIGINT

getColumn(cno, SQLBIGINT* iP)

BINARY_FLOAT

getColumn(cno, float* fP)

BINARY_DOUBLE

getColumn(cno, double* dP)

NUMBER

TT_DECIMAL

getColumn(cno, char** cPP)

getColumn(cno, char* cP)

getColumn(cno, SQLTINYINT* iP)

getColumn(cno, SQLSMALLINT* iP)

getColumn(cno, SQLINTEGER* iP)

getColumn(cno, SQLBIGINT* iP)

注意: char*バージョンの場合、TTClassesは事前に割り当てられた記憶域の配列に渡すことが可能であり、TTClassesはデータベースからフェッチされたchar出力をこの配列にコピーします。整数型のメソッドは、スケール・パラメータが0(ゼロ)で宣言された列にのみ適しています。

TT_CHAR

CHAR

TT_VARCHAR

VARCHAR2

getColumn(cno, char** cPP)

getColumn(cno, char* cP)

注意: char*バージョンでは、出力バッファの事前割当てが可能です。

TT_NCHAR

NCHAR

TT_NVARCHAR

NVARCHAR2

getColumn(cno, SQLWCHAR** wcPP)

getColumn(cno, SQLWCHAR** wcPP, byteLenP)

注意: オプションで、返される値のバイト数に関するbyteLenPパラメータを使用します。

BINARY

VARBINARY

getColumn(cno, void** binPP, byteLenP)

getColumn(cno, void* binP, byteLenP)

注意: void*バージョンでは、出力バッファの事前割当てが可能です。

DATE

TT_TIMESTAMP

TIMESTAMP

getColumn(cno, TIMESTAMP_STRUCT* tsP)

TT_DATE

getColumn(cno, DATE_STRUCT* dP)

TT_TIME

getColumn(cno, TIME_STRUCT* tP)

このリリースのTTClassesライブラリでは、他のTimesTen表列型はサポートされていません。

getColumnLength()

int getColumnLength(int cno)

NULL終了文字はカウントされない、現在の行の列番号cnoの値の長さをバイト単位で返します。また、値がNULLの場合はSQL_NULL_DATAが返されます。(ODBCに精通している場合、これはSQLFetchへのコール後SQLBindColから最後のパラメータpcbValueにODBCによって保存される値です。)NULLでない値がある場合、0から行の精度の間の長さが返されます。「getColumnPrecision()」を参照してください。

たとえば、VARCHAR2(25)列を考えてみてください。この値がNullの場合、返される長さは-1になります。この値がabcdeの場合、返される長さは5になります。

このメソッドは、CHAR、VARCHAR2、NCHAR、NVARCHAR2、BINARYおよびVARBINARY型の列にアクセスする場合のみ通常役立ちます。

getColumnNullable()

bool getColumnNullable(int cno, TYPE* valueP)
bool getColumnNullable(int cno, TYPE* valueP, int* byteLenP)

getColumnNullable()メソッドはgetColumn()メソッドと類似しており、前述の表3-2のとおり同じデータ型およびシグネチャをサポートしています。ただし、getColumnNullable()メソッドはgetColumn()の動作に加え、値がSQLのNULL疑似値であるかどうかを示すブールを返します。値がNULLである場合、2番目のパラメータは特徴的な値(-9999など)に設定され、メソッドの戻り値はTRUEとなります。値がNULLでない場合、2番目のパラメータが指す変数を介して値は返され、getColumnNullable()メソッドによってFALSEが返されます。

getHandle()

SQLHSTMT getHandle()

基礎となるODBC文オブジェクトを操作する必要がある場合、このメソッドを使用して文ハンドルを取得します。

getMaxRows()

int getMaxRows()

このメソッドは、SELECT文によってこのTTCmdオブジェクトから返される行数について現在設定されている上限を返します。戻り値0は、すべての行が返されることを示します。「setMaxRows()」も参照してください。

getNextColumn()

void getNextColumn(TYPE* valueP)
void getNextColumn(TYPE* valueP, int* byteLenP)

getNextColumn()メソッドおよびgetNextColumnNullable()メソッドでは、結果セットの現在の行の次の列の値がフェッチされます。getNextColumn()またはgetNextColumnNullable()をコールする前に、FetchNext()メソッドをコールして、SELECT文の結果セットの次の(または最初の)行をフェッチする必要があります。getNextColumn()を使用する場合、列は順番にフェッチされます。フェッチする順番は変更できません。

サポートされるSQLのデータ型および各データ型の適切なメソッド・バージョンについては、表3-2を参照してください。この情報は、getNextColumn()に使用できますが、getNextColumn()には列番号パラメータはありません。

getNextColumnNullable()

bool getNextColumnNullable(TYPE* valueP)
bool getNextColumnNullable(TYPE* valueP, int* byteLenP)

getNextColumnNullable()メソッドは、getNextColumn()メソッドに類似しています。ただし、getNextColumnNullable()メソッドはgetNextColumn()の動作に加え、値がSQLのNULL疑似値であるかどうかを示すブールを返します。値がNULLである場合、2番目のパラメータは特徴的な値(-9999など)に設定され、メソッドの戻り値はTRUEとなります。値がNULLでない場合、2番目のパラメータが指す変数を介して値が返され、メソッドはFALSEを返します。getNextColumnNullable()を使用する場合、列は順番にフェッチされます。フェッチする順番は変更できません。

サポートされるSQLのデータ型および各データ型の適切なメソッド・バージョンについては、表3-2を参照してください。この情報は、getNextColumnNullable()に使用できますが、getNextColumnNullable()には列番号パラメータはありません。

getParam()

bool getParam(int pno, TYPE* valueP)
bool getParam(int pno, TYPE* valueP, int* byteLenP)

各getParam()バージョンは、準備済のSQL文の実行後、パラメータ番号で指定した出力または入力/出力パラメータの値を取得するために使用します。SQL文は、使用前にPrepare()メソッドで準備され、Execute()メソッドで実行されます。getParam()メソッドは、文の実行後、各出力パラメータに適切なデータ型の変数を提供するために使用します。

getParam()に最初に渡される引数は、出力値のパラメータの位置です。SQL文の最初のパラメータはパラメータ1です。getParam()に2番目に渡される引数は、出力値の変数です。オーバーロードされたバージョンのgetParam()は、2番目の引数で様々なデータ型を受け入れます。

getParam()メソッドは、表3-2のgetColumn()で説明しているものと同じデータ型をサポートしています。表に示すとおり、NCHAR、NVARCHARおよびバイナリ型については、メソッド・コールでbyteLenPを指定します(これは、パラメータ値内のバイト数の整数値へのポインタです)。

getParam()では、パラメータ値がNULLの場合はTRUEを返し、それ以外の場合はFALSEを返します。

TTClassesライブラリは、大規模なデータ型の変換セットをサポートしません。準備済のSQLの出力パラメータごとに、オーバーロードされた適切なバージョンのgetParam()をコールする必要があります。誤ったバージョンをコールする(たとえば、整数パラメータをchar*値に使用しようとする)と、プログラム障害が発生するおそれがあります。

getParam()の使用方法の詳細は、「出力または入力/出力パラメータのバインド」を参照してください。

REF CURSORについては、REF CURSOR(データ型SQL_REFCURSOR)の文ハンドルとしてTTCmdオブジェクトを使用できるよう、次のシグネチャがサポートされています。情報および例については、「REF CURSORの使用」を参照してください。

bool getParam(int pno, TTCmd** rcCmd)

getQueryThreshold()

int getQueryThreshold()

「setQueryThreshold()」で説明した、TTCmdオブジェクトのしきい値を返します。

setQueryThreshold()で値が設定されていない場合、このメソッドはODBC接続オプションTT_QUERY_THRESHOLD(設定されている場合)の値またはTimesTenの一般接続属性QueryThresholdを返します。

getRowCount()

int getRowCount()

このメソッドをExecute()の直後にコールして、実行されたSQL操作の影響を受けた行の数を返すことができます。たとえば、10行を削除するDELETE文が実行された後には、getRowCount()は10を返します。

isColumnNull()

bool isColumnNull(int cno)

このメソッドでも、現在の行の列番号cnoの値がNULLであるかどうかを判断できます(そうである場合はTRUE、そうでない場合はFALSEを返します)。

「getColumnNullable()」メソッドの情報も参照してください。

Prepare()

void Prepare(TTConnection* cP, const char* sqlp)

このメソッドは、SQL文とTTCmdオブジェクトを関連付けます。2つのパラメータを使用します。

- TTConnectionオブジェクトへのポインタ
TTConnection::Connect()をコールし、接続オブジェクトをデータベースに接続する必要があります。

- 準備されているSQL文のconst char*パラメータ

TimesTenには、表、ビュー、マテリアライズド・ビュー、順序およびシノニムなどのデータベース・オブジェクトについて、オブジェクトレベルの解決法でデータベース・アクセスを制御する機能が含まれています。アクセス制御の権限は、データベースでSQLが準備されるときと実行されるときの両方で確認され、パフォーマンス・コストの大部分は準備時に発生します。「アクセス制御に関するTimesTen機能の考慮事項」を参照してください。

注意:

- クライアント/サーバー接続を使用している場合に、クライアントとサーバー間の不要なラウンドトリップを回避するために、Prepare()メソッドによって遅延準備と呼ばれる処理が実行され、リクエストは要求されるまでサーバーに送信されません。詳細は、『Oracle TimesTen In-Memory Database C開発者ガイド』のTimesTenの遅延準備に関する説明を参照してください。

- デフォルトでは(接続属性がPrivateCommands=0の場合)、TimesTenは準備されたSQL文を接続間で共有するため、それ以降の別の接続での同じSQL文の準備はすばやく実行されます。

printColumn()

void printColumn(int cno, STDOSTREAM& os, const char*  nullString) const

このメソッドでは、出力ストリームosに現在の行の列番号値cnoを出力します。これは、デバッグまたはデモ・プログラム用に使用します。nullStringでは、列値がNULLの場合(たとえばNULLまたは?)の場合、何を出力するかを指定します。

registerParam()

void registerParam(int pno, TTCMD_PARAM_INPUTOUTPUT_TYPE inputOutputType,
int sqltype)
void registerParam(int pno, TTCMD_PARAM_INPUTOUTPUT_TYPE inputOutputType,
int sqltype, int precision)
void registerParam(int pno, TTCMD_PARAM_INPUTOUTPUT_TYPE inputOutputType,
int sqltype, int precision, int scale)

このメソッドは、バインド用のパラメータを登録するために使用します。これは出力および入力/出力パラメータで必要で、SQLデータ型、精度(該当する場合、データ型で使用される最大桁数)、スケール(該当する場合、小数点以下の最大桁数)を必要に応じて指定するためにも使用できます。「パラメータの登録」を参照してください。

RePrepare()

void RePrepare(TTConnection* cP)

このメソッドは文を再準備します。これは、SQL文が参照する表が変更されたなど、準備済文の文ハンドルが無効の場合にのみ有効です。「Prepare()」も参照してください。

setMaxRows()

void setMaxRows(const int nMaxRows)

このメソッドは、SELECT文によって返される行数に制限を設定します。結果セット内の行数が設定された上限を超過すると、リクエストされた設定サイズの最後の行のフェッチ後にTTCmd::FetchNext()メソッドによって1が返されます。「getMaxRows()」も参照してください。

デフォルトでは、すべての行が返されます。すべての行を返すように制限をリセットするには、nMaxRowsを0に設定してsetMaxRows()をコールします。この制限はSELECT文に対してのみ意味があります。

setParam()

void setParam(int pno, TYPE value)
void setParam(int pno, TYPE* valueP)
void setParam(int pno, TYPE* valueP, int byteLen)

この項では、オーバーロードされたすべてのsetParam()バージョンについて説明します。

各setParam()バージョンは、準備済のSQL文を実行する前に、パラメータ番号で指定したパラメータの値を設定するために使用されます。SQL文は、使用前にPrepare()メソッドで準備され、Execute()メソッドで実行されます。SQL文にパラメータ・マーカー(リテラル定数が有効である位置で使用される?文字)が含まれている場合、そのSQL文を実行するには、それらのパラメータに値を割り当てる必要があります。文を実行する前に、setParam()メソッドを使用して各パラメータの値を定義します。詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス・ガイド』の動的パラメータに関する説明を参照してください。

setParam()に最初に渡される引数は、設定されるパラメータの位置です。SQL文の最初のパラメータはパラメータ1です。setParam()に2番目に渡される引数はパラメータの値です。オーバーロードされたバージョンのsetParam()は、2番目の引数で様々なデータ型を受け入れます。

TTClassesライブラリは、大規模なデータ型の変換セットをサポートしません。準備済のSQLのパラメータごとに、オーバーロードされた適切なバージョンのsetParam()をコールする必要があります。誤ったバージョンをコールする(たとえば、整数パラメータをchar*値に設定しようとする)と、プログラム障害が発生するおそれがあります。

setParam()に渡された値は、TTCmdオブジェクトによってメンテナンスされる内部バッファにコピーされます。これらのバッファは静的に割り当てられ、Prepare()メソッドによってバインドされます。パラメータ値はsetParam()のコール時にsetParam()に渡される値であって、後続のExecute()メソッドのコール時の値ではありません。

表3-3に、サポートされるSQLデータ型と、各型での使用に適したsetParam()のバージョンを示します。表に示されていないSQLデータ型は、このバージョンのTTClassesではサポートされていません。表に示すとおり、NCHAR、NVARCHARおよびバイナリ型については、メソッド・コールでbyteLenを指定します(これは、パラメータ値内のバイト数の整数値です)。

setParam()の使用方法の詳細は、「入力パラメータのバインド」および「出力または入力/出力パラメータのバインド」を参照してください。重複するパラメータおよびTimesTenモードとOracleモードでのその処理の違いの詳細は、「重複パラメータのバインド」を参照してください。

注意:

- バインドされたパラメータの値の長さを設定する方法は、「setParamLength()」を参照してください。

- バインドされたパラメータにNULL値を設定する方法は、「setParamNull()」を参照してください。

表3-3 サポートされるTimesTenの表の列型のsetParam()のバージョン

データ型

サポートされるsetParam()のバージョン

TT_TINYINT

setParam(pno, SQLTINYINT value)

TT_SMALLINT

setParam(pno, SQLSMALLINT value)

TT_INTEGER

setParam(pno, SQLINTEGER value)

TT_BIGINT

setParam(pno, SQLBIGINT value)

BINARY_FLOAT

REAL

setParam(pno, float value)

BINARY_DOUBLE

DOUBLE

setParam(pno, double value)

NUMBER

TT_DECIMAL

setParam(pno, char* valueP)

setParam(pno, const char* valueP)

setParam(pno, SQLCHAR* valueP)

setParam(pno, SQLTINYINT value)

setParam(pno, SQLSMALLINT value)

setParam(pno, SQLINTEGER value)

setParam(pno, SQLBIGINT value)

注意: 整数のバージョンは、たとえばNUMBER(8)やNUMBER(8,0)など、スケール・パラメータが0(ゼロ)で宣言された列にのみ適しています。

TT_CHAR

CHAR

TT_VARCHAR

VARCHAR2

setParam(pno, char* valueP)

setParam(pno, const char* valueP)

setParam(pno, SQLCHAR* valueP)

TT_NCHAR

NCHAR

TT_NVARCHAR

NVARCHAR2

setParam(pno, SQLWCHAR* valueP, byteLen)

BINARY

VARBINARY

setParam(pno, const void* valueP, byteLen)

DATE

TT_TIMESTAMP

TIMESTAMP

setParam(pno, TIMESTAMP_STRUCT* valueP)

TT_DATE

setParam(pno, DATE_STRUCT* valueP)

TT_TIME

setParam(pno, TIME_STRUCT* valueP)

setParamLength()

(バッチ以外の操作バージョン)

void setParamLength(int pno, int byteLen)

準備済文の実行前に、パラメータ番号で指定した入力パラメータのバインド後の値の長さをバイト単位で設定します。

注意:
このメソッドには、バッチ・バージョンもあります。「setParamLength()」を参照してください。

setParamNull()

(バッチ以外の操作バージョン)

void setParamNull(int pno)

パラメータ番号で指定したバインドされた入力パラメータにSQL NULLの値を設定します。

注意:
このメソッドには、バッチ・バージョンもあります。「setParamNull()」を参照してください。

setQueryThreshold()

void setQueryThreshold(const int nSecs)

このメソッドは、TTCmdオブジェクトの時間制限のしきい値を秒単位で指定するために使用します。(これは、問合せだけでなく、すべてのSQL文に使用できます。)文の実行時間がしきい値を超過した場合、サポート・ログに警告が書き込まれ、SNMPトラップがスローされます。実行は継続され、しきい値による影響は受けません。「getQueryThreshold()」も参照してください。

setQueryThreshold()メソッドは、TT_QUERY_THRESHOLDまたはTimesTenの一般接続属性QueryThresholdを設定するSQLSetStmtOptionを使用するのと同じ効果があります。

「SQL文の実行に対するタイムアウトまたはしきい値の設定」を参照してください。

setQueryTimeout()

void setQueryTimeout(const int nSecs)

このメソッドは、(問合せだけではなく)すべてのSQL文の実行時、タイムアウトまでの長さを秒単位で指定するために使用します。デフォルトでは、タイムアウトはありません。

これは、SQL_QUERY_TIMEOUTまたはTimesTenの一般接続属性SqlQueryTimeoutを設定するためにSQLSetStmtOptionを使用するのと同じ効果があります。

「SQL文の実行に対するタイムアウトまたはしきい値の設定」を参照してください。

TTCmdオブジェクトのプロパティを取得するためのパブリック・メソッド

準備済のTTCmdオブジェクトの、バインドされた入力パラメータおよび出力列のプロパティについて問い合せる場合に有効なメソッドがいくつかあります。通常、これらのメソッドでは、文が事前に準備されている場合にのみ、有効な結果が得られます。

メソッド

説明

getColumnName()

指定された列の名前を返します。

getColumnNullability()

指定した列のデータとして値NULLが可能かどうかを示します。

getColumnPrecision()

指定された列の精度を返します。

getColumnScale()

指定された列のスケールを返します。

getColumnType()

指定された列のODBCデータ型を返します。

getNColumns()

出力列の数を返します。

getNParameters()

入力パラメータの数を返します。

getParamNullability()

指定したパラメータの値としてNULLが可能かどうかを示します。

getParamPrecision()

準備済の文に指定されたパラメータの精度を返します。

getParamScale()

準備済の文に指定されたパラメータのスケールを返します。

getParamType()

指定されたパラメータのODBCデータ型を返します。

isBeingExecuted

TTCmdオブジェクトで表現された文が実行されたかどうかを示します。

getColumnName()

const char* getColumnName(int cno)

列番号cnoの名前を返します。

getColumnNullability()

int getColumnNullability(int cno)

列番号cnoとしてNULLデータが可能であるかどうかを示します。SQL_NO_NULLS、SQL_NULLABLEまたはSQLNULLABLE_UNKNOWNが返されます。

getColumnPrecision()

int getColumnPrecision(int cno)

列番号cno内のデータのデータベースの列サイズを参照する精度を返します。たとえば、VARCHAR2(25)列では、25の精度が返されます。

通常、この値は、表のCHAR、VARCHAR2、NCHAR、NVARCHAR2、BINARYおよびVARBINARY型の列から出力を生成する場合にのみ重要です。

getColumnScale()

int getColumnScale(int cno)

列番号cnoのデータのスケールを返します(小数点以下の最大桁数)。

getColumnType()

int getColumnType(int cno)

列番号cnoのデータ型を返します。返される値は、sql.hに見られる、パラメータのODBC型(SQL_INTEGER、SQL_REAL、SQL_BINARY、SQL_CHARなど)です。その他のTimesTen ODBC型(SQL_WCHAR、SQL_WVARCHAR)は、TimesTenヘッダー・ファイルtimesten.hで見られます。

getNColumns()

int getNColumns()

出力列の数を返します。

getNParameters()

int getNParameters()

SQL文の入力パラメータ数を返します。

getParamNullability()

int getParamNullability(int pno)

パラメータ値pnoとして値NULLが可能かどうかを示します。SQL_NO_NULLS、SQL_NULLABLEまたはSQLNULLABLE_UNKNOWNが返されます。

注意:
以前のリリースでは、このメソッドではintではなくboolが返されました。

getParamPrecision()

int getParamPrecision(int pno)

パラメータ番号pnoのそのデータ型で使用される最大桁数を参照する精度を返します。前述の「getColumnPrecision()」の情報も参照してください。

getParamScale()

int getParamScale(int pno)

パラメータ番号pnoのデータの小数点以下の最大桁数を参照するスケールを返します。

getParamType()

int getParamType(int pno)

パラメータ番号pnoのデータ型を返します。返される値は、sql.hに見られる、ODBC型(SQL_INTEGER、SQL_REAL、SQL_BINARY、SQL_CHARなど)です。その他のTimesTen型(SQL_WCHAR、SQL_WVARCHAR)は、TimesTenヘッダー・ファイルtimesten.hで見られます。

isBeingExecuted

bool isBeingExecuted()

TTCmdオブジェクトで表現された文が実行されたかどうかを示します。

バッチ操作のためのパブリック・メソッド

TimesTenは、挿入、更新および削除のバッチ操作のためにODBC関数SQLBindParamsをサポートします。TTClassesには、ODBC関数SQLBindParamsへのインタフェースが用意されています。

TTClassesでバッチ操作を実行する際の方法は、バッチ以外の操作を実行する場合と似ています。まずPrepareBatch()を使用してSQL文をコンパイルします。その後、その文の各パラメータを、BindParameter()を使用して値の配列にバインドします。最後にExecuteBatch()を使用して文を実行します。

バッチ操作の使用例については、TimesTenのクイック・スタートにあるサンプル・プログラムTTClasses bulktestを参照してください。「TimesTen TTClassesデモについて」を参照してください。

この項では、TTClassesユーザー向けに、バッチのINSERT、UPDATEおよびDELETE機能を公開するTTCmdメソッドについて説明します。

メソッド

説明

batchSize()

バッチ内の文の数を返します。

BindParameter()

PrepareBatch()を使用し、準備済文の1つのパラメータの値の配列をバインドします。

ExecuteBatch()

PrepareBatch()によって実行のために準備されたSQL文を起動します。バッチ内の更新された行数を返します。

PrepareBatch()

INSERT、UPDATEおよびDELETE文のバッチ処理を準備します。

setParamLength()

準備済文の実行の前に、指定したバインド・パラメータの長さをバイト単位で設定します。

setParamNull()

準備済文を実行の前に指定したバインド・パラメータの値をNULLに設定します。

batchSize()

u_short batchSize()

バッチ内の文の数を返します。

BindParameter()

void BindParameter(int pno, unsigned short batSz, TYPE* valueP)
void BindParameter(int pno, unsigned short batSz, TYPE* valueP, size_t maxByteLen)
void BindParameter(int pno, unsigned short batSz, TYPE* valueP,
SQLLEN* userByteLenP, size_t maxByteLen)

オーバーロードされたBindParameter()メソッドは、PrepareBatch()によってコンパイルされたSQL文について、指定したパラメータをバインドするために使用されます。これによって、バッチ内で文が繰り返し実行される際に違う値を使用できます。pnoパラメータは、バインドするパラメータの文内の左から開始される位置(最初のパラメータは1で次は2と続きます)を示します。

重複するパラメータおよびTimesTenモードとOracleモードでのその処理の違いの詳細は、「重複パラメータのバインド」を参照してください。

このコールのbatSz(バッチ・サイズ)値は、PrepareBatch()に指定したbatSzと一致する必要があり、バインドされた配列には少なくともbatSzの数の値が含まれる必要があります。各パラメータの正しい型を判別する必要があります。指定されたパラメータ番号が無効であるか、指定したバッチ・サイズが一致しないか、またはデータ・バッファがnullの場合、TTStatusオブジェクトが例外としてスローされ、実行時エラーがTTClassesグローバル・ロギング機能にTTLog::TTLOG_ERRロギング・レベルで書き込まれます。

次の表3-4に、サポートされるSQLデータ型および各パラメータ型で使用するBindParameter()の適切なバージョンを示します。

ExecuteBatch()を起動するたびに、アプリケーションで事前にバインド配列に有効なパラメータ値を設定する必要があります。「setParamNull()」の説明のとおり、null値の設定にはsetParamNull()を使用できることに注意してください。(バッチ・モードでは、rownoを指定するsetParamNull()の2つのパラメータを使用するバージョンを使用する必要があります。パラメータを1つ使用するバージョンは、バッチ以外の用途のみで使用します。)

TT_CHAR、CHAR、TT_VARCHARおよびVARCHAR2のSQLデータ型については、BindParameter()コールに最大長のパラメータを追加する必要があります。

- 型size_tのmaxByteLenは、このパラメータ位置の任意の値(バイト単位)の最大長用です。

TT_NCHAR、NCHAR、TT_NVARCHAR、NVARCHAR2、BINARYおよびVARBINARYのSQLデータ型については、BindParameter()コールにパラメータ長および最大長の2つパラメータを追加する必要があります。

- userByteLenPは、バッチ内のSQL文のこのパラメータ位置の各値の長さを指定する、バイト単位のSQLLENパラメータ長の配列です。この配列の長さには、batSzの長さ以上が必要であり、ExecuteBatch()のコール前に、有効な長さの値が設定されている必要があります。(null値の場合は、パラメータ長の配列に、setParamNull()バッチ・メソッドを使用する場合と同等のSQL_NULL_DATAを格納できます。)

- maxByteLenは、前述の説明のとおりです。これは、userByteLenP配列の任意の要素に指定する値の最大長を示します。

userByteLenPを利用できないデータ型では(または利用できるが別の方法が必要な場合は)、オプションでデータ長の設定にsetParamLength()バッチ・メソッドを(「setParamLength()」を参照)、またnull値の設定にsetParamNull()バッチ・メソッドを(「setParamNull()」を参照)使用できます。

BindParameter()の使用方法の例の詳細は、次の例3-5の「ExecuteBatch()」を参照してください。

表3-4 サポートされるTimesTenの表の列型のBindParameter()のバージョン

SQLデータ型

サポートされるBindParameter()のバージョン

TT_TINYINT

BindParameter(pno, batSz, SQLTINYINT* user_tiP)

TT_SMALLINT

BindParameter(pno, batSz, SQLSMALLINT* user_siP)

TT_INTEGER

BindParameter(pno, batSz, SQLINTEGER* user_iP)

TT_BIGINT

BindParameter(pno, batSz, SQLBIGINT* user_biP)

BINARY_FLOAT

BindParameter(pno, batSz, float* user_fP)

BINARY_DOUBLE

BindParameter(pno, batSz, double* user_dP)

NUMBER

TT_DECIMAL

BindParameter(pno, batSz, char** user_cPP, maxByteLen)

TT_CHAR

CHAR

TT_VARCHAR

VARCHAR2

BindParameter(pno, batSz, char** user_cPP, maxByteLen)

TT_NCHAR

NCHAR

TT_NVARCHAR

NVARCHAR2

BindParameter(pno, batSz, SQLWCHAR** user_wcPP, userByteLenP,
maxByteLen)

BINARY

VARBINARY

BindParameter(pno, batSz, const void** user_binPP, userByteLenP,
maxByteLen)

DATE

TT_TIMESTAMP

TIMESTAMP

BindParameter(pno, batSz, TIMESTAMP_STRUCT* user_tssP)

TT_DATE

BindParameter(pno, batSz, DATE_STRUCT* user_dsP)

TT_TIME

BindParameter(pno, batSz, TIME_STRUCT* user_tsP)

ExecuteBatch()

int ExecuteBatch(unsigned short numRows)

PrepareBatch()によってSQL文を準備し、そのSQL文の各パラメータに対してBindParameter()をコールした後、ExecuteBatch()を使用してその文をnumRows回実行します。numRowsの値はPrepareBatch()とBindParameter()コールで指定したbatSz(バッチ・サイズ)値未満である必要がありますが、アプリケーション・ロジックで必要な場合はbatSz未満であってもかまいません。

このメソッドでは、0からbatSzの範囲の値の、更新された行数を返します。(ODBCに精通している場合、これはODBCのSQLParamOptionsコールの3番目の*pirowパラメータになります。SQLParamOptionsの詳細は、ODBC APIのリファレンス・マニュアルを参照してください。)

アプリケーションでは、ExecuteBatch()をコールする前に、BindParameter()で以前にバインドしたパラメータの配列に有効な値を入力する必要があります。

(通常は一意性の制約違反が原因の)エラーが発生した場合、例外としてTTStatusオブジェクトがスローされます。このとき、戻り値は無効で、バッチは完了していないので、一般的にはロールバックを行う必要があります。

例3-5にExecuteBatch()メソッドの使用方法を示します。このメソッドの使用方法は、bulktestクイック・スタート・デモでも確認できます。(「TimesTen TTClassesデモについて」を参照してください。)

例3-5 ExecuteBatch()メソッドの使用方法

次のとおり、まず2つの列を持つ表を作成します。

CREATE TABLE batch_table (a TT_INTEGER, b VARCHAR2(100));

次にサンプル・コードを示します。サイズが50のバッチで表の行を移入します。

#define BATCH_SIZE 50
#define VARCHAR_SIZE 100

int int_array[BATCH_SIZE];
char char_array[BATCH_SIZE][VARCHAR_SIZE];

// Prepare the statement

TTCmd insert;
TTConnection connection;

// (assume a connection has been established)

try {

insert.PrepareBatch (&connection,
(const char*)"insert into batch_table values (?,?)",
BATCH_SIZE);

// Commit the prepared statement
connection.Commit();

// Bind the arrays of parameters
insert.BindParameter(1, BATCH_SIZE, int_array);
insert.BindParameter(2, BATCH_SIZE, (char **)char_array, VARCHAR_SIZE);

// Execute 5 batches, inserting a total of 5 * BATCH_SIZE rows into
// the database
for (int iter = 0; iter < 5; iter++)
{
// Populate the value arrays with values.
// (A more meaningful way of putting data into
// the database is to read values from a file, for example,
// rather than generating them arbitrarily.)

for (int i = 0; i < BATCH_SIZE; i++)
{
int_array[i] = i * iter + i;
sprintf(char_array[i], "varchar value # %d", i*iter+ i);
}

// Execute the batch insert statement,
// which inserts the entire contents of the
// integer and char arrays in one operation.
int num_ins = insert.ExecuteBatch(BATCH_SIZE);

cerr << "Inserted " << num_ins << " rows." << endl;

connection.Commit();

} // for iter

} catch (TTError er1) {
cerr << er1 << endl;
}

たとえば、列の1つに一意制約の違反がある場合などは、更新された行数(この例ではnum_ins)をBATCH_SIZEよりも少なくすることができます。例3-6のようなコード使用して、この状況を確認し、必要に応じてトランザクションをロールバックできます。

TimesTenには、表、ビュー、マテリアライズド・ビュー、順序およびシノニムなどのデータベース・オブジェクトについて、オブジェクトレベルの解決法でデータベース・アクセスを制御する機能が含まれています。アクセス制御の権限は、データベースでSQLが準備されるときと実行されるときの両方で確認され、パフォーマンス・コストの大部分は準備時に発生します。「アクセス制御に関するTimesTen機能の考慮事項」を参照してください。

例3-6 ExecuteBatch()の使用およびBATCH_SIZEの確認

for (int iter = 0; iter < 5; iter++)
{

// Populate the value arrays with values.
// (A better way of putting meaningful data into
// the database is to read values from a file,
// rather than generating them arbitrarily.)

for (int i = 0; i < BATCH_SIZE; i++)
{
int_array[i] = i * iter + i;
sprintf(char_array[i], "varchar value # %d", i*iter+i);
}

// now we execute the batch insert statement,
// which does the work of inserting the entire
// contents of the integer and char arrays in
// one operation

int num_ins = insert.ExecuteBatch(BATCH_SIZE);

cerr << "Inserted " << num_ins << " rows (expected "
<< BATCH_SIZE << " rows)." << endl;

if (num_ins == BATCH_SIZE) {
cerr << "Committing batch" << endl;
connection.Commit();
}
else {
cerr << "Some rows were not inserted as expected, rolling back "
<< "transaction." << endl;
connection.Rollback();
break; // jump out of batch insert loop
}

} // for loop

PrepareBatch()

void PrepareBatch(TTConnection* cP, const char* sqlp, unsigned short batSz)

PrepareBatch()は、Prepare()の類似メソッドですが、バッチでのINSERT、UPDATEまたはDELETE文が可能です。Prepare()では、cPパラメータとsqlpパラメータを使用します。「Prepare()」を参照してください。

batSz (バッチ・サイズ)パラメータでは、ExecuteBatch()への後続のコールによって実行される挿入、更新、削除操作の最大数を指定します。

エラーが発生するとTTStatusオブジェクトが例外としてスローされます。

TimesTenには、表、ビュー、マテリアライズド・ビュー、順序およびシノニムなどのデータベース・オブジェクトについて、オブジェクトレベルの解決法でデータベース・アクセスを制御する機能が含まれています。アクセス制御の権限は、データベースでSQLが準備されるときと実行されるときの両方で確認され、パフォーマンス・コストの大部分は準備時に発生します。「アクセス制御に関するTimesTen機能の考慮事項」を参照してください。

注意:
クライアント/サーバー接続を使用している場合に、クライアントとサーバー間の不要なラウンドトリップを回避するために、PrepareBatch()メソッドによって遅延準備と呼ばれる処理が実行され、リクエストは要求されるまでサーバーに送信されません。詳細は、『Oracle TimesTen In-Memory Database C開発者ガイド』のTimesTenの遅延準備に関する説明を参照してください。

setParamLength()

(バッチ操作のバージョン)

void setParamLength(int pno, unsigned short rowno, int byteLen)

このメソッドは、ExecuteBatch()をコールする前に、バインドされたパラメータ値の長さを設定します。pno引数は、SQL文内のパラメータ番号を指定します(最初のパラメータが番号1です)。rowno引数は、バインド対象のパラメータ配列の行番号を指定します(ここで最初の行番号は1です)。byteLenパラメータでは、終わりのNULLはカウントしない希望の長さをバイト単位で指定します。NULLで終わる文字列については、byteLenのかわりにSQL_NTSを設定することも可能です。(また、次で説明するsetParamNull()バッチ・メソッドと同等の、SQL_NULL_DATAに設定することも可能です。)

注意:

- バイナリおよびNCHAR型のパラメータ長の設定には、表3-4のとおり、BindParameter() userByteLenP配列を使用した方が簡単な場合があります。バインドされるパラメータ配列の行の番号はuserByteLenP配列では0から開始しますが、setParamLength()を使用した場合は1であることに注意してください。

- このメソッドには、バッチ以外でのバージョンもあります。「setParamLength()」を参照してください。(バッチ以外の操作の場合は、2つのパラメータを使用するバージョンのみを使用し、バッチ操作ではrownoを指定する3つのパラメータを使用するバージョンのみを使用することが重要です)。

setParamNull()

(バッチ操作のバージョン)

void setParamNull(int pno, unsigned short rowno)

このメソッドでは、ExecuteBatch()のコール前に、バインドされたパラメータ値をNULLに設定します。pno引数は、SQL文内のパラメータ番号を指定します(最初のパラメータが番号1です)。rowno引数は、バインド対象のパラメータ配列の行番号を指定します(ここで最初の行番号は1です)。

注意:

- バイナリおよびNCHAR型には、表3-4のとおり、BindParameter() userByteLenP配列があります。これらの型では、setParamNull()の使用と同等のSQL_NULL_DATAをこの配列に指定することによりNULL値が可能になります。バインドされるパラメータ配列の行の番号はuserByteLenPでは0から開始しますが、setParamNull()を使用した場合は1で番号が開始することに注意してください。

- このメソッドには、バッチ以外でのバージョンもあります。「setParamNull()」を参照してください。(バッチ以外の操作の場合は、1つのパラメータを使用するバージョンのみを使用し、バッチ操作ではrownoを指定する2つのパラメータを使用するバージョンのみを使用することが重要です。)

システム・カタログ・クラス

これらのクラスでは、TimesTenシステム・カタログを検証できます。

TTCatalogクラスを使用すると、システム・カタログからのメタデータの読取りが容易になります。TTCatalogオブジェクトのデータが構造には、読み取られた情報が含まれます。

各TTCatalogオブジェクトの内部には、TTCatalogTableオブジェクトの配列が含まれます。各TTCatalogTableオブジェクトには、TTCatalogColumnオブジェクトの配列と、TTCatalogIndexオブジェクトの配列が含まれます。

TTCatalog内では次のODBC関数が使用されます。

- SQLTables()

- SQLColumns()

- SQLSpecialColumns()

- SQLStatistics()

この項では、次のクラスについて説明します。

- TTCatalog

- TTCatalogTable

- TTCatalogColumn

- TTCatalogIndex

- TTCatalogSpecialColumn

TTCatalog

TTCatalogクラスは、データベース内の表に関するメタデータ情報へのプログラム的なアクセスに使用される、トップ・レベルのクラスです。TTCatalogオブジェクトの内部には、TTCatalogTableオブジェクトの配列があります。クラス・コンストラクタを除くTTCatalogのすべてのパブリック・メソッドを使用して、そのTTCatalogTable配列への読取り専用アクセスを取得します。

TTCatalogコンストラクタは、connパラメータをキャッシュし、すべての内部データ構造を適切に初期化します。

TTCatalog (TTConnection* conn)

TTCatalogオブジェクトを使用するには、そのfetchCatalogData()メソッドをコールします(後述の説明を参照)。fetchCatalogData()メソッドは、データベース接続を使用するTTCatalogの唯一のメソッドです。その他のメソッドは、単純にfetchCatalogData()から取得したデータを返します。

パブリック・メンバー

なし

パブリック・メソッド

メソッド

説明

fetchCatalogData()

データベース内のカタログを読み取って表および索引に関する情報を取得し、この情報をTTCatalog内部データ構造に格納します。

getNumSysTables()

データベース内のシステム表の数を返します。

getNumTables()

データベース内の表の合計数を返します(ユーザー表とシステム表)。

getNumUserTables()

データベース内のユーザー表の数を返します。

getTable()

指定された表のTTCatalogTableオブジェクトへの定数参照を返します。

getTableIndex()

指定された表に対するTTCatalogオブジェクト内の索引を返します。

getUserTable()

(nが指定された)システム内のn番目のユーザー表に対応するTTCatalogTableオブジェクトへの定数参照を返します。

fetchCatalogData()

void fetchCatalogData()

これは、データベースと通信するTTCatalogの唯一のメソッドです。データベース内のカタログを読み取って表および索引に関する情報を取得し、それをTTCatalog内部データ構造に格納します。

その後、構築されたTTCatalogオブジェクトは完全にオフラインで使用されます。データベースにはもう接続されていません。

TTCatalogアクセッサ・メソッドのいずれかを使用する前に、このメソッドをコールする必要があります。

次の例に、TTCatalogの使用方法を示します。

例3-7 カタログ・データのフェッチ

TTConnection conn;
conn.Connect(DSN=TptbmData37);
TTCatalog cat (&conn);
cat.fetchCatalogData();
// TTCatalog cat is no longer connected to the database;
// you can now query it through its read-only methods.
cerr << "There are " << cat.getNumTables() << " tables in this database:" << endl;
for (int i=0; i < cat.getNumTables(); i++)
cerr << cat.getTable(i).getTableOwner() << "."
<< cat.getTable(i).getTableName() << endl;

getNumSysTables()

int getNumSysTables()

データベース内のシステム表の数を返します。後述のメソッドgetNumTables()およびgetNumUserTables()も参照してください。

getNumTables()

int getNumTables()

データベース内の表の合計数を返します(ユーザー表とシステム表)。前述のメソッドgetNumSysTables()と、後述のメソッドgetNumUserTables()も参照してください。

getNumUserTables()

int getNumUserTables()

データベース内のユーザー表の数を返します。前述のメソッドgetNumSysTables()と、後述のメソッドgetNumTables()も参照してください。

getTable()

const TTCatalogTable& getTable(const char* owner, const char* tblname)
const TTCatalogTable& getTable(int tno)

指定された表のTTCatalogTableオブジェクトへの定数参照を返します。「getUserTable()」も参照してください。

最初のシグネチャは、tblnameという名前のownerによって所有される表に使用されます。

2番目のシグネチャは、システム内の表番号tnoに対応する表に使用されます。これは、システム内のすべての表に対する反復処理を容易にするためのものです。この配列内の表の順番は任意です。

次の関係が成立しています。

0 <= tno < getNumTables()

「TTCatalogTable」も参照してください。

getTableIndex()

int getTableIndex(const char* owner, const char* tblname) const

このメソッドは、指定されたowner.tblnameオブジェクトに対するTTCatalogオブジェクト内の索引をフェッチします。owner.tblnameが存在しない場合は-2を返します。fetchCatalogData()が最初にコールされない場合-1を返します。

例3-8では、TTCatalogオブジェクトのTTUSER.MYDATA表に関する情報を取得します。次で説明するTTCatalogTableのメソッドをコールして、この表に関する情報を取得することができます。

例3-8 カタログからの表情報の取得

TTConnection conn;
conn.Connect(...);
TTCatalog cat (&conn);
cat.fetchCatalogData();

int idx = cat.getTableIndex("TTUSER", "MYDATA");
if (idx < 0) {
cerr << "Table TTUSER.MYDATA does not exist." << endl;
return;
}

TTCatalogTable &table = cat.getTable(idx);

getUserTable()

const TTCatalogTable& getUserTable(int tno)

システム内のユーザー表番号tnoと対応するTTCatalogTableオブジェクトに対する定数参照を返します。このメソッドは、システム内のすべてのユーザー表に対する反復処理を容易にするためのものです。この配列のユーザー表の順番は任意です。「getTable()」も参照してください。

次の関係が成立しています。

0 <= tno < getNumUserTables()

注意:
システム表には同等のメソッドはありません。

TTCatalogTable

TTCatalogTableオブジェクトはTTCatalog::getTable()メソッドを使用して取得され、表の列および索引に関するメタデータ情報がすべて格納されます。

パブリック・メンバー

なし

パブリック・メソッド

メソッド

説明

getColumn()

表のi番目の列に対応するTTCatalogColumnへの定数参照を返します。

getIndex()

(nが指定された)表内のn番目の索引に対応するTTCatalogIndexオブジェクトへの定数参照を返します。

getNumColumns()

表の列数を返します。

getNumIndexes()

表の索引数を返します。

getNumSpecialColumns()

この表の特殊列の数を返します。「TTCatalogSpecialColumn」を参照してください。

getSpecialColumn()

この表から、指定した列番号に従った特殊列(TTCatalogSpecialColumnオブジェクト)を返します。

getTableName()

表の名前を返します。

getTableOwner()

表の所有者を返します。

getTableType()

ODBC SQLTables関数より返される表タイプを返します。

isSystemTable()

表がシステム表の場合はTRUEを返します。

isUserTable()

表がユーザー表の場合はTRUEを返します。

getColumn()

const TTCatalogColumn& getColumn(int cno)

表の列番号cnoと対応するTTCatalogColumnオブジェクトに対する定数参照を返します。このメソッドは、表のすべての列に対する反復処理を容易にするためのものです。

次の関係が成立しています。

0 <= cno < getNumColumns()

getIndex()

const TTCatalogIndex& getIndex(int num)

表の索引番号numと対応するTTCatalogIndexオブジェクトに対する定数参照を返します。このメソッドは、表のすべての索引に対する反復処理を容易にするためのものです。この配列の表の索引の順番は任意です。

次の関係が成立しています。

0 <= num < getNumIndexes()

getNumColumns()

int getNumColumns()

表の列数を返します。

getNumIndexes()

int getNumIndexes()

表の索引数を返します。

getNumSpecialColumns()

int getNumSpecialColumns()

このTTCatalogTableオブジェクト内の特殊列の数を返します。TimesTenでサポートされる特殊列はROWIDのみのため、常に1が返されます。

「TTCatalogSpecialColumn」も参照してください。

getSpecialColumn()

const TTCatalogSpecialColumn& getSpecialColumn(int num) const

このTTCatalogTableオブジェクトから、指定した列番号に従い特殊列(TTCatalogSpecialColumnオブジェクト)を返します。TimesTenでは、これはROWID疑似列のみになります。

「TTCatalogSpecialColumn」も参照してください。

getTableName()

const char* getTableName()

表の名前を返します。

getTableOwner()

const char* getTableOwner()

表の所有者を返します。

getTableType()

const char* getTableType() const

ODBC SQLTablesコールからとして、このTTCatalogTableオブジェクトの表タイプを返します。これは、TimesTenでは、TABLE、SYSTEM TABLE、VIEWまたはSYNONYMになります。

isSystemTable()

bool isSystemTable()

表がシステム表(SYS、TTREPまたはGRIDの所有)の場合TRUEを返し、それ以外の場合はFALSEを返します。

システム表とユーザー表を区別するために、表をフィルタしたり注釈を付けることが可能な、isSystemTable()メソッドとisUserTable()メソッド(次で説明)は、TTCatalog::fetchCatalogData()へのコール後、すべての表を反復するアプリケーションに便利です。TTClassesのデモ・プログラムであるcatalogには、これの実行例があります。(「TimesTen TTClassesデモについて」を参照してください。)

isUserTable()

bool isUserTable()

システム表とは容易に区別ができるユーザー表にはTRUEを返し、それ以外の場合はFALSEを返します。どの表の場合でも、isUserTable()はisSystemTable()と逆の値を返すことに注意してください。isSystemTable()の説明では、これらの方法の使用方法および有用性を説明しています。

TTCatalogColumn

TTCatalogColumnクラスは、表の1つの行のすべてのメタデータ情報を格納するために使用されます。この表はTTCatalogTableオブジェクトで表現され、このオブジェクトからTTCatalogTable::getColumn()コールを使用して列が取得されています。

パブリック・メンバー

なし

パブリック・メソッド

メソッド

説明

getColumnName()

列の名前を返します。

getDataType()

列のODBC SQLデータ型を表す整数を返します。

getLength()

列の長さをバイト単位で返します。

getNullable()

列にNULL値を含めることができるかどうかを示します。(次の説明のとおり、これはブール値ではありません)。

getPrecision()

列の精度を返します。

getRadix()

列の基数を返します。

getScale()

列のスケールを返します。

getTypeName()

getDataType()によって返された型のTimesTen名を返します。

getColumnName()

const char* getColumnName()

列の名前を返します。

getDataType()

int getDataType()

列のデータ型を表す整数を返します。これは、標準のODBC SQL型コードまたはTimesTen拡張型コードです。

getLength()

int getLength()

列内のデータの長さをバイト単位で返します。

getNullable()

int getNullable()

列にNULL値を含めることができるかどうかを示します。SQL_NO_NULLS、SQL_NULLABLEまたはSQL_NULLABLE_UNKNOWNが返されます。

getPrecision()

int getPrecision()

列内のデータ型で使用される桁の最大数であるデータの精度を返します。

getRadix()

int getRadix()

ODBC SQLColumns関数から出力された列の基数を返します。

getScale()

int getScale()

列内のデータのスケールを返します(小数点以下の最大桁数)。

getTypeName()

const char* getTypeName()

getDataType()によって返された型のTimesTen名を返します。

TTCatalogIndex

TTCatalogIndexクラスは、表の索引のメタデータ情報を保存するために使用されます。この表は、TTCatalogTableオブジェクトで表現され、このオブジェクトからTTCatalogTable::getIndex()コールを使用して索引が取得されています。

パブリック・メンバー

なし

パブリック・メソッド

メソッド

説明

getCollation()

索引の指定された列の照合を返します。

getColumnName()

索引の指定された列名を返します。

getIndexName()

索引の名前を返します。

getIndexOwner()

索引の所有者を返します。

getNumColumns()

索引の列数を返します。

getTableName()

索引が作成された表の名前を返します。

getType()

索引の型を返します。

isUnique()

索引が一意索引かどうかを表します。

getCollation()

char getCollation (int num)

索引の列番号numの照合を返します。返される値は、昇順の場合はA、降順の場合はDとなります。

getColumnName()

const char* getColumnName(int num)

索引の列番号numの名前を返します。

getIndexName()

const char* getIndexName()

索引の名前を返します。

getIndexOwner()

const char* getIndexOwner()

索引の所有者を返します。

getNumColumns()

int getNumColumns()

索引の列数を返します。

getTableName()

const char* getTableName()

索引が作成された表の名前を返します。この表は、TTCatalogTableオブジェクトで表現され、このオブジェクトからTTCatalogTable::getIndex()コールを使用して索引が取得されています。

getType()

int getType()

索引の型を返します。TimesTenでは、許容値はPRIMARY_KEY、HASH_INDEX(PRIMARY_KEYと同じ)およびRANGE_INDEXです。

isUnique()

bool isUnique()

索引が一意の場合はTRUEを返し、それ以外の場合はFALSEを返します。

TTCatalogSpecialColumn

このクラスは、TTCatalogTableオブジェクトとして表されるODBC SQLSpecialColumns関数コールからの結果のラッパーです。TimesTenで唯一サポートされる特殊列は、ROWID疑似列なので、TTCatalogSpecialColumnオブジェクトにはROWIDの情報しか含めることができません。

使用方法

該当するTTCatalogTableオブジェクトでgetSpecialColumn()メソッドをコールし、TTCatalogSpecialColumnオブジェクトを取得します。

パブリック・メンバー

なし

パブリック・メソッド

メソッド

説明

getColumnName()

特殊列の名前を返します。

getDataType()

特殊列のデータ型を整数で返します。

getLength()

特殊列内のデータの長さをバイト単位で返します。

getPrecision()

特殊列の精度を返します。

getScale()

特殊列のスケールを返します。

getTypeName()

特殊列のデータ型を文字列で返します。

getColumnName()

const char* getColumnName()

特殊列の名前を返します。

getDataType()

int getDataType()

特殊列のODBC SQLデータ型を表す整数を返します。TimesTenでは、これはSQL_ROWIDのみになります。

getLength()

int getLength()

特殊列内のデータの長さをバイト単位で返します。

getPrecision()

int getPrecision()

特殊列内のデータのデータ型で使用される桁の最大数である精度を返します。

getScale()

int getScale()

特殊列内データのスケールを返します(小数点以下の最大桁数)。

getTypeName()

const char* getTypeName()

getDataType()によって返されたODBC SQLデータ型に対応するデータ型名を返します。TimesTenでは、これはROWIDのみになります。

XLAクラス

TTClassesは、TimesTenのトランザクション・ログAPI(XLA)で使用するアプリケーション用の一連のクラスを備えています。

XLAはコール可能なC関数のセットであり、アプリケーションはこれで1つ以上のデータベース表の変更を監視できます。監視対象の表が別のアプリケーションによって変更されるたびに、XLAを使用しているアプリケーションにその変更が通知されます。XLAの詳細は、『Oracle TimesTen In-Memory Database C開発者ガイド』のXLAおよびTimesTenのイベント管理に関する説明を参照してください。

XLAクラスでは、TimesTenでサポートされている列の最大数と同じ数のXLA列をサポートしています。詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のシステム制限に関する説明を参照してください。

重要:
「ODBCドライバ・マネージャ使用時の考慮事項(Windows)」に記載のとおり、XLA機能はODBCドライバ・マネージャを使用する場合、TTClassesではサポートされません。

この項では、次のクラスについて説明します。

- TTXlaPersistConnection

- TTXlaRowViewer

- TTXlaTableHandler

- TTXlaTableList

- TTXlaTable

- TTXlaColumn

TTXlaPersistConnection

データベースへのXLA接続を作成するには、TTXlaPersistConnectionを使用します。

使用方法

XLAアプリケーションでは、必要に応じて複数のTTXlaPersistConnectionオブジェクトを作成できます。各TTXlaPersistConnectionオブジェクトには、接続時に指定する、ackUpdates()メソッドとdeleteBookmarkAndDisconnect()メソッドで維持する独自のブックマークと関連付ける必要があります。多くのアプリケーションでは、XLAブックマークは1つまたは2つのみ必要です。

XLA接続の確立後、アプリケーションは、その終了までfetchUpdatesWait()メソッドを繰り返しコールするループに入ります。このループでは、トランザクション・ログで使用可能なディスク領域が一杯にならないように、できるだけ速くXLAから更新をフェッチする必要があります。

注意:

- トランザクション・ログは、指定している場合、TimesTen LogDir属性で設定したファイル・システムの場所にあり、LogDirを指定していない場合はDataStore属性で設定した場所にあります。『Oracle TimesTen In-Memory Databaseリファレンス』のデータ・ストア属性に関する説明を参照してください。

- 各ブックマークは、トランザクション・ログに独自のログの保持を確立します。(関連情報は、『Oracle TimesTen In-Memory Databaseリファレンス』の ttLogHoldsに関する説明を参照してください。)定期的に進められないブックマークがある場合、チェックポイント処理ではトランザクション・ログをパージできません。これによって、時間の経過とともにディスク領域が一杯になる場合があります。

アプリケーションは、更新のバッチを処理した後、それらの更新を確認するためにackUpdates()をコールし、次のfetchUpdatesWait()のコールに備えます。更新のバッチは、setBookmarkIndex()およびgetBookmarkIndex()メソッドを使用して再生できます。また、XLAアプリケーションがfetchUpdatesWait()の後(ただしackUpdates()の前)に切断されると、fetchUpdatesWait()をコールする次の接続(同じブックマーク名を使用)は、同じ更新のバッチを参照します。

データベースからTTXlaPersistConnectionオブジェクトを切断している間に発生する更新は、失われません。これらは、別のTTXlaPersistConnectionオブジェクトが同じブックマーク名で接続されるまでトランザクション・ログに格納されます。

データベースに接続する権限は、CREATE SESSION権限を使用して、直接またはPUBLICロールを介してユーザーに付与する必要があります。「接続のアクセス制御」を参照してください。これに加え、XLA接続と機能にはXLA権限が必要です。

パブリック・メンバー

なし

パブリック・メソッド

メソッド

説明

ackUpdates()

ブックマークを次の更新セットに進めます。

Connect()

指定されたブックマークで接続するか、(メソッド・シグネチャに応じ)存在しない場合は作成します。

deleteBookmarkAndDisconnect()

ブックマークを削除し、データベースから切断します。

Disconnect()

ブックマークはそのままにし、データベースとのXLA接続を閉じます。

fetchUpdatesWait()

指定された待機時間内にトランザクション・ログの更新をフェッチします。

getBookmarkIndex()

現在のトランザクション・ログの位置を取得します。

setBookmarkIndex()

getBookmarkIndex()コールによって取得されたトランザクション・ログの位置を返します。

ackUpdates()

void ackUpdates()

このメソッドは、ブックマークを次の更新セットに進めるために使用されます。更新セットを確認した後、このブックマークからは更新は再度表示できません。したがって、setBookmarkIndex()コールではackUpdates()へのコールによって認識されたXLAレコードの再生は許可しません。(更新セットの再生については、「getBookmarkIndex()」と「setBookmarkIndex()」の説明を参照してください。)

アプリケーションは、XLAレコードのバッチが読み取られて処理されたら、利用可能なディスク領域をトランザクション・ログが一杯にしないように、更新を確認する必要がありますが、相対的に負荷の高い操作なのでackUpdates()は頻繁にコールしないようにする必要があります。

アプリケーションがレコードのバッチを読み取るためにXLAを使用し、ackUpdates()のコール前に失敗する場合、アプリケーションがXLA接続を再構築するときにレコードは取得されます。

注意:
トランザクション・ログは、指定している場合、TimesTen LogDir属性で設定したファイル・システムの場所にあり、LogDirを指定していない場合はDataStore属性で設定した場所にあります。『Oracle TimesTen In-Memory Databaseリファレンス』のデータ・ストア属性に関する説明を参照してください。

Connect()

virtual void Connect(const char* connStr, const char* bookmarkStr,
bool createBookmarkFlag)
virtual void Connect(const char* connStr, const char* username,
const char* password, const char* bookmarkStr,
bool createBookmarkFlag)
virtual void Connect(const char* connStr,
TTConnection::DRIVER_COMPLETION_ENUM driverCompletion,
const char* bookmarkStr, bool createBookmarkFlag)

virtual void Connect(const char* connStr, const char* bookmarkStr)
virtual void Connect(const char* connStr, const char* username,
const char* password, const char* bookmarkStr)
virtual void Connect(const char* connStr,
TTConnection::DRIVER_COMPLETION_ENUM driverCompletion,
const char* bookmarkStr)

各XLA接続にはブックマーク名が関連付けられているため、切断および再接続後、トランザクション・ログ内の同じ場所が検出可能です。接続のブックマーク名はbookmarkStrパラメータで指定します。

前述の1番目のメソッドのセットのcreateBookmarkFlagブール・パラメータは、ブックマークが新規か、以前に作成されたかを示します。ブックマークを新規と指定し(createBookmarkFlag==true)、すでに存在している場合はエラーが返されます。同様に、ブックマークがすでに存在していると指定し(createBookmarkFlag==false)、存在していなかった場合はエラーが返されます。

示している2番目のメソッドのセットについて、createBookmarkFlagがない場合、TTClassesはまず提供されたブックマークを再利用して接続を試行します(createBookmarkFlag==falseと同等な動作)。そのブックマークが存在しない場合、TTClassesは次にbookmarkStrという名前の新規ブックマークの作成を試行します(createBookmarkFlag==trueと同じ動作)。このメソッドは、XLAブックマークが存在するかどうかを開発者が気にかけたくない場合に備えて、XLA接続ロジックを簡略化するために便宜上提供されているものです。

createBookmarkFlagの有無にかかわらずいずれのモードのときも、接続文字列または別のパラメータを使用してユーザー名とパスワードを指定するか、DRIVER_COMPLETION_ENUM値を指定します。DRIVER_COMPLETION_ENUMの詳細は、「TTConnection」を参照してください。

データベースに接続する権限は、CREATE SESSION権限を使用して、直接またはPUBLICロールを介してユーザーに付与する必要があります。「接続のアクセス制御」を参照してください。これに加え、XLA接続を作成するにはXLA権限が必要です。

注意:
特定のブックマーク名で接続できるXLA接続は1つのみです。複数の接続が同じブックマークに接続しようとすると、エラーが返されます。

deleteBookmarkAndDisconnect()

void deleteBookmarkAndDisconnect()

このメソッドでは、データベースがそのブックマークのレコードをそれ以上保持しないように接続と現在関連付けられているブックマークをまず削除し、その後データベースから切断します。

ブックマークを削除せずに切断するには、かわりにDisconnect()メソッドを使用します。

Disconnect()

virtual void Disconnect()

このメソッドは、データベースとのXLA接続を閉じます。このメソッドをコールした後も、XLAブックマークは存続します。

ブックマークを削除してデータベースから切断する場合は、かわりにdeleteBookmarkAndDisconnect()を使用します。

fetchUpdatesWait()

void fetchUpdatesWait(ttXlaUpdateDesc_t*** arry, int maxrecs,
int* recsP, int seconds)

このメソッドは、データベースの変更を記述したレコードのセットをフェッチするために使用します。ttXlaUpdateDesc_t構造体のリストが返されます。フェッチされるXLA更新がない場合、このメソッドは指定された秒数待機してから返されます。

待機する秒数をsecondsで指定し、受信するレコードの最大数をmaxrecsで指定します。このメソッドは、実際に受信したレコードの数recsPと変更を定義する構造をポイントするポインタの配列arryを返します。

このメソッドによって返されるttXlaUpdateDesc_t構造体は、XLA仕様で定義されます。これらのメソッドのC++オブジェクト指向カプセル化は提供されません。通常、fetchUpdatesWait()のコール後、アプリケーションはTTXlaTableList::HandleChange()へのコールのシーケンスでこれらのttXlaUpdateDesc_t構造を処理します。

データ構造の詳細は、『Oracle TimesTen In-Memory Database C開発者ガイド』のttXlaUpdateDesc_tに関する説明を参照してください。

getBookmarkIndex()

void getBookmarkIndex()

このメソッドは、現在のブックマーク位置を取得し、以降のsetBookmarkIndex()コールで使用可能となるクラスのプライベート・データ・メンバーに保存します。

setBookmarkIndex()

void setBookmarkIndex()

このメソッドでは、保存されたトランザクション・ログの索引に戻り、ブックマークを以前getBookmarkIndex()へのコールで取得したアドレスにリストアします。このメソッドを使用すると、XLAレコードのバッチを再生できます。

ackUpdates()がコールされると、格納されているトランザクション・ログ・プレースホルダが無効になることに注意してください。ackUpdates()の後でsetBookmarkIndex()がコールされても、以前に取得されたブックマークの位置まで戻ることができないため、エラーが返されます。

TTXlaRowViewer

変更通知レコードからの行イメージを表すTTXlaRowViewerを使用すると、XLA変更通知レコードの構造と新旧の列値を検証することができます。

使用方法

このクラスのメソッドは、変更通知レコード内の行イメージから列値を検証するために使用できます。TTXlaTableクラス(「TTXlaTable」)の関連情報も参照してください。

行を検証する前に、TTXlaRowViewerオブジェクトはTTXlaTableHandler::HandleInsert()、HandleUpdate()またはHandleDelete()メソッド、またはユーザー記述のオーバーロード・メソッド内で起動されるsetTuple()メソッドを使用する行と関連付ける必要があります。isNull()メソッドを使用すると、列にnull値があるかを確認できます。nullではない列値は適切なオーバーロードされるGet()メソッドを使用して検査できます。

パブリック・メンバー

なし

パブリック・メソッド

メソッド

説明

columnPrec()

行イメージの指定した列の精度を返します。

columnScale()

行イメージの指定した列のスケールを返します。

Get()

行イメージ内の指定した列の値をフェッチします。

getColumn()

行イメージから指定した列を返します。

isColumnTTTimestamp()

行イメージ内の指定した列がTT_TIMESTAMP列であるかどうかを示します。

isNull()

行イメージ内の指定した列にNULL値があるかどうかを示します。

numUpdatedCols()

行イメージ内で更新した列数を返します。

setTuple()

TTXlaRowViewerオブジェクトを指定された行イメージに関連付けます。

updatedCol()

通常は、すべての更新済列に対する反復処理中に、更新された列の行イメージ内での列番号を返します。

columnPrec()

int columnPrec(int cno)

行イメージ内の列番号cnoのデータの、データ型で使用される桁の最大数である精度を返します。

columnScale()

int columnScale(int cno)

行イメージ内の列番号cnoのデータのスケールを返します(小数点以下の最大桁数)。

Get()

void Get(int cno, TYPE* valueP)
void Get(int cno, TYPE* valueP, int* byteLenP)

行イメージ内の列番号cno値を取得します。これらのメソッドは、TTCmd::getColumn()メソッドによく似ています。

次の表3-5では、サポートされるSQLデータ型および各データ型での使用に適したGet()バージョンを示します。格納されるデータ型の種類に従って、アプリケーションを設計します。たとえば、データ型NUMBER(9,0)には、Get(int、int*)メソッドを使用すると、データを損失することなくアクセスできます。

表3-5 サポートされる表の列型のGet()バージョン

XLAデータ型

データベース・データ型

Get() variant

TTXLA_CHAR_TT

TT_CHAR

Get(cno, char** cPP)

TTXLA_NCHAR_TT

TT_NCHAR

Get(cno, SQLWCHAR** wcPP, byteLenP)

TTXLA_VARCHAR_TT

TT_VARCHAR

Get(cno, char** cPP)

TTXLA_NVARCHAR_TT

TT_NVARCHAR

Get(cno, SQLWCHAR** wcPP, byteLenP)

TTXLA_TINYINT

TT_TINYINT

Get(cno, SQLTINYINT* iP)

TTXLA_SMALLINT

TT_SMALLINT

Get(cno, short* iP)

TTXLA_INTEGER

TT_INTEGER

Get(cno, int* iP)

TTXLA_BIGINT

TT_BIGINT

Get(cno, SQLBIGINT* biP)

TTXLA_BINARY_FLOAT

BINARY_FLOAT

Get(cno, float* fP)

TTXLA_BINARY_DOUBLE

BINARY_DOUBLE

Get(cno, double* dP)

TTXLA_DECIMAL_TT

TT_DECIMAL

Get(cno, char** cPP)

TTXLA_TIME

TT_TIME

Get(cno, TIME_STRUCT* tP)

TTXLA_DATE_TT

TT_DATE

Get(cno, DATE_STRUCT* dP)

TTXLA_TIMESTAMP_TT

TT_TIMESTAMP

Get(cno, TIMESTAMP_STRUCT* tsP)

TTXLA_BINARY

BINARY

Get(cno, const void** binPP,
byteLenP)

TTXLA_VARBINARY

VARBINARY

Get(cno, const void** binPP,
byteLenP)

TTXLA_NUMBER

NUMBER

Get(cno, double* dP)

Get(cno, char** cPP)

Get(cno, short* iP)

Get(cno, int* iP)

Get(cno, SQLBIGINT* biP)

TTXLA_DATE

DATE

Get(cno, TIMESTAMP_STRUCT* tsP)

TTXLA_TIMESTAMP

TIMESTAMP

Get(cno, TIMESTAMP_STRUCT* tsP)

TTXLA_CHAR

CHAR

Get(cno, char** cPP)

TTXLA_NCHAR

NCHAR

Get(cno, SQLWCHAR** wcPP, byteLenP)

TTXLA_VARCHAR

VARCHAR2

Get(cno, char** cPP)

TTXLA_NVARCHAR

NVARCHAR2

Get(cno, SQLWCHAR** wcPP, byteLenP)

TTXLA_FLOAT

FLOAT

Get(cno, double* dP)

Get(cno, char** cPP)

TTXLA_BLOB

BLOB

Get(cno, const void** binPP,
byteLenP)

TTXLA_CLOB

CLOB

Get(cno, char** cPP)

TTXLA_NCLOB

NCLOB

Get(cno, SQLWCHAR** wcPP, byteLenP)

getColumn()

const TTXlaColumn* getColumn(u_int cno) const

TTXlaColumnオブジェクトを、行イメージ内の列番号cnoのメタデータとともに返します。

isColumnTTTimestamp()

bool isColumnTTTimestamp(int cno)

行イメージの列番号cnoがTT_TIMESTAMP列の場合は、TRUEを返し、それ以外の場合はFALSEを返します。

isNull()

bool isNull(int cno)

行イメージ内の列番号cnoの値がNULLである場合はTRUEを返し、そうでない場合はFALSEを返します。

numUpdatedCols()

SQLUSMALLINT numUpdatedCols()

行イメージ内で更新された列数を返します。

setTuple()

void setTuple(ttXlaUpdateDesc_t* updateDescP, int whichTuple)

行を検証する前に、このメソッドをまずコールして、特定の行イメージとTTXlaRowViewerオブジェクトを関連付ける必要があります。これはTTXlaTableHandler::HandleInsert()、HandleUpdate()またはHandleDelete()メソッド内で起動されるか、ユーザー記述のオーバーロードされたメソッドによって起動されます。これは、通常、TTXlaTableHandler::HandleChange()メソッドをオーバーロードする際に、コールします。これの使用例は、クイック・スタートのxlasubscriber1のデモのとおりです。(「TimesTen TTClassesデモについて」を参照してください。)

TTXlaPersistConnection::fetchUpdatesWait()によって返されるttXlaUpdateDesc_t構造体に含まれる行の数は、0(ゼロ)、1または2です。次のことに注意してください。

- 表に挿入された行を定義する構造体には、挿入された行の行イメージが含まれます。

- 表から削除された行を定義する構造体には、削除された行の行イメージが含まれます。

- 表内で更新された行を定義する構造体には、更新前の行イメージと更新後の行イメージが含まれます。

- 表またはデータベースの他の変更を定義する構造体には、行イメージが含まれません。たとえば、索引が削除されたことをレポートする構造体には行イメージが含まれません。

setTuple()メソッドは2つの引数を受け入れます。

- データベース変更を定義する特定のttXlaUpdateDesc_t構造体へのポインタ

- 更新構造体内のどのタイプの行イメージを調べるかを指定する整数。
有効な値は、次のとおりです。

- INSERTED_TUP: 新しく挿入された行を調べます。

- DELETED_TUP: 削除された行を調べます。

- UPDATE_OLD_TUP: 更新前の行を調べます。

- UPDATE_NEW_TUP: 更新後の行を調べます。

updatedCol()

SQLUSMALLINT updatedCol(u_int cno)

更新された列の列番号を返します。入力パラメータには、1からnを繰り返すことができます(ここで、nはnumUpdatedCols()から返される数字です)。例3-9に、更新された各行を取得するためにupdatedCol()とnumUpdatedCols()を使用する、TimesTenのクイック・スタート・デモのxlasubscriber1のスニペットを示します。(「TimesTen TTClassesデモについて」を参照してください。)

表3-9 TTXlaRowViewer::numUpdatedCols()とupdatedCol()の使用

void
SampleHandler::HandleUpdate(ttXlaUpdateDesc_t* )
{
cerr << row2.numUpdatedCols() << " column(s) updated: ";
for ( int i = 1; i <= row2.numUpdatedCols(); i++ )
{
cerr << row2.updatedCol(i) << "("
<< row2.getColumn(row2.updatedCol(i)-1)->getColName() << ") ";
}
cerr << endl;
}

TTXlaTableHandler

TTXlaTableHandlerクラスは、表の変更追跡を有効および無効にするメソッドを提供します。また、XLAからの更新通知レコードを処理するメソッドも提供します。これは、アプリケーション開発者が特定の表の変更を処理するカスタマイズ済クラスを記述する際の基本クラスです。

コンストラクタは、TTXlaTableHandlerオブジェクトを特定の表に関連付け、TTXlaTableHandlerオブジェクトに含まれるTTXlaTableデータ・メンバーを初期化します。

TTXlaTableHandler(TTXlaPersistConnection& conn, const char* ownerP,
const char* nameP)

「TTXlaTable」も参照してください。

使用方法

アプリケーション開発者は、TTXlaTableHandlerから1つ以上のクラスを導出し、そのクラスのHandleInsert()、HandleDelete()およびHandleUpdate()メソッドに、アプリケーションのロジックの大部分を配置できます。

表ごとにTTXlaTableHandlerから複数のクラスを導出する設計を行うことも可能です。たとえば、顧客データの変更を処理するビジネス・ロジックなどをCustomerTableHandlerクラスに実装し、注文データの変更を処理するビジネス・ロジックをOrderTableHandlerクラスに実装します。

もう1つの可能な設計は、様々な使用例を処理する1つ以上の汎用クラスをTTXlaTableHandlerから導出することです。たとえば、TTXlaTableHandlerから導出した汎用クラスを使用して、公開/サブスクライブ・システムを介して変更をパブリッシュできます。

TTXlaTableHandlerの拡張クラスの例は、TimesTenのクイック・スタートのxlasubscriber1とxlasubscriber2のデモを参照してください。(「TimesTen TTClassesデモについて」を参照してください。)

パブリック・メンバー

なし

保護メンバー

メンバー

説明

TTXlaTable tbl

これは処理対象の表に関連付けられたメタデータ用です。

TTXlaRowViewer row

これは、ユーザーが記述したHandleInsert()、HandleDelete()およびHandleUpdate()メソッド内の挿入または削除対象の行、更新対象の行の古いイメージを参照するために使用します。

TTXlaRowViewer row2

これは、ユーザーによって記述されたHandleUpdate()メソッド内の更新対象行の新しいイメージを参照するために使用します。

パブリック・メソッド

メソッド

説明

DisableTracking()

表のXLA更新追跡を無効にします。

EnableTracking()

表のXLA更新追跡を有効にします。

generateSQL()

特定のXLAレコードに関連付けられたSQLを返します。

HandleChange()

ttXlaUpdateDesc_tからレコードを適切な処理ルーチンにディスパッチして処理します。

HandleDelete()

削除操作を処理する際、HandleChange()メソッドのコール時にこれは起動されます。

HandleInsert()

これは、挿入操作を処理する際にHandleChange()メソッドがコールされるとき、起動されます。

HandleUpdate()

これは、更新操作を処理する際にHandleChange()メソッドがコールされるとき、起動されます。

DisableTracking()

virtual void DisableTracking()

表のXLA更新追跡を無効にします。このメソッドがコールされると、XLAブックマークでは、それ以降表に対する変更の情報を取得しなくなります。

EnableTracking()

virtual void EnableTracking()

表のXLA更新追跡を有効にします。このメソッドがコールされるまで、XLAブックマークでは、表に対する変更の情報を取得しません。

generateSQL()

void generateSQL (ttXlaUpdateDesc_t* updateDescP, char* buffer,
SQLINTEGER maxByteLen, SQLINTEGER* actualByteLenP)

このメソッドでは、特定のXLAレコードに関連付けられたSQLを出力します。SQL文字列は、bufferパラメータを介して返されます。バッファに領域を割り当て、最大長をmaxByteLenで指定します。actualByteLenPパラメータは、返されたSQL文字列の実際の長さの情報を返します。

maxByteLenが生成されたSQL文字列の長さよりも短い場合、TTStatusエラーがスローされ、bufferおよびactualByteLenPの内容は変更されません。

HandleChange()

virtual void HandleChange(ttXlaUpdateDesc_t* updateDescP)
virtual void HandleChange(ttXlaUpdateDesc_t* updateDescP, void* pData)

ttXlaUpdateDesc_tオブジェクトを適切な処理ルーチンにディスパッチして処理します。更新記述が分析され、それが削除、挿入または更新操作のいずれであるかが判別されます。その後、適切な処理メソッド(HandleDelete()、HandleInsert()またはHandleUpdate())がコールされます。

TTXlaTableHandlerから継承されるクラスでは、TTXlaTableHandler::HandleChange()メソッドをオーバーロードする際にオプションでpDataパラメータを使用できます。このオプションのパラメータは、処理されたばかりのXLAレコードのバッチがトランザクションの範囲内で終了したか判断するのに便利です。これを把握していると、アプリケーションでTTConnection::ackUpdates()を起動する適切なタイミングを判断できます。pDataパラメータの使用例は、「トランザクション境界におけるXLA更新の確認」を参照してください。

TTXlaTableListオブジェクトの詳細は、「HandleChange()」を参照してください。

HandleDelete()

virtual void HandleDelete(ttXlaUpdateDesc_t* updateDescP) = 0

このメソッドは、削除操作を処理するためにHandleChange()メソッドがコールされるたびに起動されます。

HandleDelete()はTTXlaTableHandler基本クラスには実装されていません。それを導出したクラスから、削除した行を処理する適切なロジックとともに実装する必要があります。

表から削除された行は、型TTXlaRowViewerのrow保護メンバーを介して利用できます。

HandleInsert()

virtual void HandleInsert(ttXlaUpdateDesc_t* updateDescP) = 0

このメソッドは、挿入操作を処理するためにHandleChange()メソッドがコールされるたびに起動されます。

HandleInsert()はTTXlaTableHandler基本クラスには実装されていません。それを導出したクラスから、挿入した行を処理する適切なロジックとともに実装する必要があります。

表に挿入された行は、型TTXlaRowViewerのrow保護メンバーを介して利用できます。

HandleUpdate()

virtual void HandleUpdate(ttXlaUpdateDesc_t* updateDescP) = 0

このメソッドは、更新操作を処理するためにHandleChange()メソッドがコールされるたびに起動されます。

HandleUpdate()はTTXlaTableHandler基本クラスには実装されていません。それを導出したクラスから、更新した行を処理する適切なロジックとともに実装する必要があります。

表から更新された行の以前のバージョンは、型TTXlaRowViewerのrow保護メンバーを介して利用できます。行の新しいバージョンは、こちらも型はTTXlaRowViewerであるrow2保護メンバーを介して利用できます。

TTXlaTableList

TTXlaTableListクラスには、一連のTTXlaTableHandlerオブジェクトがあり、更新通知イベントを適切なTTXlaTableHandlerにディスパッチするために使用されます。更新通知をXLAから受信すると、適切なTTXlaTableHandlerオブジェクトの適切なHandleXxx()メソッドをコールし、レコードは処理されます。

たとえば、CustomerTableHandler型のオブジェクトが表CUSTOMERの変更を処理し、OrderTableHandler型のオブジェクトが表ORDERSの変更を処理する場合、アプリケーションでは両方のオブジェクトをTTXlaTableListオブジェクト内に持つ必要があります。XLA更新通知レコードがXLAからフェッチされたとき、TTXlaTableList::HandleChange()をコールすることによって、それらのレコードを適切なハンドラにディスパッチできます。

コンストラクタには2種類の形式があります。

TTXlaTableList(TTXlaPersistConnection* cP, unsigned int num_tbls_to_monitor)

ここでnum_tbls_to_monitorは、監視するデータベース・オブジェクトの数です。

または

TTXlaTableList(TTXlaPersistConnection* cP);

cPは、XLA操作に使用するデータベース接続を示します。この形式のコンストラクタでは、最大150のデータベース・オブジェクトを監視できます。

使用方法

TTXlaTableHandlerオブジェクトをTTXlaTableHandlerオブジェクトに登録すると、XLAから更新通知レコードをフェッチし、適切なメソッドにディスパッチして処理するプロセスをループによって実行できます。

パブリック・メンバー

なし

パブリック・メソッド

メソッド

説明

add()

リストにTTXlaTableHandlerオブジェクトを追加します。

del()

リストからTTXlaTableHandlerオブジェクトを削除します。

HandleChange()

ttXlaUpdateDesc_t構造から取得されたレコードを処理します。

add()

void add(TTXlaTableHandler* tblh)

リストにTTXlaTableHandlerオブジェクトを追加します。

del()

void del(TTXlaTableHandler* tblh)

リストからTTXlaTableHandlerオブジェクトを削除します。

HandleChange()

void HandleChange(ttXlaUpdateDesc_t* updateDescP)
void HandleChange(ttXlaUpdateDesc_t* updateDescP, void* pData)

XLAからttXlaUpdateDesc_tオブジェクトを受け取った場合、レコードがどの表を参照するか判断し、適切なTTXlaTableHandlerオブジェクトのHandleChange()をコールする、このメソッドをコールして処理できます。

pDataパラメータの説明を含むTTXlaTableHandlerオブジェクトの詳細は、「HandleChange()」を参照してください。

TTXlaTable

TTXlaTableクラスは、変更の監視対象の表のメタデータをカプセル化します。これは、TimesTen ttXlaTblDesc_t Cデータ構造のメタデータ・インタフェースとして動作します。(『Oracle TimesTen In-Memory Database C開発者ガイド』のttXlaTblDesc_tに関する説明を参照。)

使用方法

ユーザー・アプリケーションでTTXlaTableHandlerを拡張するクラスが作成される場合、通常、列名をそのXLA列番号とマップするためにTTXlaTable::getColNumber()がコールされます。この列番号は、その後TTXlaRowViewer::Get()メソッドへの入力に使用できます。これは、TimesTenのクイック・スタートのxlasubscriber2のデモで示されています。(「TimesTen TTClassesデモについて」を参照してください。)

このクラスには、表の名前、所有者、列数を返す便利なメタデータ関数もあります。

パブリック・メンバー

なし

パブリック・メソッド

メソッド

説明

getColNumber()

表の指定した列の列番号を返します。

getNCols()

表の列数を返します。

getOwnerName()

表の所有者名を返します。

getTableName()

表の名前を返します。

getColNumber()

int getColNumber(const char* colNameP) const

表の列名を指定した場合、このメソッドでは列番号を返すか、その名前の列がない場合は-1を返します。

getNCols()

int getNCols() const

表の列数を返します。

getOwnerName()

const char* getOwnerName() const

表の所有者ユーザー名を返します。

getTableName()

const char* getTableName() const

表の名前を返します。

TTXlaColumn

TTXlaColumnオブジェクトには、変更の監視対象の表の単一行のメタデータが含まれます。これは、TimesTen ttXlaColDesc_t Cデータ構造のメタデータ・インタフェースとして動作します。(『Oracle TimesTen In-Memory Database C開発者ガイド』のttXlaColDesc_tに関する説明を参照してください。)列名、型、精度、スケールを含む情報を取得できます。

使用方法

アプリケーションで、TTXlaRowViewer::getColumn()メソッドを使用し、列とTTXlaColumnオブジェクトを関連付けます。

パブリック・メンバー

なし

パブリック・メソッド

メソッド

説明

getColName()

列の名前を返します。

getPrecision()

列の精度を返します。

getScale()

列のスケールを返します。

getSize()

列データのサイズをバイト単位で返します。

getSysColNum()

データベースに保存されているシステム生成のこの行の列番号を返します。

getType()

列のデータ型を整数で返します。

getUserColNum()

ユーザーがオプションで指定した列番号を返すか、0を返します。

isNullable()

列でNULL値が許可されるかどうかを示します。

isPKColumn()

列が表の主キーであるか示します。

isTTTimestamp()

列がTT_TIMESTAMP列であるか示します。

isUpdated()

列が更新されたかどうかを示します。

getColName()

const char* getColName() const

列の名前を返します。

getPrecision()

SQLULEN getPrecision() const

列内のデータ型で使用される桁の最大数であるデータの精度を返します。

getScale()

int getScale() const

列内のデータのスケールを返します(小数点以下の最大桁数)。

getSize()

SQLUINTEGER getSize() const

列内の値のサイズをバイト単位で返します。

getSysColNum()

SQLUINTEGER getSysColNum() const

これは、1から開始されるシステム生成の列の列番号です。これは、SYS.COLUMNSの対応するCOLNUM値と同じです。(『Oracle TimesTen In-Memory Databaseシステム表およびビュー・リファレンス』のSYS.COLUMNSに関する説明を参照してください。)

getType()

int getType() const

列のTimesTen XLAデータ型(TTXLA_xxx)を表す整数を返します。これはTimesTen ttXlaColDesc_tデータ構造のdataTypeフィールドからの値です。場合によっては、これはODBC SQLデータ型(SQL_xxx)と対応する標準の整数値と対応します。

TimesTenのXLAのデータ型の詳細は、『Oracle TimesTen In-Memory Database C開発者ガイド』のXLAのデータ型に関する説明を参照してください。対応する整数値は、TTXla.hヘッダー・ファイルを含む任意のTTClassesアプリケーションで使用されるために定義されています。

データ構造の詳細は、『Oracle TimesTen In-Memory Database C開発者ガイド』のttXlaColDesc_tに関する説明を参照してください。

getUserColNum()

SQLUINTEGER getUserColNum() const

ユーザーがオプションでttSetUserColumnIDのTimesTen組込みプロシージャで指定した列番号を返すか、0を返します。

『Oracle TimesTen In-Memory Databaseリファレンス』のttSetUserColumnIDに関する説明を参照してください。

isNullable()

bool isNullable() const

列でnull値が許可される場合はTRUEを返し、許可されない場合はFALSEを返します。

isPKColumn()

bool isPKColumn() const

列が表の主キーである場合はTRUEを返し、それ以外の場合はFALSEを返します。

isTTTimestamp()

bool isTTTimestamp() const

列がTT_TIMESTAMP列である場合はTRUEを返し、それ以外の場合はFALSEを返します。

isUpdated()

bool isUpdated() const

列が更新された場合はTRUEを返し、それ以外の場合はFALSEを返します。

索引
A  B  C  D  E  F  G  H  I  L  M  N  O  P  Q  R  S  T  U  W  X

A

アクセス制御

接続, 2.4.3

接続用のCREATE SESSION権限, 2.4.3.2

XLA, 2.7.3

TimesTenの機能, 2.3

XLA更新の確認

ackUpdatesメソッド, 3.3.1.3.1

トランザクション境界における, 2.7.2

トランザクション境界を使用しない, 2.7.1

ackUpdatesメソッド(XLA), 3.3.1.3.1 addメソッド(XLA表リストへの表ハンドラの追加), 3.3.4.3.1 AddConnectionToPoolメソッド, 3.1.4.3.1 AIX, リンク時の考慮事項, 1.2.1 自動コミット, 3.1.3.3.10

B

バッチ操作

パラメータのバインド, 3.1.5.5.2

実行, 3.1.5.5.3

準備, 3.1.5.5.4

バッチのサイズ, 3.1.5.5.1

TTCmdメソッド, 3.1.5.5

batchSizeメソッド, 3.1.5.5.1 バインド変数, 「パラメータのバインド」を参照 パラメータのバインド

SQLでの重複したパラメータ, 2.5.1.4

入力パラメータ, 2.5.1.1

バインド値の長さ, 設定(バッチ), 3.1.5.5.5

バインド値の長さ, 設定(バッチ以外), 3.1.5.3.23

null値, 設定(バッチ), 3.1.5.5.6

null値, 設定(バッチ以外), 3.1.5.3.24

出力および入力/出力パラメータ, 2.5.1.3

パラメータの登録, 2.5.1.2

registerParamメソッド, 3.1.5.3.19

パラメータ値の設定(バッチ), 3.1.5.5.2

パラメータ値の設定(バッチ以外), 3.1.5.3.22

BindParameterメソッド(パラメータのバインド, バッチ), 3.1.5.5.2 ブックマーク

位置の取得, 3.3.1.3.6

削除, 3.3.1.3.3

位置に戻る, 3.3.1.3.7

C

カタログ

カタログ・クラス(メタデータ情報, 表), 3.2.1

列クラス(メタデータ情報, 列), 3.2.3

カタログ・データのフェッチ, 3.2.1.2.1

索引クラス(メタデータ情報, 索引), 3.2.4

特殊列クラス(メタデータ情報, 特殊列), 3.2.5

システム・カタログ・クラス, 3.2

表クラス(メタデータ情報, 単一の表), 3.2.2

クライアント/サーバー, 遅延準備, 3.1.5.3.17 Closeメソッド(結果セットを閉じる), 3.1.5.3.1 列クラス, カタログ, 3.2.3 列, 列数, 返す, 3.2.2.2.3 columnPrecメソッド(XLA行ビューア), 3.3.2.3.1 columnScaleメソッド(XLA行ビューア), 3.3.2.3.2 Commitメソッド, 3.1.3.3.1 コンパイラ・マクロ

64-bitのTimesTen, 1.1.3.4

C++ストリーム, 1.1.3.2

gcc, 1.1.3.5

C++例外のスロー, 1.1.3.1

TT_64BIT, 1.1.3.4

TTC_USE_STRINGSTREAM, 1.1.3.2.1

TTDEBUG, 1.1.3.3

TTEXCEPT, 1.1.3.1

USE_OLD_CPP_STREAMS, 1.1.3.2.3

コンパイル

アプリケーション, 1.2

UNIXのアプリケーション, 1.2.1

Windowsのアプリケーション, 1.2.2

UNIXのTTClasses, 1.1.1.2

WindowsのTTClasses, 1.1.2.2

UNIXのTTClasses用のコンパイル・オプション, 1.1.1.3

WindowsのTTClasses用のコンパイル・オプション, 1.1.2.3

接続方法

説明, 3.1.3.3.2

例, 2.2

XLA, 3.3.1.3.2

接続

アクセス制御, 2.4.3

自動コミット, 3.1.3.3.10

接続の確認, 3.1.3.3.7

接続(XLA), 3.3.1.3.2

接続方法の例, 2.2

接続, 3.1.3.3.2

接続および切断, 2.4.2

接続クラスの定義, 2.2

接続プール, 3.1.4

コンテキスト値, 3.1.3.3.6

CREATE SESSION権限, 2.4.3.2

切断(XLA), 3.3.1.3.4

切断方法の例, 2.2

切断, 3.1.3.3.3

接続の管理, 2.4

ODBC接続ハンドル, 3.1.3.3.5

XLA接続のための権限, 2.4.3.3

TTConnectionクラス, 3.1.3

妥当性チェック, 3.1.2.4.1

XLA, 接続のための権限, 2.4.3.3

接続プール

プールへの接続の追加, 3.1.4.3.1

プール内のすべての接続の接続, 3.1.4.3.2

プール内のすべての接続の切断, 3.1.4.3.3

プールからの接続の取得, 3.1.4.3.5

プールへの接続の戻し, 3.1.4.3.4

ステータス情報, 3.1.4.3.6

TTConnectionPoolクラス, 3.1.4

CREATE SESSION権限, 2.4.3.2

D

データソース名(DSN), 2.4.1

デバッグ

デバッグ・ライブラリ, 共有および静的(UNIX), 1.1.1.3

情報の生成, 1.1.3.3

共有デバッグ・ライブラリ(UNIX), 1.1.1.3

静的デバッグ・ライブラリ(UNIX), 1.1.1.3

遅延準備, クライアント/サーバー, 3.1.5.3.17 delメソッド(XLA表リストからの表削除ハンドラ), 3.3.4.3.2 TTClassesライブラリおよびオブジェクト・ファイルの削除

UNIX, 1.1.1.3

Windows, 1.1.2.3

deleteBookmarkAndDisconnectメソッド, 3.3.1.3.3 TTClassesのデモ, 1.3 disableLoggingメソッド, 3.1.1.3.1 DisableTrackingメソッド(XLA表ハンドラ), 3.3.3.4.1 Disconnectメソッド

説明, 3.1.3.3.3

XLA, 3.3.1.3.4

DisconnectAllメソッド, 3.1.4.3.3 DO_NOT_THROWフラグ(TTStatus), 例外の抑制, 3.1.2.1 ドライバ・マネージャ

制限, 1.2.3

ドライバ・マネージャ用の共有最適化済ライブラリ(Windows), 1.1.2.3

Dropメソッド(準備済文の削除), 3.1.5.3.2 DSN(データソース名), 2.4.1 重複パラメータのバインド, 2.5.1.4 DuplicateBindMode一般的な接続属性, 2.5.1.4 DurableCommitメソッド, 3.1.3.3.4

E

EnableTrackingメソッド(XLA表ハンドラ), 3.3.3.4.2

環境ハンドル, ODBC, 3.1.1.3.4

環境変数

UNIX, 1.1.1.1

Windows, 1.1.2.1

エラー・レポート

ストリームへのエラーの出力, 3.1.2.4.2

例外の抑制, DO_NOT_THROWフラグ, 3.1.2.1

TTStatusでのtry/catch, 3.1.2.1

TTErrorクラス, 3.1.2.2.1

TTStatusクラス, 3.1.2

TTWarningクラス, 3.1.2.2.2

Executeメソッド(文の実行), 3.1.5.3.3 ExecuteBatchメソッド, 3.1.5.5.3 ExecuteImmediateメソッド(PrepareおよびExecuteのかわりに), 3.1.5.3.4

F

結果セットの行のフェッチ, 3.1.5.3.5

fetchCatalogDataメソッド, 3.2.1.2.1

FetchNextメソッド(結果セットの行のフェッチ), 3.1.5.3.5

fetchUpdatesWaitメソッド(XLA), 3.3.1.3.5

freeConnectionメソッド, 3.1.4.3.4

G

gcc, TTClassesのコンパイルで使用, 1.1.3.5

generateSQLメソッド(XLA表ハンドラ), 3.3.3.4.3

Getメソッド(列値, XLA行ビューア), 3.3.2.3.3

getBookmarkIndexメソッド(XLA), 3.3.1.3.6

getCollationメソッド(索引), 3.2.4.2.1

getColNameメソッド(XLA列), 3.3.6.3.1

getColNumberメソッド(XLA表), 3.3.5.3.1

getColumnメソッド

カタログ, 列, 3.2.2.2.1

説明, 3.1.5.3.6

メタデータ, XLA行ビューア, 3.3.2.3.4

getColumnLengthメソッド, 3.1.5.3.7 getColumnNameメソッド

カタログ, 列, 3.2.3.2.1

説明, 3.1.5.4.1

索引, 3.2.4.2.2

getColumnNameメソッド(特殊列), 3.2.5.3.1 getColumnNullabilityメソッド, 3.1.5.4.2 getColumnNullableメソッド, 3.1.5.3.8 getColumnPrecisionメソッド, 3.1.5.4.3 getColumnScaleメソッド, 3.1.5.4.4 getColumnTypeメソッド, 3.1.5.4.5 getDataTypeメソッド

列, 3.2.3.2.2

特殊列, 3.2.5.3.2

getHdbcメソッド, 3.1.3.3.5 getIndexメソッド, 3.2.2.2.2 getIndexNameメソッド, 3.2.4.2.3 getIndexOwnerメソッド, 3.2.4.2.4 getLengthメソッド

列, 3.2.3.2.3

特殊列, 3.2.5.3.3

getMaxRowsメソッド, 3.1.5.3.10 getNColsメソッド(列数, XLA表), 3.3.5.3.2 getNColumnsメソッド, 3.1.5.4.6 getNextColumnメソッド, 3.1.5.3.11 getNextColumnNullableメソッド, 3.1.5.3.12 getNParametersメソッド, 3.1.5.4.7 getNullableメソッド(列), 3.2.3.2.4 getNumColumnsメソッド

索引, 3.2.4.2.5

表, 3.2.2.2.3

getNumIndexesメソッド, 3.2.2.2.4 getNumSpecialColumnsメソッド, 3.2.2.2.5 getNumSysTablesメソッド, 3.2.1.2.2 getNumTablesメソッド, 3.2.1.2.3 getNumUserTablesメソッド, 3.2.1.2.4 getOwnerNameメソッド(XLA表), 3.3.5.3.3 getParamメソッド, 3.1.5.3.13 getParamNullabilityメソッド, 3.1.5.4.8 getParamPrecisionメソッド, 3.1.5.4.9 getParamScaleメソッド, 3.1.5.4.10 getParamTypeメソッド, 3.1.5.4.11 getPrecisionメソッド

列, 3.2.3.2.5

特殊列, 3.2.5.3.4

XLA列, 3.3.6.3.2

getQueryThresholdメソッド, 3.1.5.3.14 getRadixメソッド, 列, 3.2.3.2.6 getRowCountメソッド, 3.1.5.3.15 getScaleメソッド

列, 3.2.3.2.7

特殊列, 3.2.5.3.5

XLA列, 3.3.6.3.3

getSizeメソッド(XLA列), 3.3.6.3.4 getSpecialColumnメソッド, 3.2.2.2.6 getStatsメソッド, 3.1.4.3.6 getSysColNumメソッド(XLA列), 3.3.6.3.5 getTableメソッド, 3.2.1.2.5 getTableIndexメソッド, 3.2.1.2.6 getTableNameメソッド

カタログ, 表, 3.2.2.2.7

索引, 3.2.4.2.6

XLA表, 3.3.5.3.4

getTableOwnerメソッド, 3.2.2.2.8 getTableTypeメソッド, 3.2.2.2.9 GetTTContextメソッド, 3.1.3.3.6 getTypeメソッド

索引, 3.2.4.2.7

XLA列, 3.3.6.3.6

getTypeNameメソッド

列, 3.2.3.2.8

特殊列, 3.2.5.3.6

getUserColNumメソッド(XLA列), 3.3.6.3.7 getUserTableメソッド, 3.2.1.2.7

H

HandleChangeメソッド

XLA表ハンドラ, 3.3.3.4.4

XLA表リスト, 3.3.4.3.3

HandleDeleteメソッド(XLA表ハンドラ), 3.3.3.4.5 HandleInsertメソッド(XLA表ハンドラ), 3.3.3.4.6 HandleUpdateメソッド(XLA表ハンドラ), 3.3.3.4.7 HDBC(接続)ハンドル, ODBC, 3.1.3.3.5 HENV(環境)ハンドル, ODBC, 3.1.1.3.4 HSTMT(文)ハンドル, ODBC, 3.1.5, 3.1.5.3.9

I

索引クラス, カタログ, 3.2.4

索引, 索引数, 返す, 3.2.2.2.4

入力パラメータ, 2.5.1.1

I/Oストリーム, C++フラグ設定, 1.1.3.2

isBeingExecutedメソッド, 3.1.5.4.12

isColumnNullメソッド, 3.1.5.3.16

isColumnTTTimestampメソッド(XLA行ビューア), 3.3.2.3.5

isConnectedメソッド, 3.1.3.3.7

isConnectionInvalidメソッド, 3.1.2.4.1

isNullメソッド(列, XLA行ビューア), 3.3.2.3.6

isNullableメソッド(XLA列), 3.3.6.3.8

分離レベル

コミット読取り, 3.1.3.3.11

シリアライズ可能, 3.1.3.3.12

isPKColumnメソッド(主キー, XLA列), 3.3.6.3.9 isSystemTableメソッド, 3.2.2.2.10 isTTTimestampメソッド(XLA列), 3.3.6.3.10 isUniqueメソッド(索引), 3.2.4.2.8 isUpdatedメソッド(XLA列), 3.3.6.3.11 isUserTableメソッド, 3.2.2.2.11

L

アプリケーションのリンク

AIXの場合の考慮事項, 1.2.1

UNIXの場合, 1.2.1

Windowsの場合, 1.2.2

関連情報への参照, 1.2

Solarisの場合の考慮事項, 1.2.1

LOB

TimesTenのサポート, 2.5.4

XLAのサポート, 2.7

ロックのタイムアウト時間, 3.1.3.3.13 ロギング

無効, 3.1.1.3.1

レベル, 3.1.1.3.2

ログ情報, 送信先, 3.1.1.3.3

TTGlobalクラス, 3.1.1

使用, 2.6

M

マクロ, 「コンパイラ・マクロ」を参照

Make

clean, TTClassesライブラリとオブジェクト・ファイルの削除(UNIX), 1.1.1.3

clean, TTClassesライブラリとオブジェクト・ファイルの削除(Windows), 1.1.2.3

デバッグ・ライブラリ(UNIX), 1.1.1.3

最適化済ライブラリ(UNIX), 1.1.1.3

最適化済ライブラリ, 直接およびクライアント/サーバー(Windows), 1.1.2.3

最適化済ライブラリ, クライアント/サーバー(Windows), 1.1.2.3

共有デバッグ・ライブラリ(UNIX), 1.1.1.3

共有最適化済ライブラリ(UNIX), 1.1.1.3

ドライバ・マネージャ用の共有最適化済ライブラリ(Windows), 1.1.2.3

静的デバッグ・ライブラリ(UNIX), 1.1.1.3

静的最適化済ライブラリ(UNIX), 1.1.1.3

メタデータ

列, 3.2.3

索引, 3.2.4

システム表の数, 3.2.1.2.2

表の数, 3.2.1.2.3

ユーザー表の数, 3.2.1.2.4

特殊列, 3.2.5

表, 1つ, 3.2.2

表, 3.2.1

マルチスレッド・アプリケーション, 3.1.4

N

表名, 返す, 3.2.2.2.7

numUpdatedColsメソッド(XLA行ビューア), 3.3.2.3.7

O

ODBC

HDBC(接続)ハンドル, 3.1.3.3.5

HENV(環境)ハンドル, 3.1.1.3.4

HSTMT(文)ハンドル, 3.1.5, 3.1.5.3.9

最適化済ライブラリ

クライアント/サーバー(Windows), 1.1.2.3

直接およびクライアント/サーバー(Windows), 1.1.2.3

ドライバ・マネージャ用(Windows), 1.1.2.3

共有(UNIX), 1.1.1.3

共有および静的(UNIX), 1.1.1.3

静的(UNIX), 1.1.1.3

ostreamメソッド, 3.1.2.4.2 OUTおよびIN OUTパラメータ

出力値の取得, 3.1.5.3.13

登録, 2.5.1.2

出力および入力/出力パラメータ

バインド, 2.5.1.3

表の所有者, 返す, 3.2.2.2.8

P

パラメータのバインド, 「パラメータのバインド」を参照

プリフェッチ, 3.1.3.3.15

Prepareメソッド(文の準備), 3.1.5.3.17

PrepareBatchメソッド, 3.1.5.5.4

printColumnメソッド, 3.1.5.3.18

Q

問合せ, 「結果セット」を参照

TTClassesのクイック・スタート・デモ, 1.3

R

REF CURSOR

REF CURSOR用のgetParamメソッド, 3.1.5.3.13

使用, 2.5.2

registerParamメソッド, 2.5.1.2, 3.1.5.3.19 RePrepareメソッド(無効化後), 3.1.5.3.20 結果セット

閉じる, 3.1.5.3.1

現在の行の列のフェッチ, 3.1.5.3.6

現在の行の次の列のフェッチ, 3.1.5.3.11

行のフェッチ, 3.1.5.3.5

最大行数, 3.1.5.3.21

現在の行の列値の出力, 3.1.5.3.18

Rollbackメソッド, 3.1.3.3.8 ROWID, ROWID型, 2.5.3

S

SetAutoCommitOffメソッド, 3.1.3.3.9

SetAutoCommitOnメソッド, 3.1.3.3.10

setBookmarkIndexメソッド(XLA), 3.3.1.3.7

SetIsoReadCommittedメソッド, 3.1.3.3.11

SetIsoSerializableメソッド, 3.1.3.3.12

SetLockWaitメソッド, 3.1.3.3.13

setLogLevelメソッド, 3.1.1.3.2

setLogStreamメソッド, 3.1.1.3.3

setMaxRowsメソッド, 3.1.5.3.21

setParamメソッド(パラメータのバインド, バッチ以外), 3.1.5.3.22

setParamLengthメソッド

バッチ操作, 3.1.5.5.5

バッチ以外の操作, 3.1.5.3.23

setParamNullメソッド

バッチ操作, 3.1.5.5.6

バッチ以外の操作, 3.1.5.3.24

SetPrefetchCloseOffメソッド, 3.1.3.3.14 SetPrefetchCloseOnメソッド, 3.1.3.3.15 SetPrefetchCountメソッド, 3.1.3.3.16 setQueryThresholdメソッド, 3.1.5.3.25 setQueryTimeoutメソッド, 3.1.5.3.26 setTupleメソッド(XLA行ビューア), 3.3.2.3.8 共有デバッグ・ライブラリ(UNIX), 1.1.1.3 共有最適化済ライブラリ(UNIX), 1.1.1.3 バッチのサイズ, 3.1.5.5.1 Solaris, リンク時の考慮事項, 1.2.1 特殊列クラス, カタログ, 3.2.5 SQL文

削除, 3.1.5.3.2

実行, 3.1.5.3.3

即時実行(準備と実行ではなく), 3.1.5.3.4

実行, 確認, 3.1.5.4.12

影響を受ける行数, 3.1.5.3.15

準備, 3.1.5.3.17

再準備(無効化後), 3.1.5.3.20

タイムアウトおよびしきい値, 2.5.5

TTCmdクラス, 3.1.5

sqlhenvメソッド, 3.1.1.3.4 文ハンドル, ODBC, 3.1.5, 3.1.5.3.9 文, 「SQL文」を参照 静的デバッグ・ライブラリ(UNIX), 1.1.1.3 静的最適化済ライブラリ(UNIX), 1.1.1.3 ストリーム, C++フラグ設定, 1.1.3.2 システム・カタログ, 「カタログ」を参照

T

表クラス, カタログ, 3.2.2

しきい値, SQL文, 2.5.5

throwErrorメソッド, 3.1.2.4.3

タイムアウト, SQL文, 2.5.5

トランザクション

トランザクション境界におけるXLA更新の確認, 2.7.2

トランザクション境界を使用しないXLA更新の確認, 2.7.1

自動コミット, 3.1.3.3.10

コミット, 3.1.3.3.1

永続コミット, 3.1.3.3.4

分離レベル, コミット読取り, 3.1.3.3.11

分離レベル, シリアライズ可能, 3.1.3.3.12

ログAPI, 概要, 2.7

ロールバック, 3.1.3.3.8

TT_64BITコンパイラ・マクロ, 1.1.3.4 TTC_USE_STRINGSTREAMコンパイラ・マクロ, 1.1.3.2.1 TTCatalogクラス(メタデータ情報, 表), 3.2.1 TTCatalogColumnクラス

メタデータ情報, 列, 3.2.3

TTCatalogColumnオブジェクトを返す, 3.2.2.2.1

TTCatalogIndexクラス

メタデータ情報, 索引, 3.2.4

TTCatalogIndexオブジェクトを返す, 3.2.2.2.2

TTCatalogSpecialColumnクラス

メタデータ情報, 特殊列, 3.2.5

TTCatalogSpecialColumnオブジェクトを返す, 3.2.2.2.6

TTCatalogTableクラス

メタデータ情報, 単一の表, 3.2.2

TTCatalogTableオブジェクトを返す, 3.2.1.2.5

TTCmdクラス(SQL文)

バッチ操作, 3.1.5.5

一般的な用途, 3.1.5.3

概要, 3.1.5

バッチ以外の操作, 3.1.5.3

オブジェクト・プロパティ, 取得, 3.1.5.4

概要, 使用, 2.2

TTConnectionクラス

説明, 3.1.3

概要, 使用, 2.2

TTConnectionPoolクラス

説明, 3.1.4

概要, 使用, 2.2

TTDEBUGコンパイラ・マクロ, 1.1.3.3 TTErrorクラス, 3.1.2.2.1 TTEXCEPTコンパイラ・マクロ, 1.1.3.1 TTGlobalクラス(ロギング), 3.1.1 TTStatusクラス(エラーのレポート), 3.1.2 TTWarningクラス, 3.1.2.2.2 TTXlaColumnクラス, 3.3.6 TTXlaPersistConnectionクラス, 3.3.1 TTXlaRowViewerクラス, 3.3.2 TTXlaTableクラス, 3.3.5 TTXlaTableHandlerクラス, 3.3.3 TTXlaTableListクラス, 3.3.4

U

UNIX

TTClasses用のコンパイル・オプション, 1.1.1.3

アプリケーションのコンパイルおよびリンク, 1.2.1

TTClassesのコンパイル, 1.1.1.2

環境変数, 1.1.1.1

TTClassesライブラリのインストール, 1.1.1.4

updatedColメソッド(XLA行ビューア), 3.3.2.3.9 USE_OLD_CPP_STREAMSコンパイラ・マクロ, 1.1.3.2.3

W

Windows

TTClasses用のコンパイル・オプション, 1.1.2.3

アプリケーションのコンパイルおよびリンク, 1.2.2

TTClassesのコンパイル, 1.1.2.2

環境変数, 1.1.2.1

X

XLA

アクセス制御, 2.7.3

ackUpdatesメソッド, 更新の確認, 3.3.1.3.1

ブックマーク位置, 取得, 3.3.1.3.6

ブックマーク位置, 返す, 3.3.1.3.7

クラス, 2.7

XLAを使用するためのクラス, 3.3

列クラス, 3.3.6

接続, 3.3.1.3.2

接続, 作成, 3.3.1

接続, 権限, 2.4.3.3

ブックマークの削除, 3.3.1.3.3

切断, 3.3.1.3.4

レコードのフェッチ, 3.3.1.3.5

LOBサポート, 2.7

接続のための権限, 2.4.3.3

行ビューア・クラス, 3.3.2

表クラス, 3.3.5

表ハンドラ・クラス, 3.3.3

表リスト・クラス, 3.3.4

更新, トランザクション境界における確認, 2.7.2

更新, トランザクション境界を使用しない確認, 2.7.1

オラクル社の法律上の注意点について

コピーライトについて

Copyright © 1994-2015, Oracle and/or its affiliates.All rights reserved.

商標と登録商標について

OracleおよびJavaはOracle Corporationおよびその関連企業の登録商標です。その他の名称は、それぞれの所有者の商標または登録商標です。

Intel、Intel Xeonは、Intel Corporationの商標または登録商標です。すべてのSPARCの商標はライセンスをもとに使用し、SPARC International, Inc.の商標または登録商標です。AMD、Opteron、AMDロゴ、AMD Opteronロゴは、Advanced Micro Devices, Inc.の商標または登録商標です。UNIXは、The Open Groupの登録商標です。

ライセンス制約の保証と結果的に生じる損害の免責

このソフトウェアおよび関連ドキュメントの使用と開示は、ライセンス契約の制約条件に従うものとし、知的財産に関する法律により保護されています。ライセンス契約で明示的に許諾されている場合もしくは法律によって認められている場合を除き、形式、手段に関係なく、いかなる部分も使用、複写、複製、翻訳、放送、修正、ライセンス供与、送信、配布、発表、実行、公開または表示することはできません。このソフトウェアのリバース・エンジニアリング、逆アセンブル、逆コンパイルは互換性のために法律によって規定されている場合を除き、禁止されています。

保証免責

ここに記載された情報は予告なしに変更される場合があります。また、誤りが無いことの保証はいたしかねます。誤りを見つけた場合は、オラクル社までご連絡ください。

制限付権利

このソフトウェアまたは関連ドキュメントを、米国政府機関もしくは米国政府機関に代わってこのソフトウェアまたは関連ドキュメントをライセンスされた者に提供する場合は、次の通知が適用されます。

U.S. GOVERNMENT END USERS: Oracle programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, delivered to U.S. Government end users are "commercial computer software" pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations.As such, use, duplication, disclosure, modification, and adaptation of the programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, shall be subject to license terms and license restrictions applicable to the programs.No other rights are granted to the U.S. Government.

危険な用途への使用について

このソフトウェアもしくはハードウェアは様々な情報管理アプリケーションでの一般的な使用のために開発されたものです。このソフトウェアもしくはハードウェアは、危険が伴うアプリケーション（人的傷害を発生させる可能性があるアプリケーションを含む）への用途を目的として開発されていません。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用する際、安全に使用するために、適切な安全装置、バックアップ、冗長性（redundancy）、その他の対策を講じることは使用者の責任となります。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用したことに起因して損害が発生しても、オラクル社およびその関連会社は一切の責任を負いかねます。

第三者のコンテンツ、製品、サービスに対する免責事項

このソフトウェアまたはハードウェア、そしてドキュメントは、第三者のコンテンツ、製品、サービスへのアクセス、あるいはそれらに関する情報を提供することがあります。オラクル社およびその関連会社は、第三者のコンテンツ、製品、サービスに関して一切の責任を負わず、いかなる保証もいたしません。オラクル社およびその関連会社は、第三者のコンテンツ、製品、サービスへのアクセスまたは使用によって損失、費用、あるいは損害が発生しても一切の責任を負いかねます。

ドラフトのアルファ版およびベータ版ドキュメントについて

このドキュメントが試作版の場合:

このドキュメントは試作版であり、デモおよび暫定使用のみを目的としたものです。このソフトウェアを使用するハードウェアに限定するものではありません。オラクル社およびその関連会社は、このドキュメントに関して一切の責任を負わず、いかなる保証もいたしません。また、このドキュメントを使用したことによって損失、費用、あるいは損害が発生しても、一切の責任を負いかねます。