Oracle® C++ Call Interface プログラマーズ・ガイド

11g リリース2 (11.2)

B72452-01(原本部品番号:E10764-04)

目次

例一覧

図一覧

表一覧

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

はじめに

- 対象読者

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

- 関連ドキュメント

- 表記規則

Oracle C++ Call Interfaceの新機能

- Oracle Database 11g リリース2（11.2）における新機能

- Oracle Database 11g リリース1（11.1）における新機能

1 OCCIの概要

- OCCIの概要

- OCCIの利点

- OCCIアプリケーションの構築

- OCCIの機能

- 手続き型および非手続き型要素

- SQL文の処理

- データ定義言語文

- 制御文

- データ操作言語文

- 問合せ

- PL/SQLの概要

- OCCI/SQLの特殊用語

- オブジェクトのサポート

- クライアント側オブジェクト・キャッシュ

- オブジェクト用のランタイム環境

- 連想アクセス用インタフェースおよびナビゲーショナル・アクセス用インタフェース

- OCIとの相互運用性

- メタデータ・クラス

- オブジェクト型トランスレータ・ユーティリティ

- 追加のサポート

- OCCIデモのビルド

- Oracle Technology NetworkでのOCCI

2 インストールとアップグレード

- Oracle C++ Call Interfaceのインストール

- アップグレードに関する考慮点

- Oracle Databaseバージョンの決定

- コンパイル時のOracleクライアント・バージョンの決定

- 実行時のOracleクライアントおよびサーバーのバージョンの決定

- Instant Client

- Instant Clientの利点

- Instant Clientのインストール

- Instant Clientの使用

- UNIXにおけるInstant Client共有ライブラリのパッチ

- データ共有ライブラリおよびzipファイルの再生成

- Instant Clientのデータベース接続名

- OCCI Instant Clientの環境変数

- Instant Client Light (English)

- Instant Client Light (English)のグローバリゼーション設定

- Instant Client Light (English)の使用

- Instant Client Light (English)のインストール

- Microsoft Visual C++でのOCCIの使用

3 リレーショナル・プログラミング

- データベースへの接続

- 環境の作成と終了

- 接続のオープンとクローズ

- 接続プーリング

- 接続プールの使用

- ステートレスな接続プーリング

- データベース常駐接続プーリング

- SQLのDDL文とDML文の実行

- 文オブジェクトの作成

- SQLコマンドを実行する文オブジェクトの作成

- 文オブジェクトの再利用

- 文オブジェクトの終了

- OCCI環境で使用するSQL文の種類

- 標準的な文

- パラメータ化された文

- コール可能文

- ストリーム読込み/書込み

- 行変更の反復

- SQL問合せの実行

- 結果セットの使用

- 問合せの指定

- プリフェッチ・カウントの設定によるパフォーマンスの最適化

- 文の動的実行

- 文のステータスの定義

- トランザクションのコミット

- 文キャッシュ

- 例外処理

- NULLおよび切捨てデータの処理

4 オブジェクト・プログラミング

- オブジェクト・プログラミングの概要

- OCCIでのオブジェクトの操作

- 永続オブジェクト

- 一時オブジェクト

- 値

- C++アプリケーションでのオブジェクトの表現

- 永続オブジェクトと一時オブジェクトの作成

- OTTユーティリティによるオブジェクト表現の作成

- OCCIオブジェクト・アプリケーションの開発

- 基本的なオブジェクト・プログラム構造

- 基本的なオブジェクト操作のフロー

- OCCIによるC++アプリケーションの移行

- 連想アクセスの概要

- SQLによるオブジェクトへのアクセス

- 値の挿入と変更

- ナビゲーショナル・アクセスの概要

- データベース・サーバーからのオブジェクト参照（REF）の取出し

- オブジェクトの確保

- オブジェクト属性の操作

- オブジェクトのマークおよび変更のフラッシュ

- オブジェクトへの変更済（使用済）のマーク付け

- データベースへの変更の記録

- オブジェクト・キャッシュでのガベージ・コレクション

- 参照のトランザクション一貫性の確保

- 複合オブジェクト検索の概要

- 複合オブジェクト検索

- 複合オブジェクトのプリフェッチ

- コレクションの操作

- 埋込みオブジェクトのフェッチ

- NULL

- オブジェクト参照の使用

- データベースからのオブジェクトの削除

- 型の継承

- 代用性

- NOT INSTANTIABLEの型とメソッド

- OCCIでの型の継承のサポート

- OTTでの型の継承のサポート

- サンプルOCCIアプリケーション

5 データ型

- Oracleデータ型の概要

- OCCI型とデータ変換

- 内部データ型

- 文字列とバイト配列

- ユニバーサルROWID（UROWID）

- 外部データ型

- 外部データ型の説明

- データ変換

- LOBデータ型のデータ変換

- 日付、タイムスタンプおよび間隔データ型のデータ変換

6 メタデータ

- メタデータの概要

- データベース・メタデータの記述

- メタデータのコード例

- 属性参照

- パラメータ属性

- 表およびビューの属性

- プロシージャ、ファンクションおよびサブプログラムの属性

- パッケージ属性

- 型属性

- 型属性の属性

- 型メソッド属性

- コレクション属性

- シノニム属性

- 順序属性

- 列属性

- 引数属性および結果属性

- リスト属性

- スキーマ属性

- データベース属性

7 LOBによるプログラミング

- LOBの概要

- 内部LOBの概要

- 外部LOBの概要

- LOBの格納

- OCCIアプリケーションでのLOBの作成

- LOBのオープンおよびクローズの制限

- LOBの読込みおよび書込み

- LOBの読込み

- LOBの書込み

- LOBの読込みおよび書込みのパフォーマンス向上

- LOBの更新

- 複数のLOBの読込みおよび書込み

- LOB属性を含むオブジェクトの使用

- SecureFilesの使用

- SecureFileの圧縮の使用

- SecureFilesの暗号化の使用

- SecureFilesの重複除外の使用

- SecureFilesの圧縮、暗号化および重複除外の結合

- SecureFilesのLOBの型および定数

8 オブジェクト型トランスレータ・ユーティリティ

- オブジェクト型トランスレータ・ユーティリティの概要

- OTTユーティリティの使用

- データベースでの型の作成

- OTTユーティリティの起動

- OTTパラメータの指定

- コマンドラインでのOTTユーティリティの起動

- OTTユーティリティのパラメータ

- OTTパラメータの指定可能な場所

- ファイル名の比較に関する制限

- INTYPEファイルの使用

- INTYPEファイルの概要

- INTYPEファイルの構造

- ネストされたインクルード・ファイル（#include）の生成

- OTTユーティリティのデータ型マッピング

- デフォルトの名前のマッピング

- OUTTYPEファイルの概要

- OTTユーティリティとOCCIアプリケーション

- OTTユーティリティによって生成されるC++クラス

- マップ・レジストリ関数

- C++クラスの拡張

- ユーザー追加コードの引継ぎ

- OTTマーカーのプロパティ

- OTTマーカーの使用

9 グローバリゼーションおよびUnicodeのサポート

- グローバリゼーションおよびUnicodeのサポートの概要

- キャラクタ・セットの指定

- グローバリゼーションおよびUnicodeのサポートのデータ型

- UStringデータ型

- マルチバイトおよびUTF16データ

- CLOBおよびNCLOBデータ型

- オブジェクトおよびOTTサポート

10 Oracle Streams Advanced Queuing

- Oracle Streams Advanced Queuingの概要

- OCCIでのAQ実装

- Message

- Agent

- Producer

- Consumer

- Listener

- Subscription

- メッセージの作成

- メッセージ・ペイロード

- メッセージ・プロパティ

- メッセージのエンキュー

- メッセージのデキュー

- デキュー・オプション

- メッセージのリスニング

- 通知を受けるための登録

- パブリッシュ・サブスクライブ通知

- 通知コールバック

- メッセージ形式の変換

11 Oracle XAライブラリ

- XAおよびOCCIによるアプリケーション開発

- XAサポートのためのAPI

12 OCCIアプリケーションのパフォーマンスの最適化

- 透過的アプリケーション・フェイルオーバー

- 透過的アプリケーション・フェイルオーバーの使用方法

- オブジェクトと透過的アプリケーション・フェイルオーバー

- 接続プーリングと透過的アプリケーション・フェイルオーバー

- 接続の共有

- スレッド・セーフティの概要

- スレッド・セーフティの実装

- シリアライズ

- オペレーティング・システムの考慮事項

- アプリケーションによるデータ・バッファの管理

- setDataBuffer()メソッド

- executeArrayUpdate()メソッド

- next()メソッドを使用した配列フェッチ

- 行変更の反復

- ステートレスな接続プールのランタイム・ロード・バランシング

- APIのサポート

- 障害診断

- ADRベースの位置

- ADRCIの使用

- ADR作成の制御および障害診断の無効化

- クライアントの結果キャッシュ

13 OCCI Application Program Interface (API)

- OCCIのクラスとメソッド

- OCCIクラスの使用

- OCCIでのWindows NTおよびz/OSのサポート

- OCCIの共通定数

- Agentクラス

- Agent()

- getAddress()

- getName()

- getProtocol()

- isNull()

- operator=()

- setAddress()

- setName()

- setNull()

- setProtocol()

- AnyDataクラス

- AnyData()

- getAsBDouble()

- getAsBfile()

- getAsBFloat()

- getAsBytes()

- getAsDate()

- getAsIntervalDS()

- getAsIntervalYM()

- getAsNumber()

- getAsObject()

- getAsRef()

- getAsString()

- getAsTimestamp()

- getType()

- isNull()

- setFromBDouble()

- setFromBfile()

- setFromBFloat()

- setFromBytes()

- setFromDate()

- setFromIntervalDS()

- setFromIntervalYM()

- setFromNumber()

- setFromObject()

- setFromRef()

- setFromString()

- setFromTimestamp()

- setNull()

- BatchSQLExceptionクラス

- getException()

- getFailedRowCount()

- getRowNum()

- Bfileクラス

- Bfile()

- close()

- closeStream()

- fileExists()

- getDirAlias()

- getFileName()

- getStream()

- getUStringDirAlias()

- getUStringFileName()

- isInitialized()

- isNull()

- isOpen()

- length()

- open()

- operator=()

- operator==()

- operator!=()

- read()

- setName()

- setNull()

- Blobクラス

- Blob()

- append()

- close()

- closeStream()

- copy()

- getChunkSize()

- getContentType()

- getOptions()

- getStream()

- isInitialized()

- isNull()

- isOpen()

- length()

- open()

- operator=()

- operator==()

- operator!= ()

- read()

- setContentType()

- setEmpty()

- setNull()

- setOptions()

- trim()

- write()

- writeChunk()

- Bytesクラス

- Bytes()

- byteAt()

- getBytes()

- isNull()

- length()

- operator=()

- setNull()

- Clobクラス

- Clob()

- append()

- close()

- closeStream()

- copy()

- getCharSetForm()

- getCharSetId()

- getCharSetIdUString()

- getChunkSize()

- getContentType()

- getOptions()

- getStream()

- isInitialized()

- isNull()

- isOpen()

- length()

- open()

- operator=()

- operator==()

- operator!=()

- read()

- setCharSetId()

- setCharSetIdUString()

- setCharSetForm()

- setContentType()

- setEmpty()

- setNull()

- setOptions()

- trim()

- write()

- writeChunk()

- Connectionクラス

- changePassword()

- commit()

- createStatement()

- flushCache()

- getClientCharSet()

- getClientCharSetUString()

- getClientNCHARCharSet()

- getClientNCHARCharSetUString()

- getClientVersion()

- getMetaData()

- getOCIServer()

- getOCIServiceContext()

- getOCISession()

- getServerVersion()

- getServerVersionUString()

- getStmtCacheSize()

- getTag()

- isCached()

- pinVectorOfRefs()

- postToSubscriptions()

- readVectorOfBfiles()

- readVectorOfBlobs()

- readVectorOfClobs()

- registerSubscriptions()

- rollback()

- setStmtCacheSize()

- setTAFNotify()

- terminateStatement()

- unregisterSubscription()

- writeVectorOfBlobs()

- writeVectorOfClobs()

- ConnectionPoolクラス

- createConnection()

- createProxyConnection()

- getBusyConnections()

- getIncrConnections()

- getMaxConnections()

- getMinConnections()

- getOpenConnections()

- getPoolName()

- getStmtCacheSize()

- getTimeOut()

- setErrorOnBusy()

- setPoolSize()

- setStmtCacheSize()

- setTimeOut()

- terminateConnection()

- Consumerクラス

- Consumer()

- getConsumerName()

- getCorrelationId()

- getDequeueMode()

- getMessageIdToDequeue()

- getPositionOfMessage()

- getQueueName()

- getTransformation()

- getVisibility()

- getWaitTime()

- isNull()

- operator=()

- receive()

- setAgent()

- setConsumerName()

- setCorrelationId()

- setDequeueMode()

- setMessageIdToDequeue()

- setNull()

- setPositionOfMessage()

- setQueueName()

- setTransformation()

- setVisibility()

- setWaitTime()

- Dateクラス

- Date()

- addDays()

- addMonths()

- daysBetween()

- fromBytes()

- fromText()

- getDate()

- getSystemDate()

- isNull()

- lastDay()

- nextDay()

- operator=()

- operator==()

- operator!=()

- operator>()

- operator>=()

- operator<()

- operator<=()

- setDate()

- setNull()

- toBytes()

- toText()

- toZone()

- Environmentクラス

- createConnection()

- createConnectionPool()

- createEnvironment()

- createStatelessConnectionPool()

- enableSubscription()

- disableSubscription()

- getCacheMaxSize()

- getCacheOptSize()

- getCacheSortedFlush()

- getCurrentHeapSize()

- getLDAPAdminContext()

- getLDAPAuthentication()

- getLDAPHost()

- getLDAPPort()

- getMap()

- getOCIEnvironment()

- getXAConnection()

- getXAEnvironment()

- releaseXAConnection()

- releaseXAEnvironment()

- setCacheMaxSize()

- setCacheOptSize()

- setCacheSortedFlush()

- setLDAPAdminContext()

- setLDAPAuthentication()

- setLDAPHostAndPort()

- setLDAPLoginNameAndPassword()

- terminateConnection()

- terminateConnectionPool()

- terminateEnvironment()

- terminateStatelessConnectionPool()

- IntervalDSクラス

- IntervalDS()

- fromText()

- fromUText()

- getDay()

- getFracSec()

- getHour()

- getMinute()

- getSecond()

- isNull()

- operator*()

- operator*=()

- operator=()

- operator==()

- operator!=()

- operator/()

- operator/=()

- operator>()

- operator>=()

- operator<()

- operator<=()

- operator-()

- operator-=()

- operator+()

- operator+=()

- set()

- setNull()

- toText()

- toUText()

- IntervalYMクラス

- IntervalYM()

- fromText()

- fromUText()

- getMonth()

- getYear()

- isNull()

- operator*()

- operator*=()

- operator=()

- operator==()

- operator!=()

- operator/()

- operator/=()

- operator>()

- operator>=()

- operator<()

- operator<=()

- operator-()

- operator-=()

- operator+()

- operator+=()

- set()

- setNull()

- toText()

- toUText()

- Listenerクラス

- Listener()

- getAgentList()

- getTimeOutForListen()

- listen()

- setAgentList()

- setTimeOutForListen()

- Mapクラス

- put()

- Messageクラス

- Message()

- getAnyData()

- getAttemptsToDequeue()

- getBytes()

- getCorrelationId()

- getDelay()

- getExceptionQueueName()

- getExpiration()

- getMessageEnqueuedTime()

- getMessageState()

- getObject()

- getOriginalMessageId()

- getPayloadType()

- getPriority()

- getSenderId()

- isNull()

- operator=()

- setAnyData()

- setBytes()

- setCorrelationId()

- setDelay()

- setExceptionQueueName()

- setExpiration()

- setNull()

- setObject()

- setOriginalMessageId()

- setPriority()

- setRecipientList()

- setSenderId()

- MetaDataクラス

- MetaData()

- getAttributeCount()

- getAttributeId()

- getAttributeType()

- getBoolean()

- getInt()

- getMetaData()

- getNumber()

- getRef()

- getString()

- getTimeStamp()

- getUInt()

- getUString()

- getVector()

- operator=()

- NotifyResultクラス

- getConsumerName()

- getMessage()

- getMessageId()

- getPayload()

- getQueueName()

- Numberクラス

- Number()

- abs()

- arcCos()

- arcSin()

- arcTan()

- arcTan2()

- ceil()

- cos()

- exp()

- floor()

- fromBytes()

- fromText()

- hypCos()

- hypSin()

- hypTan()

- intPower()

- isNull()

- ln()

- log()

- operator++()

- operator--()

- operator*()

- operator/()

- operator%()

- operator+()

- operator-()

- operator-()

- operator<()

- operator<=()

- operator>()

- operator>=()

- operator==()

- operator!=()

- operator=()

- operator*=()

- operator/=()

- operator%=()

- operator+=()

- operator-=()

- operator char()

- operator signed char()

- operator double()

- operator float()

- operator int()

- operator long()

- operator long double()

- operator short()

- operator unsigned char()

- operator unsigned int()

- operator unsigned long()

- operator unsigned short()

- power()

- prec()

- round()

- setNull()

- shift()

- sign()

- sin()

- squareroot()

- tan()

- toBytes()

- toText()

- trunc()

- PObjectクラス

- PObject()

- flush()

- getConnection()

- getRef()

- getSQLTypeName()

- isLocked()

- isNull()

- lock()

- markDelete()

- markModified()

- operator=()

- operator delete()

- operator new()

- pin()

- setNull()

- unmark()

- unpin()

- Producerクラス

- Producer()

- getQueueName()

- getRelativeMessageId()

- getSequenceDeviation()

- getTransformation()

- getVisibility()

- isNull()

- operator=()

- send()

- setNull()

- setQueueName()

- setRelativeMessageId()

- setSequenceDeviation()

- setTransformation()

- setVisibility()

- Refクラス

- Ref()

- clear()

- getConnection()

- isClear()

- isNull()

- markDelete()

- operator->()

- operator*()

- operator==()

- operator!=()

- operator=()

- ptr()

- setLock()

- setNull()

- setPrefetch()

- unmarkDelete()

- RefAnyクラス

- RefAny()

- clear()

- getConnection()

- isNull()

- markDelete()

- operator=()

- operator==()

- operator!=()

- unmarkDelete()

- ResultSetクラス

- cancel()

- closeStream()

- getBDouble()

- getBfile()

- getBFloat()

- getBlob()

- getBytes()

- getCharSet()

- getCharSetUString()

- getClob()

- getColumnListMetaData()

- getCurrentStreamColumn()

- getCurrentStreamRow()

- getCursor()

- getDatabaseNCHARParam()

- getDate()

- getDouble()

- getFloat()

- getInt()

- getIntervalDS()

- getIntervalYM()

- getMaxColumnSize()

- getNumArrayRows()

- getNumber()

- getObject()

- getRef()

- getRowid()

- getRowPosition()

- getStatement()

- getStream()

- getString()

- getTimestamp()

- getUInt()

- getUString()

- getVector()

- getVectorOfRefs()

- isNull()

- isTruncated()

- next()

- preTruncationLength()

- setBinaryStreamMode()

- setCharacterStreamMode()

- setCharSet()

- setCharSetUString()

- setDatabaseNCHARParam()

- setDataBuffer()

- setErrorOnNull()

- setErrorOnTruncate()

- setPrefetchMemorySize()

- setPrefetchRowCount()

- setMaxColumnSize()

- status()

- SQLExceptionクラス

- SQLException()

- getErrorCode()

- getMessage()

- getNLSMessage()

- getNLSUStringMessage()

- getUStringMessage()

- getXAErrorCode()

- setErrorCtx()

- what()

- StatelessConnectionPoolクラス

- getAnyTaggedConnection()

- getAnyTaggedProxyConnection()

- getBusyConnections()

- getBusyOption()

- getConnection()

- getIncrConnections()

- getMaxConnections()

- getMinConnections()

- getOpenConnections()

- getPoolName()

- getProxyConnection()

- getStmtCacheSize()

- getTimeOut()

- releaseConnection()

- setBusyOption()

- setPoolSize()

- setTimeOut()

- setStmtCacheSize()

- terminateConnection()

- Statementクラス

- addIteration()

- closeResultSet()

- closeStream()

- disableCaching()

- execute()

- executeArrayUpdate()

- executeQuery()

- executeUpdate()

- getAutoCommit()

- getBatchErrorMode()

- getBDouble()

- getBfile()

- getBFloat()

- getBlob()

- getBytes()

- getCharSet()

- getCharSetUString()

- getClob()

- getConnection()

- getCurrentIteration()

- getCurrentStreamIteration()

- getCurrentStreamParam()

- getCursor()

- getDatabaseNCHARParam()

- getDate()

- getDouble()

- getFloat()

- getInt()

- getIntervalDS()

- getIntervalYM()

- getMaxIterations()

- getMaxParamSize()

- getNumber()

- getObject()

- getOCIStatement()

- getRef()

- getResultSet()

- getRowid()

- getSQL()

- getSQLUString()

- getStream()

- getString()

- getTimestamp()

- getUInt()

- getUpdateCount()

- getUString()

- getVector()

- getVectorOfRefs()

- isNull()

- isTruncated()

- preTruncationLength()

- registerOutParam()

- setAutoCommit()

- setBatchErrorMode()

- setBDouble()

- setBfile()

- setBFloat()

- setBinaryStreamMode()

- setBlob()

- setBytes()

- setCharacterStreamMode()

- setCharSet()

- setCharSetUString()

- setClob()

- setDate()

- setDatabaseNCHARParam()

- setDataBuffer()

- setDataBufferArray()

- setDouble()

- setErrorOnNull()

- setErrorOnTruncate()

- setFloat()

- setInt()

- setIntervalDS()

- setIntervalYM()

- setMaxIterations()

- setMaxParamSize()

- setNull()

- setNumber()

- setObject()

- setPrefetchMemorySize()

- setPrefetchRowCount()

- setRef()

- setRowid()

- setSQL()

- setSQLUString()

- setString()

- setTimestamp()

- setUInt()

- setUString()

- setVector()

- setVectorOfRefs()

- status()

- Streamクラス

- readBuffer()

- readLastBuffer()

- writeBuffer()

- writeLastBuffer()

- status()

- Subscriptionクラス

- Subscription()

- getCallbackContext()

- getDatabaseServersCount()

- getDatabaseServerNames()

- getNotifyCallback()

- getPayload()

- getSubscriptionName()

- getSubscriptionNamespace()

- getRecipientName()

- getPresentation()

- getProtocol()

- isNull()

- operator=()

- setCallbackContext()

- setDatabaseServerNames()

- setNotifyCallback()

- setNull()

- setPayload()

- setPresentation()

- setProtocol()

- setSubscriptionName()

- setSubscriptionNamespace()

- setRecipientName()

- Timestampクラス

- Timestamp()

- fromText()

- getDate()

- getTime()

- getTimeZoneOffset()

- intervalAdd()

- intervalSub()

- isNull()

- operator=()

- operator==()

- operator!=()

- operator>()

- operator>=()

- operator<()

- operator<=()

- setDate()

- setNull()

- setTime()

- setTimeZoneOffset()

- subDS()

- subYM()

- toText()

索引

例一覧

- 1-1 表の作成

- 1-2 表に対するアクセスの指定

- 1-3 オブジェクト表の作成

- 1-4 入力バインド変数を使用したデータの挿入

- 1-5 Oracle Databaseへのオブジェクトの挿入

- 1-6 単純なSELECT文の使用

- 1-7 入力変数によるSELECT文の使用

- 1-8 PL/SQLを使用した出力変数の取得

- 1-9 PL/SQLを使用した一部のレコードのプレースホルダへの挿入

- 1-10 SQLを使用した一部のレコードの抽出

- 2-1 クライアントのメジャー・バージョンの決定方法およびパフォーマンス機能の設定方法

- 2-2 データ共有ライブラリ・ファイルの再生成方法

- 2-3 ORA_TZFILE環境変数の設定方法

- 2-4 Oracle Universal Installerを使用したInstant Client Light (English)のインストール

- 3-1 OCCI環境の作成方法

- 3-2 OCCI環境の終了方法

- 3-3 Blobオブジェクトにおける環境の有効範囲の使用方法

- 3-4 環境およびデータベースへの接続の作成方法

- 3-5 データベースへの接続および環境の終了方法

- 3-6 createConnectionPool()メソッド

- 3-7 接続プールの作成方法

- 3-8 createProxyConnection()メソッド

- 3-9 StatelessConnectionPoolの使用方法

- 3-10 同種のステートレスな接続プールの作成および使用方法

- 3-11 異種のステートレスな接続プールの作成および使用方法

- 3-12 データベース常駐接続プールの管理方法

- 3-13 データベース常駐接続プールからの接続の取得方法

- 3-14 クライアント側プールおよびサーバー側プールの使用

- 3-15 文の作成方法

- 3-16 executeUpdate()メソッドを使用したデータベース表の作成方法

- 3-17 executeUpdate()メソッドを使用したレコードの追加方法

- 3-18 setSQL()メソッドを使用したSQL文の指定方法

- 3-19 setSQL()メソッドを使用したSQL文の再設定方法

- 3-20 terminateStatement()メソッドを使用した文の終了方法

- 3-21 setxxx()メソッドを使用した個別の列値の設定方法

- 3-22 PL/SQLストアド・プロシージャのINパラメータの指定方法

- 3-23 PL/SQLストアド・プロシージャのOUTパラメータの指定方法

- 3-24 ストリーム・モードでのデータのバインド

- 3-25 PL/SQLを使用したストリーム・モードでのデータのフェッチ

- 3-26 複数のストリームの読込みおよび書込みの方法

- 3-27 反復操作の実行方法

- 3-28 ResultSetを使用したストリーム・モードでのデータのフェッチ

- 3-29 接続プーリングを使用しない文キャッシュ

- 3-30 接続プーリングを使用する文キャッシュ

- 4-1 スタンドアロン・オブジェクトの作成

- 4-2 埋込みオブジェクトの作成

- 4-3 オブジェクト型トランスレータ・ユーティリティにおけるOperator new()の2つのメソッド

- 4-4 一時オブジェクトの動的な作成方法

- 4-5 ローカル変数としての一時オブジェクトの作成方法

- 4-6 永続オブジェクトの作成方法

- 4-7 一時オブジェクトの作成方法

- 4-8 データベースでのカスタム型の宣言方法

- 4-9 VARRAYコレクションの作成方法

- 4-10 OTTでの継承サポート

- 4-11 サンプルOCCIアプリケーションのdemo2.sqlのリスト

- 4-12 サンプルOCCIアプリケーションのdemo2.typのリスト

- 4-13 サンプルOCCIアプリケーションのファイルを生成するOTTコマンドのリスト

- 4-14 サンプルOCCIアプリケーションのmappings.hのリスト

- 4-15 サンプルOCCIアプリケーションのmappings.cppのリスト

- 4-16 サンプルOCCIアプリケーションのdemo2.hのリスト

- 4-17 サンプルOCCIアプリケーションのdemo2.cppのリスト

- 4-18 サンプルOCCIアプリケーションのmyDemo.hのリスト

- 4-19 サンプルOCCIアプリケーションのmyDemo.cppのリスト

- 4-20 サンプルOCCIアプリケーションのmain.cppのリスト

- 5-1 BDOUBLEデータ型の定義

- 5-2 BFLOATデータ型の定義

- 6-1 単純なデータベース表の属性に関するメタデータの取得方法

- 6-2 ユーザー定義型を含む列からのメタデータの取得方法

- 6-3 参照からのオブジェクト・メタデータの取得方法

- 6-4 ResultSetオブジェクトからの選択リストに関するメタデータの取得方法

- 7-1 非ストリームBLOBの読込み方法

- 7-2 非ストリームBFILEの読込み方法

- 7-3 ストリームBLOBの読込み方法

- 7-4 非ストリームBLOBの書込み方法

- 7-5 ストリームBLOBの書込み方法

- 7-6 CLOB値の更新

- 7-7 BFILE値の更新

- 7-8 BLOB属性を含む永続オブジェクトの使用方法

- 7-9 BFILE属性を含む永続オブジェクトの使用方法

- 8-1 OTTユーティリティの使用方法

- 8-2 OTTユーティリティのオブジェクト作成文

- 8-3 OTTユーティリティを起動してC++クラスを生成する方法

- 8-4 OTTユーティリティでのSCHEMA_NAMESパラメータの使用方法

- 8-5 OTTでUnicodeをサポートするためのスキーマの定義方法

- 8-6 OTTでのUNICODE=ALLパラメータの使用方法

- 8-7 OTTでのUNICODE=ONLYCHARパラメータの使用方法

- 8-8 OTTユーティリティを使用したユーザー定義INTYPEファイルの作成方法

- 8-9 ott95a.hのリスト

- 8-10 ott95b.hのリスト

- 8-11 OTTユーティリティを使用したオブジェクト属性の表現方法

- 8-12 OTTユーティリティを使用したオブジェクト・データ型のマップ方法

- 8-13 OTTユーティリティによって生成されるOUTTYPEファイル

- 8-14 OTTユーティリティを使用してC++クラスを生成する方法

- 8-15 OTTユーティリティを使用してC++クラスを拡張する方法

- 8-16 OTTユーティリティを使用してユーザー・コードをヘッダー・ファイルに追加する方法

- 8-17 OTTユーティリティを使用してユーザー・コードをソース・ファイルに追加する方法

- 9-1 グローバリゼーションおよびUnicodeのサポートの使用方法

- 9-2 wstringデータ型の使用

- 9-3 stringデータ型を使用したUTF8データのバインド

- 9-4 UStringデータ型を使用したUTF16データのバインド

- 9-5 CLOBおよびNCLOBデータ型の使用

- 10-1 Agentの作成

- 10-2 ConsumerでのAgentの設定

- 10-3 文字列ペイロードを含むAnyDataメッセージの作成

- 10-4 AnyDataメッセージにおけるペイロードの型の判別

- 10-5 ユーザー定義ペイロードの作成

- 10-6 相関識別子の指定

- 10-7 送信者識別子の指定

- 10-8 メッセージの遅延時間および有効期間の指定

- 10-9 メッセージ受信者の指定

- 10-10 メッセージの優先順位の指定

- 10-11 Producerの作成、可視性の設定およびメッセージのエンキュー

- 10-12 Consumerの作成、Consumerのネーミングおよびメッセージの受信

- 10-13 メッセージの受信

- 10-14 デキュー・オプションの指定

- 10-15 メッセージのリスニング

- 10-16 通知への登録方法（直接登録）

- 10-17 LDAPを介したオープン登録の使用方法

- 11-1 XAによるトランザクション・マネージャの使用方法

- 12-1 接続プーリングに対してTAFを有効にする方法

- 12-2 addIteration()メソッドを使用したレコードの挿入方法

- 12-3 executeArrayUpdate()メソッドを使用したレコードの挿入方法

- 12-4 ResultSetによる配列フェッチの使用方法

- 12-5 行変更の反復とエラー処理の方法

- 12-6 OCCIアプリケーション・インシデントに関するADRCIの使用方法

- 12-7 Instant ClientにおけるADRCIの使用方法

- 12-8 クライアントの結果キャッシュの有効化および使用の方法

- 13-1 事前定義済のSQL型からAnyData型への変換

- 13-2 AnyData型からの事前定義済のSQL型の作成

- 13-3 ユーザー定義型からAnyData型への変換

- 13-4 ユーザー定義型からAnyData型への変換

- 13-5 データベースからDate値を取得し、スタンドアロン計算に使用する方法

- 13-6 直接割当てを使用した空のIntervalDSオブジェクトの使用方法

- 13-7 *Text()メソッドを使用した空のIntervalDSオブジェクトの使用方法

- 13-8 直接割当てを使用した空のIntervalYMオブジェクトの使用方法

- 13-9 ResultSetおよびtoText()メソッドを使用したIntervalYMオブジェクトの使用方法

- 13-10 Numberオブジェクトを取り出して使用する方法

- 13-11 デフォルトのTimestampコンストラクタの使用

- 13-12 NULLのTimestampインスタンスを初期化するためのfromText()メソッドの使用

- 13-13 データベースに格納されているタイムスタンプの比較

図一覧

- 1-1 OCCIの開発過程

- 4-1 基本的なオブジェクト操作のフロー

- 8-1 OCCIにおけるOTTユーティリティ

表一覧

- 3-1 通常データ: 非NULLまたは切捨てなし

- 3-2 NULLデータ

- 3-3 切捨てデータ

- 5-1 Oracle内部データ型の概要

- 5-2 外部データ型と対応するC++型およびOCCI型

- 5-3 DATEデータ型の書式

- 5-4 VARNUMの例

- 5-5 外部データ型と内部データ型間のデータ変換

- 5-6 LOBのデータ変換

- 5-7 日付、タイムスタンプおよび間隔データ型のデータ変換

- 6-1 属性のグループ化

- 6-2 すべての要素に属する属性

- 6-3 表またはビューに属する属性

- 6-4 表に固有の属性

- 6-5 プロシージャまたはファンクションに属する属性

- 6-6 パッケージ・サブプログラムに属する属性

- 6-7 パッケージに属する属性

- 6-8 型に属する属性

- 6-9 型属性に属する属性

- 6-10 型メソッドに属する属性

- 6-11 コレクション型に属する属性

- 6-12 シノニムに属する属性

- 6-13 順序に属する属性

- 6-14 表またはビューの列に属する属性

- 6-15 引数または結果に属する属性

- 6-16 ATTR_LIST_TYPEの値

- 6-17 スキーマに固有の属性

- 6-18 データベースに固有の属性

- 7-1 LobOptionType型の値

- 7-2 LobOptionValue型の値

- 8-1 OTTユーティリティのパラメータの概要

- 8-2 オブジェクト型属性のC++オブジェクト・データ型マッピング

- 10-1 通知結果属性（ANONYMOUSおよびAQネームスペース）

- 13-1 OCCIクラスの概要

- 13-2 すべてのOCCIクラスで使用される列挙値

- 13-3 Agentメソッドの概要

- 13-4 AnyDataクラスでサポートされているOCCIデータ型

- 13-5 AnyDataメソッドの概要

- 13-6 BatchSQLExceptionメソッドの概要

- 13-7 Bfileメソッドの概要

- 13-8 Blobメソッドの概要

- 13-9 Bytesメソッドの概要

- 13-10 Clobメソッドの概要

- 13-11 Connectionクラスで使用される列挙値

- 13-12 Connectionメソッドの概要

- 13-13 ConnectionPoolメソッドの概要

- 13-14 Consumerクラスで使用される列挙値

- 13-15 Consumerメソッドの概要

- 13-16 Dateメソッドの概要

- 13-17 Environmentクラスで使用される列挙値

- 13-18 Environmentメソッドの概要

- 13-19 IntervalDSクラスのフィールド

- 13-20 IntervalDSメソッドの概要

- 13-21 IntervalYMクラスのフィールド

- 13-22 IntervalYMメソッドの概要

- 13-23 Listenerメソッドの概要

- 13-24 Mapメソッドの概要

- 13-25 Messageクラスで使用される列挙値

- 13-26 Messageメソッドの概要

- 13-27 MetaDataクラスで使用される列挙値

- 13-28 MetaDataメソッドの概要

- 13-29 NotifyResultメソッドの概要

- 13-30 Numberメソッドの概要

- 13-31 PObjectクラスで使用される列挙値

- 13-32 PObjectメソッドの概要

- 13-33 Producerクラスで使用される列挙値

- 13-34 Producerメソッドの概要

- 13-35 Refクラスで使用される列挙値

- 13-36 Refメソッドの概要

- 13-37 RefAnyメソッドの概要

- 13-38 ResultSetクラスで使用される列挙値

- 13-39 ResultSetメソッドの概要

- 13-40 SQLExceptionの概要

- 13-41 StatelessConnectionPoolクラスで使用される列挙値

- 13-42 StatelessConnectionPoolメソッドの概要

- 13-43 Statementクラスで使用される列挙値

- 13-44 Statementメソッド

- 13-45 Streamクラスで使用される列挙値

- 13-46 Streamメソッドの概要

- 13-47 Subscriptionクラスで使用される列挙値

- 13-48 Subscriptionメソッドの概要

- 13-49 Timestampのフィールドとその有効範囲

- 13-50 Timestampメソッドの概要

Oracle® C++ Call Interface

プログラマーズ・ガイド

11g リリース2 (11.2)

B72452-01(原本部品番号:E10764-04)

2013年2月

Oracle C++ Call Interfaceプログラマーズ・ガイド, 11g リリース2（11.2）

B72452-01

Copyright © 1999, 2013, Oracle and/or its affiliates.All rights reserved.

原本著者: Rod Ward、Roza Leyderman

原本協力者:  Sandeepan Banerjee, Subhranshu Banergee, Kalyanji Chintakayala, Krishna Itikarlapalli, Shankar Iyer, Maura Joglekar, Toliver Jue, Ravi Kasamsetty, Srinath Krishnaswamy, Shoaib Lari, Geoff Lee, Chetan Maiya, Rekha Vallam

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

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

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

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の商標または登録商標です。UNIXはThe Open Groupの登録商標です。

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

はじめに

Oracle C++ Call Interface（OCCI）は、Application Program Interface（API）です。OCCIを使用すると、C++言語で作成したアプリケーションで1つ以上のOracleデータベース・サーバーと交信できます。OCCIによって、SQL文の処理やオブジェクト操作など、Oracleデータベース・サーバーで実行できるすべてのデータベース操作を、使用しているプログラムで実行できます。

対象読者

『Oracle C++ Call Interfaceプログラマーズ・ガイド』は、プログラマ、システム・アナリスト、プロジェクト・マネージャ、および次の作業を担当したり、またその作業の習得に関心を持つOracleユーザーを対象としています。

- Oracle環境でのデータベース・アプリケーションの設計と開発

- Oracle環境で実行するための既存のデータベース・アプリケーションの変換

- データベース・アプリケーション開発の管理

このマニュアルを活用するには、オブジェクト指向プログラミングの基本概念を理解し、Structured Query Language（SQL）の知識、およびC++によるアプリケーション開発に関する作業上の知識が必要です。

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

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

Oracleサポートへのアクセス

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ドキュメントを参照してください。

- ホワイト・ペーパー、その他の例などは、http://www.oracle.com/technology/tech/oci/occi/のOracle C++ Call Interface製品情報のページを参照してください。

- Oracle C++ Call Interface関連のすべての情報のフォーラムは、http://forums.oracle.com/forums/forum.jspa?forumID=168を参照してください。

- デモは、$ORACLE_HOME/rdbms/demoにあります。

- 『Oracle Database概要』

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

- 『Oracle Databaseオブジェクト・リレーショナル開発者ガイド』

- 『Oracle Database SecureFilesおよびラージ・オブジェクト開発者ガイド』

- 『Oracle Database新機能』

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

- 『Oracle Database管理者ガイド』

- 『Oracle Streamsアドバンスト・キューイング・ユーザーズ・ガイド』

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

- このマニュアルに含まれる例の多くでは、Oracleのインストール時にデフォルトでインストールされるシード・データベースのサンプル・スキーマを使用しています。これらのスキーマがどのように作成されているか、およびその使用方法については、『Oracle Databaseサンプル・スキーマ』を参照してください。

表記規則

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

規則

意味

太字

太字は、操作に関連するGraphical User Interface要素、または本文中で定義されている用語および用語集に記載されている用語を示します。

イタリック体

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

固定幅フォント

固定幅フォントは、段落内のコマンド、URL、サンプル内のコード、画面に表示されるテキスト、または入力するテキストを示します。

Oracle C++ Call Interfaceの新機能

ここでは、『Oracle C++ Call Interfaceプログラマーズ・ガイド』の新機能について説明し、追加情報の参照先を示します。

Oracle Database 11g リリース2（11.2）における新機能

Oracle Database 11gリリース2で導入されたOCCI新機能は次のとおりです。

SecureFilesのコンテンツ・タイプ

SecureFilesは、コンテンツ・タイプに関連付けられるようになりました。コンテンツ・タイプはsetContentType()メソッドを使用して設定でき、getContentType()メソッドを使用して取得できます。コンテンツ・タイプは128バイトに制限されています。この機能の主要なマニュアルは、『Oracle Database SecureFilesおよびラージ・オブジェクト開発者ガイド』です。

この機能により、次の新規メソッドがBlobクラスに追加されます。

- getContentType()

- setContentType()

この機能により、次の新規メソッドがClobクラスに追加されます。

- getContentType()

- setContentType()

Oracle Database 11g リリース1（11.1）における新機能

Oracle Database 11g リリース1で導入されたOCCI新機能は次のとおりです。

データベース常駐接続プーリング

この機能については、「データベース常駐接続プーリング」で説明しています。

「データベース常駐接続プールの管理」では、この機能のアクティブ化および保持に関するSYSDBAユーザーの職責について、また「データベース常駐接続プールの使用」ではプログラムの手順を説明しています。

この機能により、次のメソッドの新規バージョンがEnvironmentクラスに追加されます。

- createConnection()、2つの新規バージョン

この機能により、次のメソッドの新規バージョンがStatelessConnectionPoolクラスに追加されます。

- getConnection()、6つの新規バージョン

- getProxyConnection()、4つの新規バージョン

SecureFileの圧縮、暗号化および重複除外

この機能については、『Oracle Database SecureFilesおよびラージ・オブジェクト開発者ガイド』で詳細に説明しています。OCCIに固有の情報は、第7章「LOBによるプログラミング」の「SecureFilesの使用」にあります。「SecureFilesのLOBの型および定数」では、新しいLOB属性について説明しています。また、第13章「OCCI Application Program Interface (API)」では、OCCIインタフェースの新しいAPIおよび変更されたAPIを示しています。

「SecureFilesのLOBの型および定数」では、LOBの新規属性型を2つ示しており、既存の型にオプションを追加しています。これらの型はすべて次の表に示しています。

- 表7-1「LobOptionType型の値」

- 表7-2「LobOptionValue型の値」

次の新規メソッドがBlobクラスに追加されています。

- getOptions()

- setOptions()

次の新規メソッドがClobクラスに追加されています。

- getOptions()

- setOptions()

さらに、BlobクラスおよびClobクラスの両方について、メソッドgetChunkSize()およびcopy()の動作が変更されています。

ステートレスな接続プールのランタイム・ロード・バランシング

この機能については、「ステートレスな接続プールのランタイム・ロード・バランシング」で説明しています。

この機能の新しいAPIについては、第13章「OCCI Application Program Interface（API）」で説明しています。

- StatelessConnectionPoolクラスの定義済属性PoolTypeには、この機能をオフにするための新規オプションNO_RLBがあります。

障害診断

この機能については、「障害診断」で説明しています。

クライアントの結果キャッシュ

この機能については、「クライアントの結果キャッシュ」で説明しています。

1 OCCIの概要

この章では、Oracle C++ Call Interface（OCCI）の概要を説明し、OCCIの説明で使用される特別な用語を示します。Oracle環境で実行するC++アプリケーションの開発に必要な基本情報が提供されます。

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

- OCCIの概要

- SQL文の処理

- PL/SQLの概要

- OCCI/SQLの特殊用語

- オブジェクトのサポート

- 追加のサポート

OCCIの概要

Oracle C++ Call Interface（OCCI）は、Application Program Interface（API）の1つです。OCCIを使用すると、C++言語で作成したアプリケーションからOracleデータベース内のデータにアクセスできます。OCCIによって、C++のプログラマは、SQL文の処理やオブジェクト操作などのOracleデータベース操作をすべて使用できます。

OCCIを使用すると、次の内容を実現できます。

- システム・メモリーおよびネットワーク接続を効率的に使用することにより実現する、高パフォーマンスのアプリケーション

- ユーザー数および要求数の増加に対応できるスケーラブルなアプリケーション

- クライアント側によるOracleデータベース・オブジェクトへのアクセスなど、Oracleデータベース・オブジェクトを使用したアプリケーション開発に対する包括的なサポート

- ユーザー認証およびパスワード管理の簡素化

- n層認証

- 2層クライアント/サーバー環境または複数層環境での動的な接続管理およびトランザクション管理に適した、整合性のあるインタフェース

- カプセル化されたインタフェースおよび不透明なインタフェース

OCCIには、標準的なデータベースのアクセス関数と検索関数のライブラリが、実行時にC++アプリケーションにリンクできるように、動的ランタイム・ライブラリ(OCCIクラス)の形で用意されています。このため、第三世代言語(3GL)プログラム内にSQLやPL/SQLを埋め込む必要はありません。

この項は、次の項目で構成されています。

- OCCIの利点

- OCCIアプリケーションの構築

- OCCIの機能

- OCCIの機能

OCCIの利点

Oracleデータベースにアクセスする場合、OCCIには次のような大きな利点があります。

- C++およびオブジェクト指向プログラミング・パラダイムを有効に活用できます。

- 使用が容易です。

- JDBCの知識がある場合は容易に習得できます。

- ナビゲーショナル・インタフェースによって、ユーザー定義型のデータベース・オブジェクトをC++クラス・インスタンスとして操作できます。

OCCIでは非ブロック化モードがサポートされない点に注意してください。

OCCIアプリケーションの構築

図1-1に示すように、OCCIプログラムはデータベースを使用しないアプリケーションと同じ方法でコンパイルおよびリンクできます。

図1-1 OCCIの開発過程

「図1-1 OCCIの開発過程」の説明

Oracleでは、一般に普及しているほとんどのサード・パーティのコンパイラをサポートしています。OCCIプログラムのリンクの詳細は、システムによって異なります。一部のプラットフォームでは、OCCIプログラムを正常にリンクさせるために、OCCIライブラリに加えて他のライブラリの組込みが必要になる場合があります。

関連項目
使用しているプラットフォームでのOCCIアプリケーションのコンパイルとリンクの詳細は、使用オペレーティング・システムに関するOracleマニュアルと『Oracle Databaseインストレーション・ガイド』を参照してください。

OCCIの機能

OCCIは、次の機能を備えています。

- 多数のユーザーを安全にサポートできる、スケーラブルなマルチスレッド・アプリケーションを設計するためのAPI

- データベースの接続管理、SQL文の処理およびOracleデータベース・サーバーから取り出したオブジェクトの操作を行うためのSQLアクセス関数

- Oracle型のデータ属性を操作するためのデータ型マッピングおよび操作関数

- メッセージ管理に対応するアドバンスト・キューイング

- 分散トランザクション・サポートのためのXA準拠

- SQLおよびPL/SQL問合せの文キャッシュ

- 複数の接続を管理するための接続プーリング

- 国際および地域言語要件にあわせてアプリケーションをカスタマイズするためのグローバリゼーションおよびUnicodeのサポート

- オブジェクト型トランスレータ・ユーティリティ

- 透過的アプリケーション・フェイルオーバーのサポート

手続き型および非手続き型要素

OCCIを使用すると、SQLの非手続き型データ・アクセス機能と、C++の手続き型機能を併せ持つ、複数層アーキテクチャ上のスケーラブルなマルチスレッド・アプリケーションを開発できます。

非手続き型言語のプログラムでは、操作対象となる一連のデータが指定されますが、実行できる操作の種類や操作の方法は指定されません。SQLは非手続き型という性質上、習得しやすく、データベース・トランザクションを実行しやすい言語です。また、SQLは、先進のリレーショナル・データベース・システムおよびオブジェクト・リレーショナル・データベース・システムのデータに対するアクセスや操作に使用する標準言語となっています。

手続き型言語のプログラムでは、ほとんどの文の実行が、前または後続の文、およびループや条件ブランチなどSQLでは利用できない制御構造に依存しています。手続き型という性質上、このような言語はSQLよりも複雑ですが、柔軟性に富み、効果的に使用できます。

OCCIプログラムでは、非手続き型言語と手続き型言語の要素が組み合されているため、構造化プログラミング環境でOracleデータベースに容易に接続できます。

OCCIでは、Oracleデータベース・サーバーを通じて使用できる、SQLのデータ定義、データ操作、問合せおよびトランザクション制御の機能をすべてサポートしています。たとえば、OCCIプログラムでは、Oracleデータベースに対する問合せを実行できます。問合せ文では入力（バインド）変数を使用して、データベースにデータを渡すようにプログラムに対して指示できます。たとえば、次のとおりです。

SELECT name FROM employees WHERE employee_id = :empnum

このSQL文のempnumは、アプリケーションが指定する値に対するプレースホルダです。

また、OCCIアプリケーションでは、Oracleが開発したSQLの手続き型拡張要素であるPL/SQLも使用できます。PL/SQLを使用すると、SQLのみで作成されたアプリケーションよりも、さらに効果的で柔軟性のあるアプリケーションを開発できます。OCCIでは、Oracleデータベース・サーバー内のオブジェクトに対するアクセスおよび操作のための機能も提供します。

SQL文の処理

OCCIアプリケーションの主なタスクの1つは、SQL文を処理することです。SQL文の種類が異なると、プログラムでは異なる処理ステップが必要になります。OCCIアプリケーションをコーディングする際には、このことを考慮に入れることが重要です。Oracleでは、次の種類のSQL文を認識します。

- データ定義言語文(DDL)

- 制御文

- データ操作言語文(DML)

- 問合せ

データ定義言語文

データ定義言語(DDL)文は、データベース内のスキーマ・オブジェクトを管理します。DDL文は、新規の表を作成し、古い表を削除し、その他のスキーマ・オブジェクトを設定します。また、スキーマ・オブジェクトに対するアクセスを制御します。例1-1には表の作成方法、例1-2にはこの表に関する権限の付与と取消しの方法を示します。

例1-1 表の作成

CREATE TABLE employee_information (
employee_id NUMBER(6),
ssn NUMBER(9),
dependents NUMBER(1),
mail_address VARCHAR(60))

例1-2 表に対するアクセスの指定

GRANT UPDATE, INSERT, DELETE ON employee_information TO donna
REVOKE UPDATE ON employee_information FROM jamie

DDL文によって、Oracleデータベース内のオブジェクトを操作することもできます。例1-3では、オブジェクト表の作成方法を示しています。

例1-3 オブジェクト表の作成

CREATE TYPE person_info_type AS OBJECT (
employee_id NUMBER(6),
ssn NUMBER(9),
dependents NUMBER(1),
mail_address VARCHAR(60))

CREATE TABLE person_info_table OF person_info_type

制御文

OCCIアプリケーションでは、トランザクション制御文、接続制御文およびシステム制御文（DML文など）を処理します。

関連項目
制御文の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

データ操作言語文

データ操作言語(DML)文は、データベース表にあるデータを変更できます。たとえば、DML文は表への新規行の挿入、既存の行の列値の更新、表からの行の削除、データベース内の表のロックおよびSQL文の実行計画の説明を行います。

DML文では、入力バインド変数を使用して、データベースにデータを渡すようにアプリケーションに対して指示できます。例1-4に例を示します。異なるバインド値を使用して、この文を複数回実行することも、配列を挿入して、サーバーとの1回のラウンドトリップで複数の行を追加することもできます。

例1-4 入力バインド変数を使用したデータの挿入

INSERT INTO departments VALUES(:1,:2,:3)

また、DML文では、Oracleデータベース内のオブジェクトを操作できます。例1-5は、オブジェクト表への特定の型のインスタンスの挿入を示しています。

例1-5 Oracle Databaseへのオブジェクトの挿入

INSERT INTO person_info_table
VALUES (person_info_type('450987','123456789','3','146 Winfield Street'))

問合せ

問合せは、データベースの表からデータを取り出すための文です。1つの問合せで、0、1行および複数行のデータを戻すことができます。すべての問合せは、例1-6のように、SQLキーワードSELECTで始まります。

例1-6 単純なSELECT文の使用

SELECT department_name FROM departments
WHERE department_id = 30

例1-7のように、問合せ文では入力バインド変数を使用して、データベース・サーバーにデータを渡すようにプログラムに対して指示できます。

例1-7 入力変数によるSELECT文の使用

SELECT first_name, last_name
FROM employees
WHERE employee_id = :emp_id

このSQL文のemp_idは、アプリケーションが指定する値に対するプレースホルダです。

PL/SQLの概要

PL/SQLは、Oracleが開発したSQL言語の手続き型拡張要素です。PL/SQLは、単純な問合せやSQLデータ操作言語文よりも複雑なタスクを処理します。PL/SQLを使用すると、複数の構文を単一のブロックにグループ化し、1つの単位として実行できます。たとえば、次のような構文があります。

- 1つまたは複数のSQL文

- 変数宣言

- 代入文

- 手続き型制御文(IF ...THEN ...ELSE文とループ)

- 例外処理

OCCIプログラムからPL/SQLストアド・プロシージャをコールし、OCCIプログラムのPL/SQLブロックを使用すると、次のタスクを実行できます。

- 他のPL/SQLストアド・プロシージャおよびストアド・ファンクションのコール

- 手続き型制御文を複数のSQL文と結合し、1つの単位として実行

- レコード、表、カーソルFORループ、例外処理などの特殊なPL/SQL機能へのアクセス

- カーソル変数の使用

- Oracleデータベース内のオブジェクトへのアクセスおよび操作

PL/SQLプロシージャまたはファンクションは、出力変数を戻すこともできます。この出力変数はOUTバインド変数と呼ばれます。例1-8のとおりです。

例1-8 PL/SQLを使用した出力変数の取得

GET_EMPLOYEE_NAME(:1, :2);

この例の最初のパラメータは、従業員のID番号を指定する入力変数です。2番目のパラメータはOUTバインド変数で、従業員名の戻り値が格納されます。

PL/SQLを使用し、特定の従業員番号をキーにして、従業員表から値を取り出すSQL文を発行することもできます。例1-9は、PL/SQL文でのプレースホルダの使用方法も示しています。

例1-9 PL/SQLを使用した一部のレコードのプレースホルダへの挿入

SELECT last_name, first_name, salary, commission_pct
INTO :emp_last, :emp_first, :sal, :comm
FROM employees
WHERE employee_id = :emp_id;

この文のプレースホルダは、PL/SQL変数ではありません。これらは、文の処理時にデータベース・サーバーとの間で受渡しを行う入力パラメータと出力パラメータを示しています。これらのプレースホルダはプログラムで指定する必要があります。

OCCI/SQLの特殊用語

このマニュアルでは、SQL文の様々な部分を参照するために特殊な用語を使用しています。例1-10で説明します。

例1-10 SQLを使用した一部のレコードの抽出

SELECT first_name, last_name, email
FROM employees
WHERE department_id = 80
AND commission_pct > :base;

このSQL文は、次の部分で構成されています。

- SQLコマンド: SELECT

- 3つの選択リスト項目: first_name、last_nameおよびemail

- FROM句の表名: employees

- WHERE句の2つの列名: department_idおよびcommission_pct

- WHERE句の数値入力値: 40

- WHERE句の入力バインド変数用のプレースホルダ: :base

OCCIアプリケーションを開発する際は、プログラム中の入出力変数の値、またはこれを参照する値をデータベース・サーバーに指定しているルーチンをコールします。このマニュアルでは、データ用のプレースホルダ変数を指定することをバインド操作と呼びます。入力変数を指定する場合は、INバインド操作と呼びます。出力変数を指定する場合は、OUTバインド操作と呼びます。

オブジェクトのサポート

OCCIには、オブジェクト型とオブジェクトを処理する機能があります。オブジェクト型は、ユーザー定義のデータ構造体で、実社会のエンティティを抽象的に表します。たとえば、データベースにperson（個人）というオブジェクトの定義が含まれているとします。このオブジェクト型は、個人を識別するための特徴を表した属性(first_name、last_name、ageなど)を持つことができます。

オブジェクト型の定義は、オブジェクト型のインスタンスを表すオブジェクトの作成の基礎となります。オブジェクト型を構造的な定義として使用すると、たとえば、personオブジェクトを属性John、Boniventoおよび30を持つように作成できます。オブジェクト型にはメソッド、つまりそのオブジェクト型の動作を表すプログラム関数を含めることもできます。

OCCIは、Oracleデータベース・サーバーのオブジェクト機能を使用するプログラマに、包括的なAPIを提供します。その機能は、以降のトピックで説明する次の5つの主要なカテゴリに分類できます。

- クライアント側オブジェクト・キャッシュ

- オブジェクト用のランタイム環境

- 連想アクセス用インタフェースおよびナビゲーショナル・アクセス用インタフェース

- OCIとの相互運用性

- メタデータ・クラス

- Oracle内部スキーマ情報をクライアント側の言語バインド変数にマッピングする、オブジェクト型トランスレータ(OTT)ユーティリティ

関連項目

- 『Oracle Database概要』

- 『Oracle Databaseオブジェクト・リレーショナル開発者ガイド』で、オブジェクト型とオブジェクトの詳細を参照してください。

クライアント側オブジェクト・キャッシュ

オブジェクト・キャッシュは、オブジェクトに対する参照とメモリー管理をサポートするクライアント側のメモリー・バッファです。オブジェクト・キャッシュでは、OCCIアプリケーションがサーバーからクライアント側にフェッチしたオブジェクトを格納し、追跡します。クライアント側オブジェクト・キャッシュは、OCCI環境をobjectモードで初期化するときに作成されます。同じサーバーに対して実行中の複数のアプリケーションには、専用のオブジェクト・キャッシュがあります。クライアント側オブジェクト・キャッシュでは、現在メモリーにあるオブジェクトの追跡、オブジェクトへの参照のメンテナンス、自動オブジェクト・スワッピングの管理およびオブジェクトのメタ属性または型情報の追跡が行われます。クライアント側オブジェクト・キャッシュには、次の利点があります。

- アプリケーションのパフォーマンスの改善。オブジェクトのフェッチおよび操作に必要なクライアント/サーバー間のラウンドトリップ回数を減らします。

- 拡張性の向上。クライアント側キャッシュからオブジェクト・スワッピングをサポートします。

- 同時実行性の向上。オブジェクト・レベルのロックをサポートします。

- キャッシュしきい値を超えた場合の自動ガベージ・コレクション。

オブジェクト用のランタイム環境

OCCIは、オブジェクト用のランタイム環境を提供します。このランタイム環境では、Oracleオブジェクトのクライアント側での使用方法を管理する一連のメソッドを使用できます。これらのメソッドは、次のタスクの実行に必要な機能を提供します。

- オブジェクト機能へのアクセスのためのOracleデータベース・サーバーへの接続

- クライアント側オブジェクト・キャッシュの割当ておよびそのパラメータのチューニング

- エラーおよび警告メッセージの取得

- データベース内のオブジェクトにアクセスするトランザクションの制御

- SQLによるオブジェクトへの連想アクセス

- パラメータまたは結果がOracleオブジェクト型であるPL/SQLプロシージャまたはファンクションの記述

連想アクセス用インタフェースおよびナビゲーショナル・アクセス用インタフェース

OCCIを使用したアプリケーションでは、次のような様々な種類のインタフェースを通じて、データベース内のオブジェクトにアクセスできます。

- SQLのSELECT文、INSERT文およびUPDATE文。

- C++ポインタと参照。対応する参照をたどってクライアント側のオブジェクト・キャッシュ内のオブジェクトにアクセスします。

OCCIには、SQLのSELECT文、INSERT文およびUPDATE文を使用してオブジェクトを操作するための一連のメソッドが用意されています。Oracleオブジェクトにアクセスする場合、これらのSQL文では、リレーショナル表にアクセスするような一貫した一連のステップが使用されます。OCCIが提供するメソッドでは、次の目的のためにSQL文を使用してオブジェクトにアクセスします。

- SQL文やPL/SQLストアド・プロシージャの入出力変数として、オブジェクト型のインスタンスと参照をバインドします。

- オブジェクト型のインスタンスと参照を含むSQL文を実行します。

- オブジェクト型のインスタンスと参照をフェッチします。

- 結果セットから列の値をオブジェクトとして取得します。

- Oracleオブジェクト型の選択リスト項目を記述します。

OCCIにはオブジェクトをナビゲートするためのシームレスなインタフェースが用意されているため、一時C++オブジェクトを操作する場合と同様に、データベース・オブジェクトを操作できます。オブジェクト参照上のオーバーロードされた矢印（→）演算子を間接参照すると、オブジェクトをデータベースから取り出して、アプリケーション領域で透過的に使用できます。

OCIとの相互運用性

OCCIアプリケーションは、OCCIクラス・インスタンスでgetOCIxxx()メソッドをコールすることで、基礎となるOCIハンドルおよび記述子を取得できます。これらのハンドルは、OCI関数のコールに使用できます。

アプリケーションは、OCIハンドルでプロパティが変更された場合に、対応するOCIインスタンスがそれを反映する場合と反映しない場合があることに注意する必要があります。

OCCIとOCI間のこの相互運用性は、アプリケーションがオブジェクト関連機能にOCI関数を使用する場合にはサポートされません。

メタデータ・クラス

OCCIでは、各Oracleデータ型がC++クラスで表現されます。このクラスは、データ型の動作と特性をオーバーロードされた演算子とメソッドによって公開します。たとえば、Oracleデータ型NUMBERは、Numberクラスで表現されます。

OCCIは、メタデータ・クラスを提供します。このメタデータ・クラスを使用すると、オブジェクト型を含むデータベース・オブジェクトを記述するメタデータを取得できます。

オブジェクト型トランスレータ・ユーティリティ

オブジェクト型トランスレータ（OTT）ユーティリティは、Oracleオブジェクト型のスキーマ情報をクライアント側の言語バインドに変換します。つまり、OTTはオブジェクト型情報を構造体やクラスなどのホスト言語変数の宣言に変換します。OTTは、Oracleデータベース・スキーマ・オブジェクトの情報が含まれるintypeファイルを入力として使用します。次にouttypeファイルおよび必要なヘッダー・ファイルと実装ファイルを生成します。このファイルは、オブジェクト・スキーマに対して実行するC++アプリケーションにインクルードする必要があります。

要約すると、OCCIでは、次の方法によるOracleデータベース内のオブジェクト処理をサポートしています。

- アプリケーション開発者の生産性の向上。スキーマ・オブジェクトに対応するホスト言語変数を記述する必要がなくなります。

- データ定義言語の選択肢としてのSQLの保持。SQLで作成したOracleデータベース・スキーマ・オブジェクトをホスト言語変数に自動的にマップできるため、Oracleによって、ユーザー・データの一貫したモデルを企業全体でサポートできます。

- オブジェクト型のスキーマ展開が可能。スキーマが変更されたときにインクルード・ヘッダー・ファイルが再生成されるため、Oracleアプリケーションでスキーマ展開がサポートされます。

- オブジェクト・データとスキーマ情報を操作するSQL文の実行。

- SQL文の入力変数としての、オブジェクト参照およびオブジェクト・インスタンスの受渡し。

- SQL文の出力を受け取る変数としての、オブジェクト参照およびオブジェクト・インスタンスの宣言。

- データベースからのオブジェクト参照およびオブジェクト・インスタンスのフェッチ。

- オブジェクトのインスタンスおよび参照を戻すSQL文のプロパティの記述。

- オブジェクト・パラメータまたは結果を含むPL/SQLプロシージャまたはファンクションの記述。

- オブジェクト機能およびリレーショナル機能を同期化するための、コミット・コールとロールバック・コールの拡張。

- オブジェクトのアドバンスト・キューイング。

OTTは通常、コマンドラインからintypeファイル、outtypeファイルおよび特定のデータベース接続を指定することにより起動されます。

追加のサポート

この項では、Oracle Databaseに付属のOCCIの例をビルドする方法と、追加リソースについて説明します。

OCCIデモのビルド

『Oracle Database Examplesインストレーション・ガイド』の説明に従ってデモ・プログラムをインストールする必要があります。これらのデモの一部を本書で例として使用します。例をビルドするには、次の手順を参照してください。

1. デモ・ディレクトリに移動します。
Windowsでは、このディレクトリはORACLE_HOME\rdbms\demoです。

LinuxおよびUNIXでは、このディレクトリはORACLE_HOME/rdbms/demoです。

2. このディレクトリにファイルdemo_rdbms.mkが含まれていることを確認します。

3. makeコマンドを使用してOCCIデモを作成します。

- すべてのデモを同時に作成するには、次のパラメータを使用します。

make -f demo_rdbms.mk occidemos

- 1つのデモのみ作成するには、次のパラメータを使用します。

make -f demo_rdbms.mk demoname

- 1つのデモとオブジェクトを作成するには、次のパラメータを使用します。

make -f demo_rdbms.mk buildocci EXE=demoname OBJS=demoname.o

- 1つのデモと静的ライブラリを作成するには、次のパラメータを使用します。

make -f demo_rdbms.mk buildocci_static EXE=demoname OBJS=demoname.o

- 詳細は、demo_rdbms.mkファイルを参照してください。

Oracle Technology NetworkでのOCCI

フォーラム、ダウンロード、ホワイト・ペーパーなど、OCCIに関する追加情報は、http://www.oracle.com/technology/tech/oci/occi/index.htmlを参照してください。

2 インストールとアップグレード

この章では、Oracle C++ Call Interface（OCCI）のインストールとアップグレードの概要を説明します。

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

- Oracle C++ Call Interfaceのインストール

- アップグレードに関する考慮点

- Oracle Databaseバージョンの決定

- Instant Client

- Instant Client Light (English)

- Microsoft Visual C++でのOCCIの使用

Oracle C++ Call Interfaceのインストール

OCCIはOracle Databaseの一部としてインストールされます。構成に関するその他の要件を決定するには、対象のプラットフォームに対応した『Oracle Databaseインストレーション・ガイド』および『Oracle Database Clientインストレーション・ガイド』を参照してください。

アップグレードに関する考慮点

このリリースの新機能を使用するには、Oracleクライアントの以前のリリースからアップグレードする際に、オブジェクト型トランスレータ・ユーティリティで生成されたクラスを含む、すべてのOCCIアプリケーションを再コンパイルし、再リンクする必要があります。

Oracle Databaseバージョンの決定

アプリケーションで、サーバー・バージョンまたはクライアント・パッチセットが異なる複数の異なるコード・パスを使用する場合には、コンパイル時および実行時のどちらでもこれらのオプションを検証できます。

コンパイル時のOracleクライアント・バージョンの決定

OCCIヘッダー・ファイルは、OCCI_MAJOR_VERSIONおよびOCCI_MINOR_VERSIONマクロを定義します。例2-1に、これらのマクロの使用方法を示します。

例2-1 クライアントのメジャー・バージョンの決定方法およびパフォーマンス機能の設定方法

#if (OCCI_MAJOR_VERSION > 9)
env->setCacheSortedFlush(true);  // benefit of performance, if available
#endif

実行時のOracleクライアントおよびサーバーのバージョンの決定

実行時に、getClientVersion()、getServerVersion()およびgetServerVersionUString()メソッドを使用して、現行のConnectionのクライアントおよびサーバーのバージョンを両方チェックできます。

Instant Client

Instant Client機能を使用すると、ORACLE_HOMEの必要性がなくなることで、OCCIベースのカスタマ・アプリケーションを非常に簡単に、かつすばやくデプロイできます。もう1つの利点として、記憶領域要件があります。Instant Clientの共有ライブラリは、完全なクライアント・インストールに必要なディスク領域の約4分の1で済みます。

Instant Clientの利点

- インストールは、4つのファイルのコピーのみで済みます。

- クライアントの記憶領域要件は最小限です。

- デプロイしたアプリケーションで機能が損なわれたりパフォーマンスが低下することはありません。

- ISVアプリケーションとのパッケージングが簡素化されています。

OCCI Instant Client機能によって、OCCIのインストールが簡単になります。Instant ClientモードのためOCCIがORACLE_HOME設定に依存していない場合でも、ORACLE_HOME設定に依存するアプリケーションは、ORACLE_HOMEを適切な値に設定することで、引き続き動作が可能になります。Instant Clientモードのアクティブ化は、Instant Clientデータ共有ライブラリをロードできるかどうかにのみ依存します。特に、この機能によって、データ用にORACLE_HOMEを使用しながら新規リリースのOracleクライアントを使用するOracleアプリケーションとの相互運用性が確保されます。

Instant Clientのインストール

OCCIには、オペレーティング・システムの動的ローダーによってロードされる4つの共有ライブラリ（一部のオペレーティング・システムではダイナミック・リンク・ライブラリと呼ばれます）のみです。Oracle Database 11g リリース2 (11.2)のライブラリ名が使用されています。ライブラリ名の数字の部分は、将来のリリース番号にあわせて変更されます。

- OCI Instant Clientデータ共有ライブラリ（LinuxおよびUNIXではlibociei.so、Windowsではoraociei11.dll）。このファイルの正しいインストールによって、Instant Clientモードで操作しているかどうかが判別されます。

- クライアント・コード・ライブラリ（LinuxおよびUNIXではlibclntsh.so.11.1、Windowsではoci.dll）。

- セキュリティ・ライブラリ（LinuxおよびUNIXではlibnnz11.so、Windowsではorannzsbb11.dll）。

- OCCIライブラリ（LinuxおよびUNIXではlibocci.so.11.1、Windowsではoraocci11.dll）。

Oracle Technology Network

Instant Clientライブラリは、OTN (Oracle Technology Network)のWebサイトでも入手できます。

http://www.oracle.com/technology/tech/oci/instantclient/

オペレーティング・システムのライブラリ・パス変数(LinuxおよびUNIXではLD_LIBRARY_PATH、WindowsではPATH)のディレクトリを通じてこれらの4つのライブラリにアクセスできる場合、OCCIはInstant Clientモードで動作します。このモードでは、ORACLE_HOMEへの依存性はありません。ORACLE_HOMEで指定された他のコードおよびデータ・ファイルは、OCCIでは不要です。

OTNからInstant Clientをインストールする場合は、次の手順で行います。

1. Instant Clientライブラリを、instantclient_11_2などの空のディレクトリにダウンロードしてインストールします。

2. オペレーティング・システムの共有ライブラリ・パス環境変数(LinuxおよびUNIXではLD_LIBRARY_PATH、WindowsではPATH)を、手順1で使用したディレクトリ、instantclient_11_2に設定します。

Instant Client SDK

Instant Clientは、SDKパッケージとしてダウンロードすることもできます。SDKには、Instant Client環境でOCCIアプリケーションを開発するために必要なすべてのヘッダー・ファイルおよびMakeファイルが含まれています。開発したアプリケーションは、あらゆるクライアント環境にデプロイできます。SDKには、次のような追加の機能があります。

- C++のデモンストレーション・プログラムが含まれています。

- Windows上のアプリケーションにリンクするためのライブラリが含まれており、デモンストレーションを作成するためのMake.batファイルが用意されています。

- LinuxおよびUNIXでデモンストレーションを作成するためのMakeファイルdemo.mkが提供されています。アプリケーションをリンクする前に、LD_LIBRARY_PATHにinstantclient_11_2ディレクトリを必ず定義します。これらのプログラムでは、クライアント・コード・ライブラリおよびOCCIライブラリに対するシンボリック・リンク(それぞれlibclntsh.soとlibocci.so)がinstantclient_11_2ディレクトリに必要になります。デモンストレーション用のMakeファイルdemo.mkでは、リンクの手順の前にこれらのリンクを生成します。これらのシンボリック・リンクは、シェル・スクリプトで作成することもできます。

cd instantclient_11_2
ln -s libclntsh.so.11.1 libclntsh.so
ln -s libocci.so.11.1 libocci.so

- また、SDKには、アプリケーション・ヘッダー・ファイルを生成するための、オブジェクト型トランスレータ（OTT）ユーティリティとそのクラスが含まれます。

完全なクライアント・インストール

管理者オプションを選択して完全なクライアント・インストールを実行した場合、次の操作を実行できます。

- LinuxおよびUNIXでは、libociei.soライブラリを$ORACLE_HOME/instantclientディレクトリからコピーできます。他のすべてのライブラリは、Oracleの完全インストールにおける$ORACLE_HOME/libディレクトリからコピーできます。

- Windowsでは、oraociei11.dllライブラリをORACLE_HOME\instantclientディレクトリからコピーできます。他のすべてのWindowsライブラリは、ORACLE_HOME\binディレクトリからコピーできます。Microsoft ODBCおよびOLEDBドライバを使用するには、ORACLE_HOME\binからociw32.dllもコピーする必要があります。

Oracle Universal Installer

データベースをインストールしていない場合、これらのライブラリをインストールするには、Oracle Universal InstallerからInstant Clientオプションを選択します。これらの手順が完了すると、OCCIアプリケーションの実行を開始できます。

1. Instant Client共有ライブラリを、instantclient_11_2などのディレクトリにインストールします。

2. オペレーティング・システム共有ライブラリ・パスの環境変数を、手順1のディレクトリに設定します。たとえば、LinuxまたはUNIXでは、LD_LIBRARY_PATHをinstantclient_11_2に設定します。Windowsでは、PATHをinstantclient_11_2ディレクトリがある場所に設定します。

Instant ClientのCD

Instant ClientはInstant ClientのCDからインストールすることもできます。Instant Clientを空のディレクトリまたは別のシステムのディレクトリにインストールします。

オペレーティング・システムのライブラリ・パス変数で定義できるのは、1セットのOracleライブラリのみです。Instant Clientライブラリについて複数のディレクトリまたはコピーが存在する場合は、オペレーティング・システムのライブラリ・パスでディレクトリを1つのみ定義します。

同様に、同じシステムのORACLE_HOMEにもインストール済の場合は、ライブラリ・パスに示される順序にかかわらず、ORACLE_HOME/libとInstant Clientディレクトリの両方をオペレーティング・システムのライブラリ・パスに定義することはできません。オペレーティング・システムのライブラリ・パス変数には、ORACLE_HOME/libディレクトリ(非Instant Clientで操作する場合)またはInstant Clientディレクトリ(Instant Clientモードで操作する場合)のいずれか1つのみを定義します。

Instant Clientの使用

Instant Client機能は、本番アプリケーションを実行するために設計されています。開発では、Instant Client SDKまたは完全なインストールを使用して、OCCIヘッダー・ファイル、Makeファイル、デモンストレーション・プログラムなどにアクセスします。

UNIXにおけるInstant Client共有ライブラリのパッチ

この機能は、Windowsプラットフォームでは使用できません。

Instant Clientは主にデプロイメント用の機能であるため、必要なファイルの数およびサイズを減らすことが設計目標の1つとなっています。したがって、Instant Clientのデプロイメントには、共有ライブラリのパッチのためのすべてのファイルが含まれるわけではありません。Instant Client共有ライブラリにパッチを適用するには、ORACLE_HOMEベースの完全なクライアントでOPATCHユーティリティを使用する必要があります。OPATCHユーティリティでは、LinuxおよびUNIX用のORACLE_HOMEのインストールを行うためのパッチ適用情報をlibclntsh.so.11.1に格納します。この情報は、geneziユーティリティを使用して取得できます。

genezi -v

Instant Clientをデプロイするシステムにgeneziユーティリティがインストールされていない場合は、ORACLE_HOMEシステムのORACLE_HOME/binディレクトリからコピーできます。

ORACLE_HOME環境でパッチを適用した後で、「Instant Clientのインストール」に表示されているファイルを、Instant Clientディレクトリにコピーします。個々のファイルをコピーするかわりに、データ共有ライブラリおよびzipファイルの再生成の説明に従って、Instant Clientの*.zipファイルを生成することもできます。次に、個々のファイルをコピーするかわりに、ターゲット・システムにzipファイルをコピーして解凍できます。

データ共有ライブラリおよびzipファイルの再生成

この機能は、Windowsプラットフォームでは使用できません。

Instant Clientデータ共有ライブラリlibociei.soは、ORACLE_HOMEのクライアント管理者インストールで再生成できます。例2-2を実行すると、ORACLE_HOMEの現行ファイルに基づいて新しいlibociei.soファイルが作成され、ORACLE_HOME/rdbms/install/instantclientディレクトリに格納されます。makeのターゲットilibocieiによりlibociei.soが生成されます。

再生成されたデータ共有ライブラリlibociei.soの場所は、ORACLE_HOME/instantclientの元の場所とは異なります。

例2-2のスクリプトでは、Instant Client Light (English)のディレクトリも作成されます。

例2-2 データ共有ライブラリ・ファイルの再生成方法

mkdir -p $ORACLE_HOME/rdbms/install/instantclient/light
cd $ORACLE_HOME/rdbms/lib
make -f ins_rdbms.mk ilibociei

Instant Clientのデータベース接続名

ORACLE_HOMEまたはTNS_ADMINをtnsnames.oraまたはsqlnet.oraなどの構成ファイルの位置指定に必要としない、Oracle Netネーミング・メソッドはすべて、Instant Clientモードで機能します。

createConnection()コールのconnectStringパラメータは、次の書式で指定できます。

- 次の書式のSQL接続URL文字列。

//host:[port][/service name]

例:

//myserver111:5521/bjava21

- Oracle Netのキーワード値ペア。たとえば、次のようにします。

(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp) (HOST=myserver111) (PORT=5521))
(CONNECT_DATA=(SERVICE_NAME=bjava21)))

- サイトがLDAPサーバーを検出するように構成されている場合に、ディレクトリ・ネーミングによって解決される接続名。

- tnsnames.oraファイルのエントリ。
TNS_ADMIN環境変数が設定されておらず、inst1などのTNSNAMESエントリが使用されている場合は、ORACLE_HOME変数が設定され、構成ファイルが$ORACLE_HOME/network/adminディレクトリに格納されている必要があります。

構成ファイルの位置指定にTNS_ADMINを必要とするネーミング・メソッドは、TNS_ADMIN環境変数が設定されている場合、引き続き機能します。

この場合のORACLE_HOME変数はOracle Net構成ファイルの位置指定にのみ使用され、OCCIクライアント・コード・ライブラリの他のコンポーネントではORACLE_HOMEの値は使用されません。

createConnection()の空のconnectStringパラメータは、環境変数(LinuxおよびUNIXではTWO_TASK、WindowsではLOCAL)を前述した値のいずれかに設定することによってサポートされます。

関連項目
接続記述子の詳細は、『Oracle Database Net Services管理者ガイド』を参照してください。

OCCI Instant Clientの環境変数

ORACLE_HOME環境変数は、グローバリゼーション・サポート、COREおよびエラー・メッセージ・ファイルの位置を決定するものではなくなりました。OCCI専用アプリケーションでは、ORACLE_HOMEを設定する必要はありません。ただし、設定されている場合でも、OCCIの動作には影響しません。OCCIは、常にデータ共有ライブラリからデータを取得します。データ共有ライブラリを使用できない場合のみORACLE_HOMEが使用され、完全なクライアント・インストールが前提となります。ORACLE_HOMEを設定する場合は、ディレクトリを識別する有効なオペレーティング・システムのパス名にする必要があります。

環境変数ORA_NLS33、ORA_NLS32およびORA_NLSは、Instant Clientモードでは無視されます。

Instant Clientモードでは、ORA_TZFILE変数が設定されていない場合、データ共有ライブラリに含まれる、これより大きいデフォルトのtimezlrg_n.datファイル(nはファイルのバージョン番号)が使用されます。データ共有ライブラリに含まれる、これよりサイズの小さいtimezone_n.datファイルを使用する場合は、例2-3に示すように、ORA_TZFILE環境変数を、絶対パス名または相対パス名を含まないこのファイルの名前に設定します。

例2-3 ORA_TZFILE環境変数の設定方法

LinuxおよびUNIXでは次のようになります。

setenv ORA_TZFILE timezone_n.dat

Windowsでは次のようになります。

set ORA_TZFILE timezone_n.dat

データ共有ライブラリを使用できないためにOCCIがInstant Clientモードで動作しない場合は、ORA_TZFILE変数（設定する場合）を完全なパス名で指定します。

TNSNAMESエントリを使用する場合は、TNS_ADMINディレクトリにTNSNAMES構成ファイルが含まれている必要があります。TNS_ADMINを設定しない場合は、ORACLE_HOME/network/adminディレクトリにOracle Net Services構成ファイルが含まれている必要があります。

Instant Client Light (English)

Instant Client Light (English)では、Instant Client全体でクライアントのインストールに必要な領域が63MB削減されます。具体的には、完全なInstant Client共有ライブラリlibociei.soの場合は67MBのディスク領域が占有されるのに対して、Instant Client Light (English)共有ライブラリ(LinuxおよびUNIXではlibociicus.so、Windowsではoraociicus11.dll)のインストールには、UNIXプラットフォームでは4MBのみ占有されます。

Instant Client Light (English)は、名前が示しているように、必要とするエラー・メッセージは英語のみで、US7ASCII、WE8DEC、またはUnicode文字を使用するアプリケーション向けです。Instant Client Light（English）では、NLS_LANG設定を行うTERRITORYフィールドに制約はありません。そのため、これらのキャラクタ・セットおよびTERRITORY基準を満たすアプリケーションをInstant Client Light (English)環境で実行すると、フットプリントを大幅に削減できます。

Instant Client Light (English)のグローバリゼーション設定

Instant Client Light (English)は次のキャラクタ・セットをサポートしています。

- US7ASCII、WE8DEC、WE8MSWIN1252およびWE8ISO8859P1を含むシングルバイトのキャラクタ・セット。

- Unicodeキャラクタ・セットには、UTF8、AL16UTF16およびAL32UTF8が含まれます。

Instant Client Light (English)では、アプリケーションがクライアントまたはデータベースのいずれかで、ここに表示されていないキャラクタ・セットまたは各国語キャラクタ・セットを使用しようとすると、エラー・メッセージが戻されます。ここに表示された、想定されるエラー・メッセージは英語でのみ使用できます。

- ORA-12734 Instant Client Light: unsupported client national character set (NLS_LANG value set)
（Instant Client Light: サポートされていないクライアント各国語キャラクタ・セット（NLS_LANG値セット）です）

- ORA-12735 Instant Client Light: unsupported client character set (NLS_LANG value set)
（Instant Client Light: サポートされていないクライアント・キャラクタ・セット（NLS_LANG値セット）です）

- ORA-12736 Instant Client Light: unsupported server national character set (NLS_LANG value set)
（Instant Client Light: サポートされていないサーバー各国語キャラクタ・セット（NLS_LANG値セット）です）

- ORA-12737 Instant Client Light: unsupported server character set (NLS_LANG value set)
（Instant Client Light: サポートされていないサーバー・キャラクタ・セット（NLS_LANG値セット）です）

NLS_LANGパラメータを設定する場合は、次のように使用します。

American_territory.charset

ここでterritoryは、NLS_LANGで指定可能な任意の有効なTerritoryで、charsetは前述のキャラクタ・セットです。

関連項目
NLSの設定の詳細は、『Oracle Databaseグローバリゼーション・サポート・ガイド』を参照してください。

Instant Client Light (English)の使用

Instant Clientモードで操作するかどうかを決定するために、OCCIアプリケーションはLinuxおよびUNIXではLD_LIBRARY_PATH、WindowsではPATHでデータ共有ライブラリを検索します。このライブラリが見つからない場合、OCCIはInstant Client Light (English)データ共有ライブラリ（LinuxおよびUNIXではlibociicus.so、Windowsではoraociicus11.dll）のロードを試みます。いずれのライブラリも見つからない場合は、ORACLE_HOMEの完全インストールとみなされます。

Instant Client Light (English)のインストール

Instant Client Light (English)をインストールするには3つの方法があります。OTNのダウンロード・ページからのインストール、Client Admin Installを介したインストール、Oracle Universal Installerを介したインストールです。

Instant ClientおよびInstant Client Light (English)のすべてのファイルは、必ず空のディレクトリにコピーまたはインストールして、最終的なインストールで互換性のないバイナリが生じないようにします。

OTNのダウンロード・ページ

OTNからInstant Client Light (English)をインストールする場合は、通常のbasic.zipパッケージのかわりにbasiclite.zipパッケージをダウンロードして解凍します。ライブラリを解凍する前に、instantclient_11_2ディレクトリが空であることを必ず確認してください。ダウンロードできるパッケージは、OTNの次のURLにあります。

http://www.oracle.com/technology/tech/oci/instantclient/

Client Admin Install

ORACLE_HOME/instantclientディレクトリからInstant Clientのデータ共有ライブラリをコピーするかわりに、ORACLE_HOME/instantclient/lightディレクトリのInstant Client Light (English)データ共有ライブラリ(LinuxおよびUNIXではlibociicus.so、Windowsではoraociicus11.dlll)を使用します。つまり、Instant Clientディレクトリ（LinuxおよびUNIXではLD_LIBRARY_PATH、WindowsではPATH）には、サイズの小さいInstant Client Light (English)データ共有ライブラリが含まれています。

Oracle Universal Installer

Oracle Universal Installer（OUI）でInstant Clientのオプションを選択した場合は、デフォルトで完全なInstant Clientがインストールされますが、Instant Client Light (English)のライブラリもインストールされます。Instant Client Light (English)モードで操作する場合には、Instant Clientライブラリを、Instant Client Light (English)のデータ共有ライブラリで置き換えます。つまり、LinuxおよびUNIXではLD_LIBRARY_PATHにlibociicus.soを定義し、WindowsではPATHにoraociicus11.dllを定義する必要があります。このようにすると、デフォルトでInstant Client Light (English)が無効になります。

Instant Client Light (English)のデータ共有ライブラリは、最初にORACLE_HOME/instantclient/lightディレクトリに配置されます。インストールのベース・ディレクトリ、ORACLE_HOME/instantclientに移動し、ディレクトリのInstant Clientデータ共有ライブラリを削除する必要があります。

例2-4 Oracle Universal Installerを使用したInstant Client Light (English)のインストール

OUIでInstant ClientをLD_LIBRARY_PATHのmy_oraic_11_1ディレクトリにインストールした場合、次のコマンドを実行して、Instant Client Light (English)モードでの操作を確認します。互換性のないバイナリ・ファイルの使用を避けるために、Instant Clientファイルはすべて空のディレクトリにコピーしてインストールします。

cd my_oraic_11_1
rm libociei.so
mv light/libociicus.so .

Microsoft Visual C++でのOCCIの使用

Oracle Database 11g リリース1には、Microsoft Visual C++バージョン8.0（.NET 2005）およびMicrosoft Visual C++バージョン7.1（.NET 2003）によりアプリケーションを開発するためのOCCIライブラリが含まれます。Microsoft Visual C++バージョン7.0はサポート対象外となりました。

Microsoft Visual C++バージョン7.1ライブラリは、次のデフォルトの場所にインストールされています。

ORACLE_BASE\ORACLE_HOME\bin\oraocci11.dll
ORACLE_BASE\ORACLE_HOME\oci\lib\msvc\oraocci11.lib

また、これらの2つのファイルのコピーが、次のディレクトリにインストールされています。

ORACLE_BASE\ORACLE_HOME\oci\lib\msvc\vc71

Microsoft Visual C++ 8.0固有のライブラリ・バージョンは、次のディレクトリにインストールされています。

ORACLE_BASE\ORACLE_HOME\oci\lib\msvc\vc8

アプリケーションは、適切なOCCIライブラリとリンクする必要があります。対応するDLLがWindowsシステムPATHに置かれていることを確認してください。

MSVCRTD.DLLとリンクされるアプリケーション（Microsoft C-Runtimeのデバッグ・バージョン、/MDdコンパイラ・フラグ）は、これらの特定のOCCIライブラリ（oraocci11d.libおよびoraocci11d.dll）とリンクする必要があります。

すべてのInstant Clientパッケージに、Microsoft Visual C++バージョン7.1互換バージョンのOCCI DLLが含まれています。

3 リレーショナル・プログラミング

この章では、リレーショナル・データベースに格納されたデータを操作するための、Oracle C++ Call Interface（OCCI）を使用したC++アプリケーション開発の基本を説明します。

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

- データベースへの接続

- 接続プーリング

- SQLのDDL文とDML文の実行

- OCCI環境で使用するSQL文の種類

- SQL問合せの実行

- 文の動的実行

- トランザクションのコミット

- 文キャッシュ

- 例外処理

データベースへの接続

アプリケーションをデータベースに接続する方法には、複数の異なるオプションがあります。

環境の作成と終了

OCCIの処理はすべて、Environmentクラスの内部で行われます。OCCI環境では、アプリケーション・モードおよびユーザー指定のメモリー管理関数が提供されます。例3-1に、OCCI環境の作成方法を示しています。

例3-1 OCCI環境の作成方法

Environment *env = Environment::createEnvironment();

createxxx()メソッドで作成したOCCIオブジェクト（接続、接続プール、文）はすべて、明示的に終了する必要があります。必要に応じて、OCCI環境も明示的に終了する必要があります。例3-2に、OCCI環境の終了方法を示しています。

例3-2 OCCI環境の終了方法

Environment::terminateEnvironment(env);

また、OCCI環境の有効範囲は、その環境の内部で作成するオブジェクト型(Agent、Bytes、Date、Message、IntervalDS、IntervalYM、SubscriptionおよびTimestamp)より大きく設定しておく必要があります。例3-3に示すように、この規則は、BFile、BlobおよびClobオブジェクトには適用されません。

例3-3 Blobオブジェクトにおける環境の有効範囲の使用方法

const string userName = "HR";
const string password = "password";
const string connectString = "";

Environment *env = Environment::createEnvironment();
{
Connection *conn = env->createConnection(
userName, password, connectString);
Statement *stmt = conn->createStatement(
"SELECT blobcol FROM mytable");
ResultSet *rs = stmt->executeQuery();
rs->next();
Blob b = rs->getBlob(1);
cout << "Length of BLOB : " << b.length();
...
stmt->closeResultSet(rs);
conn->terminateStatement(stmt);
env->terminateConnection(conn);
}
Environment::terminateEnvironment(env);

アプリケーションがグローバル・スコープ内のオブジェクト（静的変数またはグローバル変数など）にアクセスする必要がある場合、環境を終了する前にこれらのオブジェクトをNULLに設定する必要があります。前述の例で、bがグローバル変数の場合、terminateEnvironment()コールの前にb.setNull()コールを実行する必要があります。

createEnvironmnt()メソッドのモード・パラメータを使用すると、アプリケーションのモードを次のように指定できます。

- スレッド環境での実行（THREADED_MUTEXEDまたはTHREADED_UNMUTEXED）

- オブジェクトの使用（OBJECT）

これらのモードは、環境ごとに設定できます。

接続のオープンとクローズ

Environmentクラスは、Connectionオブジェクトを作成するためのファクトリ・クラスです。最初にEnvironmentインスタンスを作成し、それを使用してユーザーがcreateConnection()メソッドでデータベースに接続できるようにします。

例3-4では、環境インスタンスを作成し、それを使用してデータベース・ユーザーHRと適切なパスワードのデータベース接続を作成しています。

例3-4 環境およびデータベースへの接続の作成方法

Environment *env = Environment::createEnvironment();
Connection *conn = env->createConnection("HR", "password");

次のコード例で示すように、操作セッションの終了時に、terminateConnection()メソッドを使用して、接続を明示的にクローズする必要があります。また、OCCI環境も明示的に終了する必要があります。

Connectionインスタンスの中で作成または命名されたすべてのオブジェクト（Ref、Bfile、Producer、Consumerなど）は、そのインスタンスの内部スコープ内で使用する必要があります。これらのオブジェクトのスコープは、Connectionが終了する前に明示的に終了する必要があります。例3-5に、接続および環境の終了方法を示しています。

例3-5 データベースへの接続および環境の終了方法

env->terminateConnection(conn);
Environment::terminateEnvironment(env);

接続プーリング

この項では、OCCIの接続プーリング機能の使用方法を説明します。この項は、次の項目で構成されています。

- 接続プールの使用

- ステートレスな接続プーリング

これらの2つの主な違いは、StatelessConnectionPoolが状態に依存しないアプリケーションで使用されることです。このようなアプリケーションで事前に認証された接続を使用すると、アプリケーションのパフォーマンスが向上します。

接続プールの使用

通常、中間層アプリケーションでは、多数のスレッドがデータベースに接続できる必要があります。各スレッドの継続時間は比較的短いため、すべてのスレッドに対してデータベースへの接続をオープンすると、接続の使用率およびパフォーマンスが低下する場合があります。

接続プーリング機能を使用すると、多数のスレッドで使用できる小さな接続セットがアプリケーションで作成できます。これにより、データベース・リソースを非常に効率的に活用できます。

接続プールの作成

接続プールを作成するには、例3-6に示すように、createConnectionPool()メソッドを使用します。

例3-6 createConnectionPool()メソッド

virtual ConnectionPool* createConnectionPool(
const string &poolUserName,
const string &poolPassword,
const string &connectString ="",
unsigned int minConn =0,
unsigned int maxConn =1,
unsigned int incrConn =1) = 0;

例3-6では、次のパラメータが使用されています。

- poolUserName: 接続プールの所有者。

- poolPassword: 接続プールにアクセスするためのパスワード。

- connectString: 接続プールが関連付けられたデータベース・サーバーを指定するデータベース名。

- minConn: 接続プールの作成時にオープンする最小接続数。

- maxConn: 接続プールで維持できる最大接続数。接続プールで最大接続数がオープンされていて、すべての接続がビジー状態の場合、接続を要求したOCCIメソッドのコールは、setErrorOnBusy()が接続プールに対してコールされていないかぎり、接続を取得するまで待機します。

- incrConn: すべての接続がビジー状態のときに、コールによって接続が要求された場合にオープンする追加の接続数。この増分は、オープン接続数の合計が、その接続プールでオープンできる最大接続数より少ない場合にのみ行われます。

例3-7は、接続プールの作成方法を示しています。

例3-7 接続プールの作成方法

const string connectString = "";
unsigned int maxConn = 5;
unsigned int minConn = 3;
unsigned int incrConn = 2;

ConnectionPool *connPool = env->createConnectionPool(
poolUserName,
poolPassword,
connectString,
minConn,
maxConn,
incrConn);

これらの属性は、すべて動的に構成できます。これによって、現行のロード（オープン接続数およびビジー接続数）を読み込み、これらの属性を適切にチューニングできる柔軟なアプリケーションを設計できます。また、setTimeOut()メソッドを使用すると、指定した時間を超過してアイドル状態になっている接続をタイムアウトすることもできます。OCCIでは、最適なオープン接続数を維持するために、アイドル状態の接続を定期的に終了します。

1つの環境に作成できる接続プールは1つに制限されているわけではありません。1つのOCCI環境に複数の接続プールを作成し、同一または異なるデータベースに接続できます。これは、ロード・バランシングが必要なアプリケーションで役に立ちます。

プロキシ接続

接続プールのユーザーに、他の接続のプロキシとして機能することを許可すると、その接続プールの接続を使用するデータベース・ユーザーは、ログイン・パスワードが一切不要になります。

プロキシ接続は、例3-8で示す2つのバージョンのcreateProxyConnection()メソッドをいずれか使用して作成できます。

例3-8 createProxyConnection()メソッド

ConnectionPool->createProxyConnection(
const string &username,
Connection::ProxyType proxyType = Connection::PROXY_DEFAULT);

または

ConnectionPool->createProxyConnection(
const string &username,
string roles[],
int numRoles,
Connection::ProxyType proxyType = Connection::PROXY_DEFAULT);

前述のメソッド例では、次のパラメータが使用されています。

- roles[ ]: このロールの配列は、プロキシ接続がクライアントに対してアクティブになった後でアクティブにするロールのリストを指定します。

- Connection::ProxyType proxyType = Connection::PROXY_DEFAULT: 列挙パラメータConnection::ProxyTypeには、プロキシ認証を実行する様々な方法を表す定数がリストされます。PROXY_DEFAULTは、nameがデータベース・ユーザー名を表していて、現在サポートされている唯一のプロキシ認証モードであることを示すために使用します。

ステートレスな接続プーリング

ステートレスな接続プーリングは、接続時間が短く、状態を考慮しないアプリケーションで使用するために設計されています。ステートレスな接続プーリングの主な利点は、時間のかかる接続および認証プロトコルの省略により、パフォーマンスが向上することです。

ステートレスな接続プールでは、複数のスレッドで使用可能な、ステートレスな認証済のデータベース接続のグループを作成し、維持します。スレッドによる接続の使用が終了すると、接続はプールに解放されます。使用可能な接続がない場合、新しい接続が生成されます。したがって、プール内の接続数は動的に増加します。

プール内の一部の接続に、特定のプロパティのタグを付加できます。デフォルト接続を要求し、グローバリゼーション・サポート設定などの属性を設定し、タグを付加してプールに戻すことが可能です。同一の属性を持つ接続が必要な場合、同一のタグを持つ接続を要求し、同一のタグを持つ、プール内の接続の1つを再利用できます。接続のタグは変更または再設定できます。

ステートレスな接続プーリング・インタフェースを介して、プロキシ接続も作成および維持できます。

ステートレスな接続プーリングは、接続を多重化することにより、中間層アプリケーションのスケーラビリティを向上します。ただし、StatelessConnectionPoolの接続は、ロング・トランザクションには使用しないでください。接続を長時間保持すると、同時実行性が低下します。

注意:

- OCCIでは、接続とタグのペアが正確であるかどうかは確認されません。同じタグが異なるクライアント側のプロパティで使用されていないかを確認する必要があります。

- 接続をプールに解放して戻す前に、アプリケーションですべてのオープン・トランザクションをコミットまたはロールバックする必要があります。そうしないと、接続の解放時にすべてのオープン・トランザクションが自動的にコミットされます。

ステートレスな接続プールには、次の2種類があります。

- 同種のプールでは、プールの作成時に指定したユーザー名とパスワードを使用して、すべての接続が認証されます。したがって、すべての接続の認証コンテキストは同じです。同種のプールでは、プロキシ接続は使用できません。

- 異種プールでは、異なる接続を認証するには、異なるユーザー名を使用します。また、異種プールでプロキシ接続を定義できるのは、サーバー上でプロキシ接続の作成に必要な権限が付与されている場合です。また、異種プールでは外部認証がサポートされます。

例3-9は、接続プールの基本的な使用例を示しています。例3-10に、同種のステートレスな接続プールの作成および使用例を、例3-11に、異種の接続プールの使用例を示します。

例3-9 StatelessConnectionPoolの使用方法

プール・サイズは動的であるため、ユーザー要件の変化に応じて指定の最大接続数の範囲内で設定されます。次のパラメータを使用してステートレスな接続プールが作成されているとします。

- minConn  =  5

- incrConn =  2

- maxConn  = 10

プールの作成時に5つの接続がオープンされます。

- openConn =  5

get[AnyTagged][Proxy]Connection()メソッドを使用して、ユーザーは5つのオープン接続をすべて使用します。

- openConn =  5

- busyConn =  5

ユーザーが別の接続を必要とする場合、プールは新しく2つの接続をオープンし、その一方をユーザーに戻します。

- openConn =  7

- busyConn =  6

プールできる接続数の上限は、プールの作成時に指定したmaxConnです。

ユーザーは、プール作成後にsetPoolSize()メソッドをコールしてプール・パラメータを変更することもできます。

異種プールが作成されている場合、incrConn引数とminConn引数は無視されます。

例3-10 同種のステートレスな接続プールの作成および使用方法

同種のステートレスな接続プールを作成するには、次の基本手順および疑似コード・コマンドを実行します。

1. createStatelessConnectionPool()コールを使用して、EnvironmentのHOMOGENEOUSモードで、ステートレスな接続プールを作成します。

StatelessConnectionPool *scp =
env->createStatelessConnectionPool(
username, passwd, connectString, maxCon, minCon, incrCon,
StatelessConnectionPool::HOMOGENEOUS );

2. getConnection()メソッドをコールして、新規または既存の接続をプールから取得します。

Connection *conn=scp->getConnection(tag);

このコールの実行中に、一致するタグを持つ接続がプールで検索されます。一致する接続が存在する場合、その接続がユーザーに戻されます。存在しない場合は、プールのユーザー名およびパスワードによって認証された、タグを持たない接続が返されます。

または、getAnyTaggedConnection()コールによって接続を取得できます。一致するタグまたはNULLタグの接続が存在しない場合、一致しないタグを持つ接続が戻されます。ConnectionへのgetTag()コールを使用して、戻されたタグを検証する必要があります。

Connection *conn=scp->getAnyTaggedConnection(tag);
string tag=conn->getTag();

3. 接続を使用します。

4. releaseConnection()をコールし、接続を解放してStatelessConnectionPoolに戻します。

scp->releaseConnection(conn, tag);

空のタグ""は、Connectionのタグを解除します。

getConnection()コールで同一のtagパラメータ値を使用して、StatelessConnectionPoolから接続を取得するよう選択できます。

Connection *conn=scp->getConnection(tag);

ConnectionはStatelessConnectionPoolに戻すかわりに、terminateConnection()コールを使用して破棄することもできます。

scp->terminateConnection(conn);

5. Environmentオブジェクトに対するterminateStatelessConnectionPool()コールにより、プールを破棄します。

env->terminateStatelessConnectionPool(scp);

例3-11 異種のステートレスな接続プールの作成および使用方法

異種のステートレスな接続プールを作成するには、次の基本手順および疑似コード・コマンドを実行します。

1. createStatelessConnectionPool()コールを使用して、EnvironmentのHETEROGENEOUSモードで、ステートレスな接続プールを作成します。

StatelessConnectionPool *scp =
env->createStatelessConnectionPool(
username, passwd, connectString, maxCon, minCon, incrCon,
StatelessConnectionPool::HETEROGENEOUS);

外部認証を有効にする場合は、createStatelessConnectionPool()コールでUSES_EXT_AUTHモードもアクティブにする必要があります。

StatelessConnectionPool *scp =
env->createStatelessConnectionPool(
username, passwd, connectString, maxCon, minCon, incrCon,
StatelessConnectionPool::PoolType(
StatelessConnectionPool::USES_EXT_AUTH|
StatelessConnectionPool::HETEROGENEOUS));

2. 異種プール・オプション用にオーバーロードされたStatelessConnectionPoolのgetConnection()メソッドをコールして、新規または既存の接続をプールから取得します。

Connection *conn=scp->getConnection(username, passwd, tag);

このコールの実行中に、一致するタグを持つ接続が異種プールで検索されます。一致する接続が存在する場合、その接続がユーザーに戻されます。存在しない場合、NULLタグを持つ、適切に認証されたタグなしの接続が戻されます。

または、異種プール用にオーバーロードされたgetAnyTaggedConnection()コールによって接続を取得できます。一致するタグまたはNULLタグの接続が存在しない場合、一致しないタグを持つ接続が戻されます。ConnectionへのgetTag()コールを使用して、戻されたタグを検証する必要があります。

Connection *conn=scp->getAnyTaggedConnection(username, passwd, tag);
string tag=conn->getTag();

また、StatelessConnectionPoolに対するgetProxyConnection()またはgetAnyTaggedProxyConnection()のコールにより、プロキシ接続も使用できます。

Connection *pconn = scp->getProxyConnection(proxyName, roles{},
nuRoles, tag, proxyType);
Connection *pconn = scp->getAnyTaggedProxyConnection( proxyName, tag,
proxyType);

プールで外部認証がサポートされる場合は、次のgetConnection()コールを使用します。

Connection *conn=scp->getConnection();

3. 接続を使用します。

4. releaseConnection()をコールし、接続を解放してStatelessConnectionPoolに戻します。

scp->releaseConnection(conn, tag);

空のタグ""は、Connectionのタグを解除します。

getConnection()コールで同一のtagパラメータ値を使用して、StatelessConnectionPoolから接続を取得するよう選択できます。

Connection *conn=scp->getConnection(tag);

ConnectionはStatelessConnectionPoolに戻すかわりに、terminateConnection()コールを使用して破棄することもできます。

scp->terminateConnection(conn);

5. Environmentオブジェクトに対するterminateStatelessConnectionPool()コールにより、プールを破棄します。

env->terminateStatelessConnectionPool(scp);

データベース常駐接続プーリング

企業レベルのアプリケーションは通常、データベースへの永続的な接続として実装されている大量の同時ユーザー・セッションを処理する必要があります。こうした接続の作成および管理のメモリー・オーバーヘッドは、データベースのパフォーマンスに対して重大な意味を持ちます。

データベース常駐接続プーリングは、大規模なアプリケーション接続を処理するために専用サーバーのプールを提供することで、永続的な接続が多すぎる問題を解決しており、これによってデータベースは何万もの同時接続に対応できます。したがって、データベース層のメモリー・フットプリントが大幅に削減され、データベース層および中間層の両方のスケーラビリティが向上します。データベース常駐接続プーリングは、中間層の接続プーリングに対応できない複数プロセス・アプリケーション・サーバーおよび複数の中間層を持つアーキテクチャ用に設計されています。

データベース常駐接続プーリングのアーキテクチャは、Oracle Databaseインスタンスに接続するためのデフォルトの専用モデルに密接に従っていますが、特定のサーバーを各接続に割り当てるオーバーヘッドはなくなります。サーバー層では、大部分の接続が指定時刻に非アクティブとなり、これらの各接続でメモリーが消費されます。このため、大量の接続をサポートするデータベース・システムは、使用可能なすべてのメモリーをすぐに使い果たしてしまう恐れがあります。データベース常駐接続プーリングでは、接続で専用サーバーを使用でき、専用サーバーによってOracleサーバー・プロセスとユーザー・セッションが結合されます。接続が非アクティブになると、接続のリソースがプールに戻され、類似した接続で使用可能になります。

包括的な接続プーリングが可能であるマルチスレッド中間層では、未使用の接続の問題が多少異なります。中間層の数が増えると、各中間層はデータベースへの複数の接続を個別に保持します。つまり、これらの接続は他の中間層と共有できません。かわりに接続プールをデータベースに置くと、類似したクライアント間で接続を共有できます。

データベース常駐接続プーリングでは、パスワードベース認証、文キャッシュ、タグ付けおよび高速アプリケーション通知がサポートされています。また、クライアント側のステートレスな接続プーリングをデータベース常駐接続プーリングと組み合せて使用できます。

データベース常駐接続プールからの接続を保持するクライアントは、バックグラウンドの接続ブローカ・プロセスに永続的に接続している点に注意してください。接続ブローカはプール機能を実装しており、専用サーバー・プロセスのプールに対するインバウンド・クライアント接続を多重化します。接続プールを使用しないクライアントは、かわりに専用サーバー・プロセスを使用します。

関連項目

- データベース常駐接続プーリングのアーキテクチャの詳細は、『Oracle Database概要』を参照してください。

- データベース常駐接続プーリングの構成の詳細は、『Oracle Database管理者ガイド』を参照してください。

- DBMS_CONNECTION_POOLパッケージの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

データベース常駐接続プールの管理

データベース常駐接続プーリングを実装するには、最初にSYSDBA権限を持つユーザーがシステム上で有効化する必要があります。データベース常駐接続プールの開始および保持に必要なステップは、例3-12を参照してください。

例3-12 データベース常駐接続プールの管理方法

SYSDBA権限を持つユーザーは次のステップを実行する必要があります。

1. データベースに接続します。

SQLPLUS / AS SYSDBA

2. （オプション）データベース常駐接続プールのパラメータを構成します。プールのデフォルト値は次のように設定されます。

DBMS_CONNECTION_POOL.CONFIGURE_POOL( 'SYS_DEFAULT_CONNECTION_POOL',
MIN=>10,
MAX=>200);

3. （オプション）データベース常駐接続プールの特定のパラメータを、他のパラメータに影響を与えずに変更します。

DBMS_CONNECTION_POOL.ALTER_PARAM(  'SYS_DEFAULT_CONNECTION_POOL',
'INACTIVITY_TIMEOUT',
10);

4. 接続プールを起動します。このステップの後、接続プールは適格なすべてのクライアントで使用可能になります。

DBMS_CONNECTION_POOL.START_POOL( 'SYS_DEFAULT_CONNECTION_POOL');

5. （オプション）データベース常駐接続プールのパラメータを変更します。

DBMS_CONNECTION_POOL.ALTER_PARAM( 'SYS_DEFAULT_CONNECTION_POOL',
'MAXSIZE',
20);

6. （オプション）接続プールの構成をデフォルト値にリセットできます。

DBMS_CONNECTION_POOL.RESTORE_DEFAULTS ( 'SYS_DEFAULT_CONNECTION_POOL');

7. プールを停止します。プール情報は永続的である点に注意してください。プールを停止しても、プール名および構成パラメータは破棄されません。

DBMS_CONNECTION_POOL.STOP_POOL();

Oracle RAC構成では、データベース常駐接続プールはすべての構成ノードで起動する点に注意してください。プールが停止しない場合、起動構成はインスタンスの再起動間も永続的です。プールはインスタンスの起動時に自動的に起動します。

データベース常駐接続プールの使用

データベース常駐接続プーリングを使用するには、Connectionクラスおよび接続の純正値を指定する必要があります。前回の接続状態の痕跡が残された可能性のない接続をアプリケーションが要求した場合、純正値をNEWと指定する必要があります。異なる地理ロケール設定のクライアントが同じデータベース・インスタンスを共有する場合、この方法をお薦めします。アプリケーションで以前使用された接続を使用できる場合、純正値をSELFに設定する必要があります。Connectionクラスおよび純正値の指定と組み合せてアプリケーション固有タグを使用し、必要な状態である、以前使用済の接続を選択できます。例3-12で示すように、デフォルトの接続プール名はSYS_DEFAULT_CONNECTION_POOLです。

この機能は、Connectionクラスおよび純正値を指定するパラメータを追加して、接続を取得するためのStatelessConnectionPoolクラスおよびEnvironmentクラスインタフェース（getConnection()およびgetProxyConnection()）をオーバーロードします。クライアント側接続プール外の接続要求はすべて、デフォルトの純正値がNEWです。クライアント側接続プールの内部の接続要求は、デフォルトの純正値がSELFとなります。

例3-13 データベース常駐接続プールからの接続の取得方法

conn1 = env->createConnection (/*username */"hr",
/*password*/ "password", /* database*/ "inst1_cmon",
/* connection class */"TESTCC", /* purity */Connection::SELF);
stmt1 = conn1->createStatement("select count(*) from emp");
rs=stmt1->executeQuery();
while (rs->next())
{
int num = rs->getInt(1);
sprintf((char *)tmp, "%d", num);
cout << tmp << endl;
}
stmt1->closeResultSet(rs);
conn1->terminateStatement(stmt1);
env->terminateConnection(conn1);

例3-14 クライアント側プールおよびサーバー側プールの使用

StatelessConnectionPool *scPool;
OCCIConnection *conn1, *conn2;
scPool = env->createStatelessConnectionPool
(poolUserName, poolPassword, connectString, maxConn,
minConn, incrConn, StatelessConnectionPool::HOMOGENEOUS);

conn1= scPool->getConnection( /* Connection class name */"TESTCC",
/* Purity */ Connection::SELF);
/* or, for proxy coonnections */
conn2= scPool->getProxyConnection(/* username*/ "HR_PROXY",
/*Connection class */"TESTCC", /* Purity */Connection::SELF);
/* or, for getting a tagged connection */
conn3 = scPool->getConnection(/*connection class */"TESTCC",
/*purity*/ Connection::SELF,
/*tag*/ "TESTTAG");
/* Releasing a tagged connection is done presently */
scPool->releaseConnection(conn3, "TESTTAG");

/* To specify purity as new */
conn4 = scPool->getConnection(/* connection class */"TESTCC",/* purity of new */
Connection::NEW);

/* Get a connection using username and password */
conn5 = scPool->getConnection (username, password,"TESTCC", Connection::SELF);

/* Using roles when asking for a connection */
conn6 = scPool->getProxyConnection (username, roles, nRoles,"TESTCC",
Connection::SELF);

...

/* The other code continues as is...writing for clarity */
...
stmt1=conn1->createStatement  ("INSERT INTO emp values (:c1, :c2)");
stmt1->setInt(1, thrid);
stmt1->setString(2, "Test");
int count = stmt1->executeUpdate ();
conn1->commit();
conn1->terminateStatement(stmt1);
/* Release the connection */
scPool->releaseConnection (conn1);
...
env->terminateStatelessConnectionPool (scPool);

SQLのDDL文とDML文の実行

SQLは、リレーショナル・データベースを操作するための業界標準の言語です。OCCIでは、Statementクラスを使用してSQLコマンドを実行します。

文オブジェクトの作成

Statementオブジェクトを作成するには、例3-15に示すように、ConnectionオブジェクトのcreateStatement()メソッドをコールします。

例3-15 文の作成方法

Statement *stmt = conn->createStatement();

SQLコマンドを実行する文オブジェクトの作成

Statementオブジェクトの作成後、Statementオブジェクトのexecute()、executeUpdate()、executeArrayUpdate()またはexecuteQuery()メソッドをコールして、SQLコマンドを実行します。これらのメソッドは、次の目的に使用されます。

- execute()は、不特定な種類の文をすべて実行します。

- executeUpdate()は、DML文およびDDL文を実行します。

- executeArrayUpdate()は、複数のDML文を実行します。

- executeQuery()は、問合せを実行します。

データベース表の作成

例3-16に、executeUpdate()メソッドを使用したデータベース表の作成方法を示しています。

例3-16 executeUpdate()メソッドを使用したデータベース表の作成方法

stmt->executeUpdate("CREATE TABLE shopping_basket
(item_number VARCHAR2(30), quantity NUMBER(3))");

データベース表への値の挿入

同様に、executeUpdate()メソッドを呼び出して、例3-17で示すように、SQLのINSERT文を実行できます。

例3-17 executeUpdate()メソッドを使用したレコードの追加方法

stmt->executeUpdate("INSERT INTO shopping_basket
VALUES('MANGO', 3)");

executeUpdate()メソッドは、SQL文によって影響を受けた行数を戻します。

関連項目
$ORACLE_HOME/rdbms/demoのコード例で、表の行に対する挿入、選択、更新および削除操作の実行方法の実例を参照してください。

文オブジェクトの再利用

Statementオブジェクトを再利用すると、SQL文を複数回実行できます。複数のパラメータで同じ文を繰り返し実行するには、例3-18に示すように、StatementオブジェクトのsetSQL()メソッドを使用して文を指定します。

例3-18 setSQL()メソッドを使用したSQL文の指定方法

stmt->setSQL("INSERT INTO shopping_basket VALUES(:1,:2)");

この指定によって、同じINSERT文を必要な回数だけ実行できます。後で別のSQL文を実行する場合は、例3-19に示すように、文オブジェクトを再設定します。

例3-19 setSQL()メソッドを使用したSQL文の再設定方法

stmt->setSQL("SELECT * FROM shopping_basket WHERE quantity >= :1");

setSQL()メソッドを使用することにより、OCCIの文オブジェクトとそれに関連付けられたリソースが、不必要に割り当てられたり解放されることがなくなります。現行の文オブジェクトの内容を任意の時点で取り出すには、getSQL()メソッドを使用します。

文オブジェクトの終了

例3-20に示すように、terminateStatement()メソッドを使用してStatementオブジェクトを明示的に終了し、割当てを解除する必要があります。

例3-20 terminateStatement()メソッドを使用した文の終了方法

Connection::conn->terminateStatement(Statement *stmt);

OCCI環境で使用するSQL文の種類

OCCI環境では、次の3種類のSQL文を使用します。

- 標準的な文では、SQLコマンドに値を指定します。

- パラメータ化された文には、パラメータまたは変数を指定します。

- コール可能文では、PL/SQLストアド・プロシージャおよびファンクションをコールします。

Statementクラスのメソッドは、すべての文、パラメータ化された文およびコール可能文の各文に適用可能なメソッドに分類されます。標準的な文はパラメータ化された文のスーパーセットで、パラメータ化された文はコール可能文のスーパーセットです。

標準的な文

例3-16および例3-17のどちらも、文の値を明示的に定義する必要がある標準的な文を示しています。例3-16で、CREATE TABLE文では表の名前（shopping_basket）を指定しています。例3-17で、INSERT文では表に挿入する値('MANGO', 3)を定めています。

パラメータ化された文

文の入力変数にプレースホルダを設定すると、複数のパラメータを使用して同じ文を実行できます。これらの文は、ユーザーまたはプログラムからのパラメータ入力に対応できるため、パラメータ化された文と呼ばれます。

複数のパラメータでINSERT文を実行する場合は、例3-18に示すように、まずStatementオブジェクトのsetSQL()メソッドを使用して文を指定する必要があります。

次に、パラメータを指定するために、setxxx()をコールします。xxxは、パラメータの型を表します。例3-18で指定するように、文オブジェクトの値が"INSERT INTO shopping_basket VALUES(:1,:2)"である場合、例3-21のコードを使用し、setString()メソッドおよびsetInt()メソッドを呼び出して、これらの型の値を第1および第2パラメータに入力できます。さらにexecuteUpdate()メソッドを呼び出して新しい行を表に挿入できます。文オブジェクトを再利用するには、パラメータを再設定し、executeUpdate()メソッドをもう一度コールします。アプリケーションで同じ文を繰り返し実行している場合は、入力パラメータの型を変更すると、リバインド操作が開始されてアプリケーションのパフォーマンスに影響するため、入力パラメータの型の変更は避ける必要があります。

例3-21 setxxx()メソッドを使用した個別の列値の設定方法

stmt->setString(1, "Banana");     // value for first parameter
stmt->setInt(2, 5);               // value for second parameter
stmt->executeUpdate();            // execute statement
...
stmt->setString(1, "Apple");      // value for first parameter
stmt->setInt(2, 9);               // value for second parameter
stmt->executeUpdate();            // execute statement

コール可能文

PL/SQLストアド・プロシージャは、その名前が示すように、データベース・サーバーに格納されているプロシージャです。アプリケーションではこのプロシージャを再利用できます。OCCIでは、コール可能文は、他のSQL文を含むプロシージャのコールです。

指定した種類のフルーツの数を戻すプロシージャcountGroceries()をコールする場合、例3-22に示すように、まずStatementクラスのsetXXX()メソッドにより、PL/SQLストアド・プロシージャの入力パラメータを指定する必要があります。

例3-22 PL/SQLストアド・プロシージャのINパラメータの指定方法

stmt->setSQL("BEGIN countGroceries(:1, :2); END:");
int quantity;
stmt->setString(1, "Apple");   // specify the first (IN) parameter of procedure

ただし、ストアド・プロシージャをコールする前に、例3-23に示すように、registerOutParam()メソッドをコールして、OUTパラメータの型とサイズを指定しておく必要があります。IN/OUTパラメータの場合、setXXX()メソッドを使用してパラメータを渡し、getXXX()メソッドを使用して結果を取得します。

例3-23 PL/SQLストアド・プロシージャのOUTパラメータの指定方法

stmt->registerOutParam(2, Type::OCCIINT, sizeof(quantity));
// specify type and size of the second (OUT) parameter

次に、プロシージャをコールして文を実行します。

stmt->executeUpdate();           // call the procedure

最後に、適切なgetxxx()メソッドをコールして、出力パラメータを取得します。

quantity = stmt->getInt(2);     // get value of the second (OUT) parameter

配列パラメータを使用するコール可能文

コール可能文を通じて実行されるPL/SQLストアド・プロシージャには、値の配列をパラメータとして指定できます。配列内の要素の数とディメンションは、setDataBufferArray()メソッドで指定します。

次に、setDataBufferArray()メソッドの例を示します。

void setDataBufferArray(
unsigned int paramIndex,
void *buffer,
Type type,
ub4 arraySize,
ub4 *arrayLength,
sb4 elementSize,
ub2 *elementLength,
sb2 *ind = NULL,
ub2 *rc = NULL);

前述のメソッド例では、次のパラメータが使用されています。

- paramIndex: パラメータ番号。

- buffer: 値の配列を格納するデータ・バッファ。

- Type: データ・バッファ内のデータの型。

- arraySize: 配列の最大要素数。

- arrayLength: 配列の要素数。

- elementSize: 配列の現行要素のサイズ。

- elementLength: 長さの配列へのポインタ。elementLength[i]は、配列内のi番目の現在の長さです。

- ind: インジケータ情報。

- rc: リターン・コード。

ストリーム読込み/書込み

OCCIではストリーム・インタフェースがサポートされており、データを一連の小さな固まりに分割することで、非常に大きな列を挿入および取得できます。この方法により、クライアント側のメモリー要件が縮小されます。このストリーム・インタフェースは、SELECTや様々なDMLコマンドなどのパラメータ化された文、およびPL/SQLブロック内のコール可能文で使用できます。ストリームでサポートされているデータ型は、BLOB、CLOB、LONG、LONG RAW、RAWおよびVARCHAR2です。

ストリーム・データには、次の3種類があります。

- SELECT/DML文のバインド変数またはコール可能文のIN引数に対応する書込み可能ストリーム

- SELECT文のフェッチされた列値またはコール可能文のOUT引数に対応する読込み可能ストリーム

- IN/OUTバインド変数に対応する双方向ストリーム

Streamクラスのメソッドは、ストリーム・インタフェースをサポートします。

StatementクラスのgetStream()メソッドは、DMLおよびコール可能文の読込みおよび書込みをサポートするストリーム・オブジェクトを戻します。

- 書込みの場合、データをバインド変数に、またはIN引数またはIN/OUT引数に渡します。

- 読込みの場合、データをOUTまたはIN/OUT引数からフェッチします。

ResultSetクラスのgetStream()メソッドは、データの読込みに使用できるストリーム・オブジェクトを戻します。

これらのクラスのstatus()メソッドにより、ストリーム操作のステータスが決定されます。

ストリーム・モードでのデータのバインド（SELECT/DMLおよびPL/SQL）

データをストリーム・モードでバインドするには、次の手順を実行し、例3-24を参照してください。

1. 適切なバインド・プレースホルダを使用して、SELECT/DMLまたはPL/SQL文を作成します。

2. ストリーム・モードで使用する各バインドの位置に対し、StatementクラスのsetBinaryStreamMode()またはsetCharacterStreamMode()メソッドをコールします。バインドの位置がPL/SQLのINまたはIN/OUT引数型の場合、このことを示すために、これらのメソッドの3引数バージョンをコールし、inArgパラメータをTRUEに設定します。

3. 文を実行します。Statementクラスのstatus()メソッドにより、NEEDS_STREAM_DATAが戻されます。

4. StatementクラスのgetStream()メソッドを使用してストリーム・オブジェクトを取得します。

5. StreamクラスのwriteBuffer()およびwriteLastBuffer()メソッドを使用してデータを書き込みます。

6. StatementクラスのcloseStream()メソッドを使用してストリームをクローズします。

7. すべてのストリームがクローズされると、Statementクラスのstatus()メソッドはUPDATE_COUNT_AVAILABLEなどの適切な値に変更されます。

例3-24 ストリーム・モードでのデータのバインド

Statement *stmt = conn->createStatement(
"Insert Into testtab(longcol) values (:1)"); //longcol is LONG type column
stmt->setCharacterStreamMode(1, 100000);
stmt->executeUpdate();

Stream *instream = stmt->getStream(1);
char buffer[1000];
instream->writeBuffer(buffer, len);             //write data
instream->writeLastBuffer(buffer, len);         //repeat
stmt->closeStream(instream);                    //stmt->status() is
//UPDATE_COUNT_AVAILABLE

Statement *stmt = conn->createStatement("BEGIN testproc(:1); END;");

//if the argument type to testproc is IN or IN/OUT then pass TRUE to
//setCharacterStreamMode or setBinaryStreamMode
stmt->setBinaryStreamMode(1, 100000, TRUE);

ストリーム・モードでのデータのフェッチ（PL/SQL）

ストリーム・モードでデータをフェッチするには、次の手順を実行し、例3-25を参照してください。

1. 適切なバインド・プレースホルダを使用して、SELECT/DML文を作成します。

2. ストリーム・モードから取得されたデータが入る各バインド位置に対し、StatementクラスのsetBinaryStreamMode()またはsetCharacterStreamMode()メソッドをコールします。

3. 文を実行します。Statementクラスのstatus()メソッドにより、STREAM_DATA_AVAILABLEが戻されます。

4. StatementクラスのgetStream()メソッドを使用してストリーム・オブジェクトを取得します。

5. StreamクラスのreadBuffer()およびreadLastBuffer()メソッドを使用してデータを読み込みます。

6. StatementクラスのcloseStream()メソッドを使用してストリームをクローズします。

例3-25 PL/SQLを使用したストリーム・モードでのデータのフェッチ

Statement *stmt = conn->createStatement("BEGIN testproc(:1); END;");
//argument 1 is OUT type
stmt->setCharacterStreamMode(1, 100000);
stmt->execute();

Stream *outarg = stmt->getStream(1);
//use Stream::readBuffer/readLastBuffer to read data

ストリーム・モードでのデータのフェッチ（ResultSet）

「SQL問合せの実行」および例3-28で、ストリーム・インタフェースで結果セットを使用する方法を説明します。

複数のストリームの使用

複数の読込みおよび書込みストリームを使用する場合、別のストリームの読込みまたは書込みを実行する前に、その前のストリームの読込みまたは書込みが完了していることを確認する必要があります。ストリームの位置を判断するには、StatementクラスのgetCurrentStreamParam()メソッド、またはResultSetクラスのgetCurrentStreamColumn()メソッドを使用します。表13-45で説明しているように、Streamクラスのstatus()メソッドは、ストリームに読込みが可能なデータが含まれる場合はREADY_FOR_READを戻します。また、すべてのデータが読込み済である場合はINACTIVEを戻します。アプリケーションは次のストリーム列を読み込むことができます。例3-26は、2つの同時ストリームの読込みおよび書込みの方法を示しています。これらのストリーム・インタフェースは、同一のStatementオブジェクトおよびResultSetオブジェクト内のsetDataBuffer()メソッドとともに使用できません。

例3-26 複数のストリームの読込みおよび書込みの方法

Statement *stmt = conn->createStatement(
"Insert into testtab(longcol1, longcol2) values (:1,:2)");
//longcol1 AND longcol2 are 2 columns inserted in streaming mode

stmt->setBinaryStreamMode(1, 100000);
stmt->setBinaryStreamMode(2, 100000);
stmt->executeUpdate();

Stream *col1 = stmt->getStream(1);
Stream *col2 = stmt->getStream(2);

col1->writeBuffer(buffer, len);        //first stream
...                                    //complete writing coll stream

col1->writeLastBuffer(buffer, len);    //finish first stream and move to col2

col2->writeBuffer(buffer, len);        //second stream

//reading multiple streams
stmt = conn->createStatement("select longcol1, longcol2 from testtab");
ResultSet *rs = stmt->executeQuery();
rs->setBinaryStreamMode(1, 100000);
rs->setBinaryStreamMode(2, 100000);

while (rs->next())
{
Stream *s1 = rs->getStream(1)
while (s1->status() == Stream::READY_FOR_READ)
{
s1->readBuffer(buffer,size);    //process
}                                  //first streaming column done
rs->closeStream(s1);

//move onto next column. rs->getCurrentStreamColumn() returns 2

Stream *s2 = rs->getStream(2)
while (s2->status() == Stream::READY_FOR_READ)
{
s2->readBuffer(buffer,size);    //process
}                                  //close the stream
rs->closeStream(s2);
}

関連項目
アプリケーションによるデータ・バッファの管理

行変更の反復

executeUpdateメソッドは各行に対して繰り返し発行できますが、OCCIには、1回のネットワーク・ラウンドトリップで複数行に対してデータを送信する効率的なメカニズムがあります。StatementクラスのaddIteration()メソッドを使用して、反復ごとに異なる行を変更するバッチ操作を実行します。

INSERT、UPDATEおよびDELETEの各操作を反復して実行するには、次の設定を行う必要があります。

- 最大反復回数の設定

- 可変長パラメータに対する最大パラメータ・サイズの設定

最大反復回数の設定

反復実行を行う場合は、最初にsetMaxIterations()メソッドをコールして、文に対して実行する最大反復回数を指定します。

Statement->setMaxIterations(int maxIterations);

現行の最大反復回数の設定を取得するには、getMaxIterations()メソッドをコールします。

最大パラメータ・サイズの設定

反復実行にstringやBytesなどの可変長のデータ型が含まれている場合は、OCCIで最大バッファ・サイズの割当てができるように、次のように最大パラメータ・サイズを設定する必要があります。

Statement->setMaxParamSize(int parameterIndex, int maxParamSize);

NumberやDate、あるいはsetDataBuffer()メソッドを使用するパラメータなど、固定長のデータ型については最大パラメータ・サイズを設定する必要はありません。

現行の最大パラメータ・サイズの設定を取得するには、getMaxParamSize()メソッドをコールします。

反復操作の実行

最大反復回数および(必要に応じて)最大パラメータ・サイズの設定後は、例3-27に示すように、パラメータ化された文を使用した反復実行を簡単に行うことができます。

反復実行は、標準的な文またはパラメータ化された文のいずれかによるINSERT、UPDATEおよびDELETE操作にのみ使用できるように設計されています。コール可能文および問合せには使用できません。反復間でのデータ型の変更はできません。たとえば、パラメータ1にsetInt()を使用した場合、後続の反復の同じパラメータにはsetString()を使用できません。

例3-27 反復操作の実行方法

stmt->setSQL("INSERT INTO basket_tab VALUES(:1, :2)");

stmt->setString(1, "Apples");   // value for first parameter of first row
stmt->setInt(2, 6);             // value for second parameter of first row
stmt->addIteration();           // add the iteration

stmt->setString(1, "Oranges");  // value for first parameter of second row
stmt->setInt(1, 4);             // value for second parameter of second row

stmt->executeUpdate();          // execute statement

例に示したように、最後の反復を除く各反復の後にaddIteration()メソッドをコールし、その後executeUpdate()メソッドを呼び出します。2番目の行を挿入しない場合は、addIteration()メソッドや後続のsetxxx()メソッドのコールは必要ありません。

SQL問合せの実行

SQL問合せを使用すると、アプリケーションは指定した制約に基づいて、データベースから情報を要求できます。結果セットが問合せによって返されます。

結果セットの使用

データベース問合せを実行すると、問合せ結果は、結果セットと呼ばれる行セットに格納されます。OCCIでは、SQLのSELECT文は、StatementクラスのexecuteQueryメソッドによって実行されます。このメソッドは、問合せ結果を表すResultSetオブジェクトを戻します。

ResultSet *rs = stmt->executeQuery("SELECT * FROM basket_tab");

結果セットのデータを取得した後は、そのデータに対して操作を実行できます。たとえば、この表の内容を出力するとします。次のコード例に示すように、ResultSetのnext()メソッドを使用してデータをフェッチし、getxxx()メソッドを使用して結果セットの個々の列を取り出します。

cout << "The basket has:" << endl;

while (rs->next())
{
string fruit = rs->getString(1);     // get the first column as string
int quantity = rs->getInt(2);        // get the second column as int

cout << quantity << " " << fruit << endl;
}

ResultSetクラスのnext()およびstatus()メソッドは、Status(定義は表13-38を参照)を返します。

データが現在行に対して使用可能な場合、ステータスはDATA_AVAILABLEとなります。すべてのデータが読み込まれると、ステータスはEND_OF_FETCHに変更されます。読み込む出力ストリームがある場合は、そのストリーム・データがすべて正常に読み込まれるまで、ステータスはSTREAM_DATA_AVAILABLEとなります。

例3-28は、ストリーム・データを結果セットへフェッチする方法を示しています。基本情報は、「ストリーム読込み/書込み」の項を参照してください。

例3-28 ResultSetを使用したストリーム・モードでのデータのフェッチ

char buffer[4096];
ResultSet *rs = stmt->executeQuery
("SELECT col1, col2 FROM tab1 WHERE col1 = 11");
rs->setCharacterStreamMode(2, 10000);

while (rs->next ())
{
unsigned int length = 0;
unsigned int size = 500;
Stream *stream = rs->getStream (2);
while (stream->status () == Stream::READY_FOR_READ)
{
length += stream->readBuffer (buffer +length, size);
}
cout << "Read "  << length << " bytes into the buffer" << endl;
}

問合せの指定

INバインド変数を問合せで使用すると、問合せのWHERE句に制約を指定できます。たとえば、次のプログラムは、最小数量4を持つ項目のみを出力します。

stmt->setSQL("SELECT * FROM basket_tab WHERE quantity >= :1");
int minimumQuantity = 4;
stmt->setInt(1, minimumQuantity);     // set first parameter
ResultSet *rs = stmt->executeQuery();
cout << "The basket has:" << endl;

while (rs->next())
cout << rs->getInt(2) << " " << rs->getString(1) << endl;

プリフェッチ・カウントの設定によるパフォーマンスの最適化

ResultSetメソッドでは1度に1行のデータを取り出しますが、サーバーからの実際のデータ・フェッチでは、問合せ対象の行ごとにネットワーク・ラウンドトリップを発生させる必要はありません。パフォーマンスを最大にするために、サーバーに対する各ラウンドトリップでプリフェッチする行数を設定できます。

これを行うには、setPrefetchRowCount()メソッドでプリフェッチする行数を設定するか、またはsetPrefetchMemorySize()メソッドでプリフェッチに使用するメモリー・サイズを設定します。

この属性を両方とも設定すると、指定したメモリー制限に先に到達しないかぎり、指定した行数がプリフェッチされます。指定したメモリー制限に先に到達した場合は、setPrefetchMemorySize()メソッドのコールで定義したメモリー領域に適合する行数が戻ります。

デフォルトではプリフェッチはオンになっており、データベースでは常に1行余分にフェッチします。プリフェッチをオフにするには、プリフェッチする行数とメモリー・サイズの両方を0（ゼロ）に設定します。

LONG、LOBまたは不透明型の列(XMLTypeなど)が問合せの一部である場合、プリフェッチは無効になります。

文の動的実行

DML操作が必要であるとわかっている場合は、executeUpdateメソッドを使用します。同様に、問合せが必要であるとわかっている場合はexecuteQuery()メソッドを使用します。

しかし、アプリケーションで動的イベントを使用する必要がある場合、実行時にどの文の実行が必要であるかを確認できません。このため、OCCIには、execute()メソッドが用意されています。execute()メソッドを呼び出すと、次のいずれかのステータスが戻されます。

- UNPREPARED

- PREPARED

- RESULT_SET_AVAILABLE

- UPDATE_COUNT_AVAILABLE

- NEEDS_STREAM_DATA

- STREAM_DATA_AVAILABLE

execute()メソッドの呼出しで、これらのステータスのいずれかが戻されますが、statusメソッドを使用して文を「調べる」ことができます。

Statement stmt = conn->createStatement();
Statement::Status status = stmt->status();       // status is UNPREPARED
stmt->setSQL("select * from emp");
status = stmt->status();                         // status is PREPARED

SQL文字列で文オブジェクトを作成した場合は、PREPARED状態で作成されます。たとえば、次のようにします。

Statement stmt = conn->createStatement("insert into foo(id) values(99)");
Statement::Status status = stmt->status();// status is PREPARED
status = stmt->execute();                 // status is UPDATE_COUNT_AVAILABLE

別のSQL文をStatementに設定すると、ステータスがPREPAREDに変更されます。たとえば、次のようにします。

stmt->setSQL("select * from emp");        // status is PREPARED
status = stmt->execute();                 // status is RESULT_SET_AVAILABLE

文のステータスの定義

この項では、文オブジェクトに関連付けられているStatusの取りうる値について説明します。

- UNPREPARED

- PREPARED

- RESULT_SET_AVAILABLE

- UPDATE_COUNT_AVAILABLE

- NEEDS_STREAM_DATA

- STREAM_DATA_AVAILABLE

UNPREPARED

setSQL()メソッドで文オブジェクトにSQL文字列の属性を指定していない場合、その文はUNPREPARED状態になります。

Statement stmt = conn->createStatement();
Statement::Status status = stmt->status(); // status is UNPREPARED

PREPARED

SQL文字列でStatementを作成した場合は、PREPARED状態で作成されます。たとえば、次のようにします。

Statement stmt = conn->createStatement("INSERT INTO demo_tab(id) VALUES(99)");
Statement::Status status = stmt->status();    // status is PREPARED

別のSQL文をStatementに設定した場合、ステータスはPREPAREDに変更されます。たとえば、次のようにします。

status = stmt->execute();                 // status is UPDATE_COUNT_AVAILABLE
stmt->setSQL("SELECT * FROM demo_tab");   // status is PREPARED

RESULT_SET_AVAILABLE

RESULT_SET_AVAILABLEステータスは、適切に作成された問合せが実行済で、結果セットを通じて結果にアクセスできることを示します。

文オブジェクトを問合せに設定すると、ステータスはPREPAREDになります。問合せを実行すると、その文のステータスはRESULT_SET_AVAILABLEに変更されます。たとえば、次のようにします。

stmt->setSQL("SELECT * from EMP");          // status is PREPARED
status = stmt->execute();                   // status is RESULT_SET_AVAILABLE

結果セットのデータにアクセスするには、次の文を発行します。

ResultSet *rs = Statement->getResultSet();

UPDATE_COUNT_AVAILABLE

PREPARED状態のDDL文またはDML文を実行すると、その状態がUPDATE_COUNT_AVAILABLEに変更されます。次にコード例を示します。

Statement stmt = conn->createStatement("INSERT INTO demo_tab(id) VALUES(99)");
Statemnt::Status status = stmt->status(); // status is PREPARED
status = stmt->execute();                 // status is UPDATE_COUNT_AVAILABLE

このステータスは、文の実行によって影響を受けた行数を示します。また、次のことを示しています。

- その文に入力ストリームまたは出力ストリームが含まれていないこと

- その文が問合せではなく、DDL文またはDML文のいずれかであること

影響を受けた行数を取得するには、次の文を発行します。

Statement->getUpdateCount();

DDL文の結果は、更新カウント0 (ゼロ)になります。同様に、一致条件のいずれも満たさない更新の場合、結果はカウント0 (ゼロ)になります。このような場合は、実行された文の種類をレポートされたステータスから判断することはできません。

NEEDS_STREAM_DATA

書き込まれる出力ストリームがある場合は、すべてのストリーム・データが完全に書き込まれるまで実行は完了しません。このような場合、ステータスはNEEDS_STREAM_DATAに変更され、ストリームを書き込む必要があることを示します。ストリームの書込み後、status()メソッドをコールして、さらに書き込むストリーム・データがあるかどうか、つまり実行が完了したかどうかを調べます。

複数のストリーム・パラメータが文に含まれている場合は、getCurrentStreamParam()メソッドを使用して書込みが必要なパラメータを検出します。

反復または配列実行の場合は、getCurrentStreamIteration()メソッドによって、データを書き込む対象の反復を識別します。

ストリーム・データがすべて処理されると、ステータスはRESULT_SET_AVAILABLEまたはUPDATE_COUNT_AVAILABLEに変更されます。

STREAM_DATA_AVAILABLE

このステータスは、実行の完了前に、アプリケーションで一部のストリーム・データをOUTパラメータまたはIN/OUTパラメータに読み込む必要があることを示しています。ストリームの読込み後、statusメソッドをコールして、さらに読み込むストリーム・データがあるかどうか、つまり実行が完了したかどうかを調べます。

複数のストリーム・パラメータが文に含まれている場合は、getCurrentStreamParam()メソッドを使用して読込みが必要なパラメータを検出します。

反復または配列実行の場合は、getCurrentStreamIteration()メソッドによって、データを読み込む対象の反復を識別します。

ストリーム・データがすべて処理されると、ステータスはUPDATE_COUNT_REMOVE_AVAILABLEに変更されます。

ResultSetクラスにも読込み可能なストリームがあり、Statementクラスの読込み可能なストリームと同様に機能します。

トランザクションのコミット

SQLのDML文はすべて、トランザクションのコンテキスト内で実行されます。DML文によって行われたアプリケーションへの変更は、トランザクションのコミットによって永続的に変更されるか、ロールバックの実行によって取り消されます。SQLのCOMMIT文およびROLLBACK文は、executeUpdate()メソッドで実行できますが、Connection::commit()メソッドおよびConnection::rollback()メソッドをコールすることもできます。

DMLで行った変更を即時にコミットする場合は、次の文を発行して、Statementクラスの自動コミット・モードをオンにできます。

Statement::setAutoCommit(TRUE);

自動コミットを有効にした後は、変更を行うたびに自動的に永続的な変更となります。これは、各実行の直後にコミットを発行するのと同じです。

デフォルトのモードに戻るには、次の文を発行して自動コミットをオフにします。

Statement::setAutoCommit(FALSE);

文キャッシュ

文キャッシュ機能により、セッション内の文のキャッシュが確立および管理されます。サーバー側で準備したカーソルを効率的に使用し、文の解析の繰返しを省略することにより、アプリケーションのパフォーマンスおよびスケーラビリティを改善します。

文キャッシュは接続およびセッション・プーリングとともに使用でき、また接続プーリングなしでも使用できます。一般的な使用例は、例3-29および例3-30を参照してください。

例3-29 接続プーリングを使用しない文キャッシュ

次の手順および疑似コードで、接続プールを使用しない文キャッシュ機能の実装方法を説明します。

1. Environmentオブジェクトに対してcreateConnection()コールを実行し、Connectionを作成します。

Connection *conn = env->createConnection(
username, password, connecstr);

2. setStmtCacheSize()コールで0（ゼロ）以外のsizeパラメータを使用して、Connectionオブジェクトで文キャッシュを使用可能にします。

conn->setStmtCacheSize(10);

この後、getStmtCacheSize()をコールすることにより、キャッシュのサイズが決定されます。また、setStmtCacheSize()コールにより、文キャッシュのサイズが変更され、sizeパラメータを0（ゼロ）に設定すると文キャッシュが使用禁止になります。

3. ConnectionオブジェクトへのcreateStatement()コールにより、Statementを作成します。キャッシュ内に存在する場合はStatementは戻され、そうでない場合はNULLタグを持つ新しいStatementが作成されます。

Statement *stmt = conn->createStatement(sql);

事前にキャッシュされたタグ付き文を取り出すには、createStatement()メソッドの代替形式を使用します。

Statement *stmt = conn->createStatement(sql, tag);

4. 文を使用してSQLコマンドを実行し、結果を取得します。

5. 文をキャッシュに戻します。

conn->terminateStatement(stmt, tag);

この文をキャッシュしない場合、disableCaching()コールおよびterminateStatement()の代替形式を使用します。

stmt->disableCaching();
conn->terminateStatement(stmt);

文がキャッシュされているかどうかを検証するには、Connectionオブジェクトに対してisCached()コールを発行します。

解放時に文をタグ付けし、後で、同じタグを持つ別の文用に再利用することもできます。タグは、キャッシュを検索するために使用されます。タグ付けされていない文（つまりタグがNULLの文）は、タグ付けされている文の特別なケースです。2つの文のタグのみが異なり、一方のみがタグ付けされている場合は、これらの2つの文は異なるものとみなされます。

6. 接続を終了します。

例3-30 接続プーリングを使用する文キャッシュ

次の手順および疑似コードで、接続プールを使用する文キャッシュ機能の実装方法を説明します。

文キャッシュは、setStmtCacheSize()コールの後に作成された接続でのみ使用できます。

文キャッシュは、プール・レベルで使用できない場合でも、プール内の個別の接続で実装できます。

1. EnvironmentオブジェクトのcreateConnectionPool()コールを実行し、ConnectionPoolを作成します。

ConnectionPool *conPool = env->createConnectionPool(
username, password, connecstr,
minConn, maxConn, incrConn);

StatelessConnectionPoolを使用する場合は、かわりにcreateStatelessConnectionPool()をコールします。これ以後の操作は、ConnectionPoolおよびStatelessConnectionPoolオブジェクトと同じです。

Stateless ConnectionPool *conPool = env->createStatelessConnectionPool(
username, password, connecstr,
minConn, maxConn, incrConn, mode);

2. setStmtCacheSize()コールで0（ゼロ）以外のsizeパラメータを使用して、ConnectionPool内のすべてのConnectionで文キャッシュを使用可能にします。

conPool->setStmtCacheSize(10);

この後、getStmtCacheSize()をコールすることにより、キャッシュのサイズが決定されます。また、setStmtCacheSize()コールにより、文キャッシュのサイズが変更され、sizeパラメータを0（ゼロ）に設定すると文キャッシュが使用禁止になります。

3. ConnectionPoolオブジェクトへのcreateConnection()コールにより、プールからConnectionを取得します。キャッシュ内に存在する場合はStatementが戻され、そうでない場合はNULLタグを持つ新しいStatementが作成されます。

Connection *conn = conPool->createConnection(username, password, connecstr);

事前にキャッシュされたタグ付き文を取り出すには、createStatement()メソッドの代替形式を使用します。

Statement *stmt = conn->createStatement(sql, tag);

4. ConnectionオブジェクトへのcreateStatement()コールにより、Statementを作成します。キャッシュ内に存在する場合はStatementは戻され、そうでない場合はNULLタグを持つ新しいStatementが作成されます。

Statement *stmt = conn->createStatement(sql);

事前にキャッシュされたタグ付き文を取り出すには、createStatement()メソッドの代替形式を使用します。

Statement *stmt = conn->createStatement(sql, tag);

5. 文を使用してSQLコマンドを実行し、結果を取得します。

6. 文をキャッシュに戻します。

conn->terminateStatement(stmt, tag);

この文をキャッシュしない場合、disableCaching()コールおよびterminateStatement()の代替形式を使用します。

stmt->disableCaching();
conn->terminateStatement(stmt);

文がキャッシュされているかどうかを検証するには、Connectionオブジェクトに対してisCached()コールを発行します。

7. 接続terminateConnection()を解放します。

conPool->terminateConnection(conn);

例外処理

各OCCIメソッドでは、メソッドが成功しなかった場合、例外を生成できます。この例外は、SQLException型です。OCCIではC++の標準テンプレート・ライブラリ（Standard Template Library: STL）を使用するため、STLで発生した例外はOCCIメソッドでも発生します。

STL例外は、標準の例外クラスから導出されます。exception::what()メソッドは、エラー・テキストへのポインタを戻します。このエラー・テキストは、catchブロック内では有効であることが保証されます。

SQLExceptionクラスには、Oracle固有のエラー番号とメッセージが格納されます。このクラスは、標準の例外クラスから導出されるため、exception::what()メソッドを使用してエラー・テキストを取得することもできます。

また、SQLExceptionクラスには、エラー情報を取得できる2つのメソッドがあります。getErrorCode()メソッドはOracleエラー番号を戻します。exception::what()が戻すエラー・テキストと同じものを、getMessage()メソッドでも取得できます。getMessage()メソッドは、STL文字列を戻すため、他のSTL文字列と同様にコピーできます。

エラー処理の方針に従って、OCCI例外を標準の例外とは別に処理するか、または両者を区別しないで処理するかを選択できます。

OCCI例外と標準の例外を区別しない場合、catchブロックは次のようになります。

catch (exception &excp)
{
cerr << excp.what() << endl;
}

OCCI例外を標準の例外とは別に処理する場合、catchブロックは次のようになります。

catch (SQLException &sqlExcp)
{
cerr <<sqlExcp.getErrorCode << ": " << sqlExcp.getErrorMessage() << endl;
}
catch (exception &excp)
{
cerr << excp.what() << endl;
}

前述のcatchブロックでは、SQL例外が最初のブロックで捕捉され、非SQL例外が2番目のブロックで捕捉されます。この2つのブロックの順序を逆にすると、SQL例外は捕捉されません。SQLExceptionは標準の例外から導出され、標準のexception catchブロックではSQL例外も同様に処理されます。

関連項目

- バッチ更新の際に発生したエラーを処理するための特別な機能の詳細は、第12章「OCCIアプリケーションのパフォーマンスの最適化」の「行変更の反復」の項を参照してください。

- Oracleエラー・メッセージの詳細は、『Oracle Databaseエラー・メッセージ』を参照してください。

NULLおよび切捨てデータの処理

通常、OCCIでは、ResultSetクラスまたはStatementクラスのgetxxx()メソッドで取り出したデータ値がNULLまたは切捨てデータの場合は例外が発生しません。ただし、この動作は、setErrorOnNull()メソッドまたはsetErrorOnTruncate()メソッドをコールして変更できます。setErrorxxx()メソッドにcauseException=TRUEを指定してコールすると、データ値がNULLまたは切捨てデータの場合に、SQLExceptionが呼び出されます。

デフォルトの動作では、SQLExceptionは呼び出されません。列またはパラメータの値がNULLであることもあります。これは、ResultSetまたはStatementオブジェクトに対してisNull()をコールするとTRUEが返されることでわかります。

rs->isNull(columnIndex);
stmt->isNull(paramIndex);

列またはパラメータの値は、切り捨てられている場合も、TRUEとなります。切り捨てられているかどうかは、ResultSetまたはStatementオブジェクトに対してisTruncated()をコールすることで確認できます。

rs->isTruncated(columnIndex);
stmt->isTruncated(paramIndex);

setDataBuffer()メソッドおよびsetDataBufferArray()メソッドを使用して取り出されたデータの場合、例外処理の動作は、表3-1、表3-2および表3-3に示したインジケータ変数とリターン・コード変数の有無によって制御されます。

表3-1 通常データ: 非NULLまたは切捨てなし

リターン・コード

インジケータ: 戻さない場合

インジケータ: 戻す場合

戻さない場合

error = 0

error = 0
indicator = 0

戻す場合

error = 0
return code = 0

error = 0
indicator = 0
return code = 0

表3-2 NULLデータ

リターン・コード

インジケータ: 戻さない場合

インジケータ: 戻す場合

戻さない場合

SQLException
error = 1405

error = 0
indicator = -1

戻す場合

SQLException
error = 1405
return code = 1405

error = 0
indicator = -1
return code = 1405

表3-3 切捨てデータ

リターン・コード

インジケータ: 戻さない場合

インジケータ: 戻す場合

戻さない場合

SQLException
error = 1406

SQLException
error = 1406
indicator = data_len

戻す場合

error = 24345
return code = 1405

error = 24345
indicator = data_len
return code = 1406

表3-3では、data_lenは、長さがSB2MAXVAL以下であった場合に切り捨てられたデータの実際の長さです。この値を超過する場合は、インジケータが-2に設定されます。

4 オブジェクト・プログラミング

この章では、Oracle C++ Call Interface（OCCI）を使用してオブジェクト・リレーショナル・プログラミングを実装する方法を説明します。

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

- オブジェクト・プログラミングの概要

- OCCIでのオブジェクトの操作

- C++アプリケーションでのオブジェクトの表現

- OCCIオブジェクト・アプリケーションの開発

- OCCIによるC++アプリケーションの移行

- 連想アクセスの概要

- ナビゲーショナル・アクセスの概要

- 複合オブジェクト検索の概要

- コレクションの操作

- オブジェクト参照の使用

- データベースからのオブジェクトの削除

- 型の継承

- サンプルOCCIアプリケーション

オブジェクト・プログラミングの概要

OCCIでは、連想スタイルとナビゲーション・スタイルのデータ・アクセスがサポートされています。通常、第三世代言語（3GL）のプログラムでは、リレーショナル・データベース表で編成された関連付けに基づいた連想アクセスを使用して、データベースに格納されたデータを操作します。連想アクセスでは、データはSQL文やPL/SQLプロシージャの実行によって操作されます。OCCIでは、データをクライアントに移送するためのコストをかけずに、アプリケーションがデータベース・サーバーに対してSQL文やPL/SQLプロシージャを実行できるようにして、オブジェクトへの連想アクセスをサポートしています。

OCCIを使用したオブジェクト指向のプログラムでは、このOCCIプログラミング・パラダイムの重要な側面の1つであるナビゲーショナル・アクセスも活用できます。オブジェクト間のオブジェクト関連は参照（REF）として実装されます。通常、ナビゲーショナル・アクセスを使用するオブジェクト・アプリケーションは、最初にオブジェクトへのREFを戻すSQL文を発行して、データベース・サーバーから1つ以上のオブジェクトを取り出します。次に、アプリケーションはこのREFを使用して関連オブジェクトをたどり、必要に応じて、その他の関連オブジェクト上で計算を実行します。ナビゲーショナル・アクセスでは、初期オブジェクト集合の参照をフェッチする以外、SQL文の実行は含まれません。OCCI APIをナビゲーショナル・アクセスで使用すると、アプリケーションはOracleオブジェクトに対して次の操作を実行できます。

- オブジェクトの作成、アクセス、ロック、削除、コピーおよびフラッシュ

- オブジェクトへの参照の取得およびその参照を介したナビゲート

この章では、いくつかの例を示して、永続オブジェクトの作成方法、オブジェクトのアクセス方法と変更方法、および変更内容をデータベース・サーバーにフラッシュする方法を説明します。また、ナビゲーショナル・アクセスおよび連想アクセスの2つのアプローチを使用してオブジェクトにアクセスする方法を説明します。

OCCIでのオブジェクトの操作

リレーショナルOCCIアプリケーションに関するプログラミング原理の多くは、オブジェクト・リレーショナル・アプリケーションにも適用されます。オブジェクト・リレーショナル・アプリケーションでは、標準OCCIコールを使用してデータベース接続を確立し、SQL文を処理します。その違いは、発行されるSQL文によってオブジェクト参照が取り出され、OCCIのオブジェクト関数でその参照を操作できることです。オブジェクトを（そのオブジェクト参照を使用せずに）値として直接操作することもできます。

Oracleの型のインスタンスは、その存続期間によって、永続オブジェクトと一時オブジェクトに分類されます。永続オブジェクトのインスタンスは、オブジェクト識別子によって参照されるかどうかに応じて、さらにスタンドアロン・オブジェクトと埋込みオブジェクトに分割できます。

この項は、次の項目で構成されています。

- 永続オブジェクト

- 一時オブジェクト

- 値

永続オブジェクト

永続オブジェクトとは、Oracleデータベースに格納されているオブジェクトのことです。このオブジェクトは、OCCIアプリケーションによってオブジェクト・キャッシュ内にフェッチし、変更できます。永続オブジェクトは、それにアクセスしているアプリケーションの存続期間を超えて存続できます。永続オブジェクトには、次の2種類があります。

- スタンドアロン・インスタンスはデータベース表の行に格納され、それぞれに一意のオブジェクト識別子があります。OCCIアプリケーションでは、スタンドアロン・オブジェクトへの参照を取り出してオブジェクトを確保し、確保したオブジェクトからその他の関連オブジェクトにナビゲートできます。スタンドアロン・オブジェクトは、参照可能オブジェクトとも呼ばれます。
永続オブジェクトの選択も可能で、その場合はオブジェクトを参照でフェッチするかわりに、値でフェッチします。

- 埋込みインスタンスはデータベース表の行に格納されず、別のオブジェクトの中に埋め込まれます。埋込みオブジェクトの例には、別のオブジェクトの属性であるオブジェクトや、データベースの表のオブジェクト列に存在するオブジェクトなどがあります。埋込みオブジェクトにはオブジェクト識別子がないため、OCCIアプリケーションで埋込みインスタンスへのREFを取得することはできません。
埋込みオブジェクトは、参照不可能オブジェクトまたは値インスタンスとも呼ばれます。埋込みオブジェクトは値と呼ばれることもありますが、それをスカラー・データ値と混同しないでください。どちらの意味であるかは文脈で判断できます。

ユーザーは、参照を介してマテリアライズされた永続オブジェクトを明示的に削除する必要はありません。

ユーザーは、トランザクションがロールバックされたときに、アプリケーションによって作成された永続オブジェクトを削除する必要があります。

例4-1および例4-2のSQLの例では、この2種類の永続オブジェクトの違いを説明します。

例4-1 スタンドアロン・オブジェクトの作成

オブジェクト表person_tabに格納されるオブジェクトは、スタンドアロン・オブジェクトです。このオブジェクトにはオブジェクト識別子があるため、参照できます。したがって、OCCIアプリケーションで確保できます。

CREATE TYPE person_t AS OBJECT
(name      varchar2(30),
age       number(3));
CREATE TABLE person_tab OF person_t;

例4-2 埋込みオブジェクトの作成

department表のmanager列に格納されるオブジェクトは、埋込みオブジェクトです。このオブジェクトにはオブジェクト識別子がないため、参照できません。したがって、OCCIアプリケーションで確保できないため、確保を解除する必要もありません。このオブジェクトは常に、オブジェクト・キャッシュ内に値で取り込まれます。

CREATE TABLE department
(deptno     number,
deptname   varchar2(30),
manager    person_t);

配列確保機能を使用すると、参照のベクターを1回のラウンドトリップで間接参照して、対応するオブジェクトのベクターを戻すことができます。新しいグローバル・メソッドであるpinVectorOfRefs()は、Refのベクターを取得して、PObjectのベクターを1回のラウンドトリップで移入することで、n-1回のラウンドトリップにおけるn-1個の参照の確保にかかるコストを削減します。

一時オブジェクト

一時オブジェクトは、オブジェクト型のインスタンスです。一時オブジェクトは、アプリケーションの存続期間を超えて存続できません。また、一時オブジェクトは常にアプリケーションで削除できます。

オブジェクト型トランスレータ(OTT)ユーティリティは、例4-3「オブジェクト型トランスレータ・ユーティリティにおけるOperator new()の2つのメソッド」に示すように、各C++クラスに対して2つのoperator newメソッドを生成します。

例4-3 オブジェクト型トランスレータ・ユーティリティにおけるOperator new()の2つのメソッド

class Person : public PObject {
...
public:
dvoid *operator new(size_t size);    // creates transient instance
dvoid *operator new(size_t size, Connection &conn, string table);
// creates persistent instance
}

例4-4に、一時オブジェクトの動的な作成方法を示します。一時オブジェクトを永続オブジェクトに変換することはできません。これらの役割はインスタンス化されたときに決定され、一時オブジェクトを削除してメモリーを解放するのはユーザーの役割です。

例4-4 一時オブジェクトの動的な作成方法

Person *p = new Person();

例4-5に示すように、一時オブジェクトはローカル変数としてスタック上に作成することもできます。後者の方法では、変数の有効範囲が終了した際に一時オブジェクトが破棄されることが保証されています。

例4-5 ローカル変数としての一時オブジェクトの作成方法

Person p;

関連項目

- オブジェクトの詳細は、『Oracle Database概要』を参照してください。

値

このマニュアルでは、値は次のいずれかを意味します。

- データベースの表の非オブジェクト列に格納されるスカラー値。OCCIアプリケーションでは、SQL文を発行してデータベースから値をフェッチできます。

- 埋込み（参照不可能）オブジェクト。

どちらを指しているのかは文脈で判断できます。

参照可能オブジェクトは、確保するかわりにSELECTで取得してオブジェクト・キャッシュに格納することが可能です。その場合は、オブジェクトを参照でフェッチするのではなく値でフェッチします。

C++アプリケーションでのオブジェクトの表現

OCCIアプリケーションでオブジェクト型を操作するには、データベースにそのオブジェクト型が存在している必要があります。通常は、CREATE TYPEなど、SQLのDDL文で型を作成します。

この項は、次の項目で構成されています。

- 永続オブジェクトと一時オブジェクトの作成

- OTTユーティリティによるオブジェクト表現の作成

永続オブジェクトと一時オブジェクトの作成

この項では、永続オブジェクトと一時オブジェクトの作成方法について説明します。

永続オブジェクトを作成する前に、環境を作成し、接続をオープンしておく必要があります。

永続オブジェクトは、次のいずれか1つが発生した場合にのみ、データベース内に作成されます。

- トランザクションがコミットされた場合（Connection::commit()）

- オブジェクト・キャッシュがフラッシュされた場合（Connection::flushCache()）

- オブジェクト自体がフラッシュされた場合（PObject::flush()）

例4-6は、データベース表addr_tabに永続オブジェクトaddrを作成する方法を示しています。

例4-6 永続オブジェクトの作成方法

CREATE TYPE ADDRESS AS OBJECT (
state CHAR(2),
zip_code CHAR(5));
CREATE TABLE ADDR_TAB of ADDRESS;
ADDRESS *addr = new(conn, "ADDR_TAB") ADDRESS("CA", "94065");

例4-7は、一時オブジェクトADDRESSのインスタンスの作成方法を示しています。

例4-7 一時オブジェクトの作成方法

ADDRESS *addr_trans = new ADDRESS("MD", "94111");

OTTユーティリティによるオブジェクト表現の作成

C++アプリケーションでデータベースからオブジェクトのインスタンスを取り出す場合は、オブジェクトのクライアント側表現が必要です。オブジェクト型トランスレータ（OTT）ユーティリティでは、データベース・オブジェクト型のC++クラス表現を生成します。例4-8は、データベースでのカスタム型の宣言およびOTTユーティリティで生成される対応するC++クラスを示しています。

例4-8 データベースでのカスタム型の宣言方法

CREATE TYPE address AS OBJECT (state CHAR(2), zip_code CHAR(5));

OTTユーティリティは、次のC++クラスを生成します。

class ADDRESS : public PObject {

protected:
string state;
string zip;

public:
void *operator new(size_t size);
void *operator new(size_t size,
const Connection* conn,
const string& table);
string  getSQLTypeName() const;
void getSQLTypeName(oracle::occi::Environment *env, void **schemaName,
unsigned int &schemaNameLen, void **typeName,
unsigned int &typeNameLen) const;
ADDRESS(void *ctx) : PObject(ctx) { };
static void *readSQL(void *ctx);
virtual void readSQL(AnyData& stream);
static void writeSQL(void *obj, void *ctx);
virtual void writeSQL(AnyData& stream);
}

例4-8のこれらのクラス宣言は、OTTによって、名前を指定するヘッダー・ファイルに自動的に書き込まれます。このヘッダー・ファイルをアプリケーションのソース・ファイルにインクルードすると、オブジェクトにアクセスできます。PObject (およびPObjectから導出されたクラス)のインスタンスは、一時または永続インスタンスです。writeSQL()メソッドおよびreadSQL()メソッドは、オブジェクトのシリアライズのためにOCCIオブジェクト・キャッシュで内部的に使用され、OCCIクライアントでは使用および変更できません。

関連項目
OTTユーティリティの詳細は、第8章「オブジェクト型トランスレータ・ユーティリティ」を参照してください。

OCCIオブジェクト・アプリケーションの開発

この項では、基本的なOCCIオブジェクト・アプリケーションの開発に伴うステップを説明します。

この項は、次の項目で構成されています。

- 基本的なオブジェクト・プログラム構造

- 基本的なオブジェクト操作のフロー

基本的なオブジェクト・プログラム構造

オブジェクトを使用したOCCIアプリケーションの基本構造は、リレーショナルOCCIアプリケーションと類似していますが、オブジェクト機能には違いがあります。OCCIオブジェクト・プログラムに伴うステップは、次のとおりです。

1. Environmentを初期化します。OCCIプログラミング環境をオブジェクト・モードで初期化します。アプリケーションでは、ヘッダー・ファイルからデータベース・オブジェクトのC++クラス表現をインクルードする必要があります。第8章「オブジェクト型トランスレータ・ユーティリティ」で説明しているように、オブジェクト型トランスレータ（OTT）ユーティリティを使用すると、このクラスを作成できます。

2. 接続を確立します。環境ハンドルを使用して、データベース・サーバーとの接続を確立します。

3. SQL文を準備します。これは、ローカル（クライアント側）のステップで、プレースホルダをバインドします。オブジェクト・リレーショナル・アプリケーションの場合、このSQL文はオブジェクトへの参照（REF）を戻します。

4. オブジェクトにアクセスします。

1. 準備した文をデータベース・サーバーに関連付けて実行します。

2. ナビゲーショナル・アクセスを使用して、データベース・サーバーからオブジェクト参照（REF）を取り出し、オブジェクトを確保します。その後、次の一部またはすべての操作を実行できます。

- オブジェクトの属性を操作し、そのオブジェクトに使用済（変更済）のマークを付ける。

- 別の1つのオブジェクト、または一連のオブジェクトへの参照をたどる。

- 型および属性の情報にアクセスする。

- 複合オブジェクト検索グラフをナビゲートする。

- 変更したオブジェクトをデータベース・サーバーにフラッシュする。

3. 連想アクセスを使用すると、SQLによってオブジェクト全体を値でフェッチできます。また、埋込み（参照不可能）オブジェクトを選択することもできます。その後、次の一部またはすべての操作を実行できます。

- 表に値を挿入する。

- 既存の値を変更する。

5. トランザクションをコミットします。このステップでは、変更されたすべてのオブジェクトがデータベース・サーバーに暗黙的に書き込まれ、変更がコミットされます。

6. 文とハンドルを解放します。プリコンパイルされた文を再利用または再実行することはできません。

関連項目

- OCCIによるデータベース・サーバーへの接続、SQL文の処理およびハンドルの割当ての詳細は、第3章「リレーショナル・プログラミング」を参照してください。

- OTTユーティリティの詳細は、第8章「オブジェクト型トランスレータ・ユーティリティ」を参照してください。

- OCCIリレーショナル関数、ConnectクラスおよびgetMetaData()メソッドの説明は、第13章「OCCI Application Program Interface（API）」を参照してください。

基本的なオブジェクト操作のフロー

図3-1は、アプリケーションがオブジェクトを操作する方法について、そのプログラム・ロジックを簡単に示しています。図を簡略にするために、必要なステップの一部が省略されています。

図4-1 基本的なオブジェクト操作のフロー

「図4-1 基本的なオブジェクト操作のフロー」の説明

次の各項では、図3-1の各ステップについて説明します。

オブジェクト・モードでのOCCIの初期化

OCCIアプリケーションでオブジェクトにアクセスして操作する場合は、OCCIアプリケーションの最初のコールであるcreateEnvironment()メソッドのmodeパラメータに、OBJECTの値を指定する必要があります。modeにこの値を指定することで、アプリケーションでオブジェクトを操作することをOCCIに通知します。この通知により、次の重要事項が有効になります。

- オブジェクト・ランタイム環境が確立されます。

- オブジェクト・キャッシュが設定されます。

modeパラメータにOBJECTを設定しないと、オブジェクト関連関数を使用しても結果はエラーになります。

次のコード例は、OCCI環境の作成時にOBJECTモードを指定する方法を示しています。

Environment *env;
Connection *con;
Statement *stmt;

env = Environment::createEnvironment(Environment::OBJECT);
con = Connection(userName, password, connectString);

データベース・オブジェクトがオブジェクト・キャッシュ内にロードされたときに、アプリケーションでメモリーを割り当てる必要はありません。オブジェクト・キャッシュによって、データベース・オブジェクトに対する透過的かつ効率的なメモリー管理が行われます。データベース・オブジェクトはオブジェクト・キャッシュ内にロードされると、ホスト言語（C++）表現に透過的にマップされます。

オブジェクト・キャッシュにより、オブジェクト・キャッシュ内のオブジェクト・コピーと、対応するデータベース・オブジェクトとの間の関連付けが保持されます。commitが実行されると、オブジェクト・キャッシュ内のオブジェクト・コピーに加えた変更が、データベースに対して自動的に伝播されます。

また、オブジェクト・キャッシュでは、参照をオブジェクトにマッピングするための参照表がメンテナンスされます。アプリケーションでオブジェクトへの参照を間接参照したときに、対応するオブジェクトがオブジェクト・キャッシュ内にキャッシュされていない場合は、データベース・サーバーに対してデータベースからオブジェクトをフェッチし、オブジェクト・キャッシュ内にロードするように、要求が自動的に送信されます。その後、同じ参照を間接参照すると、オブジェクト・キャッシュ自体が間接参照の対象となり、データベース・サーバーとのラウンドトリップを伴わないため、処理が速くなります。

同じ参照に関するその後の間接参照は、ラウンドトリップなしに、キャッシュからフェッチされます。ただし、コミット直後に行われた間接参照操作の場合を除きます。この場合は、オブジェクトの最新コピーがサーバーから戻されます。この機能により、各トランザクションの後にデータベースの最新オブジェクトが確実にキャッシュされます。

さらに、オブジェクト・キャッシュでは、オブジェクト・キャッシュ内の各永続オブジェクトに対する確保カウントが保持されます。アプリケーションでオブジェクトへの参照を間接参照すると、オブジェクトの確保カウントが増加します。その後、同じオブジェクトへの参照を間接参照しても、確保カウントは変更されません。オブジェクトは、そのオブジェクトへの参照がスコープ外になるまで、オブジェクト・キャッシュ内に継続して確保され、OCCIクライアントによるアクセスが可能です。

確保カウントは、オブジェクトに対する参照カウントとして機能します。オブジェクトの確保カウントは、そのオブジェクトへの参照がなくなった場合にのみ0（ゼロ）になり、その間このオブジェクトは、ガベージ・コレクションの対象となります。オブジェクト・キャッシュでは、最低使用頻度（LRU）アルゴリズムによって、オブジェクト・キャッシュのサイズが管理されます。このアルゴリズムにより、オブジェクト・キャッシュが最大サイズに達すると、確保カウント0（ゼロ）のオブジェクトは解放されます。

オブジェクトの確保

通常、OCCIユーザーは、オブジェクトの確保や確保解除を明示的に行う必要はありません。オブジェクト・キャッシュによって、キャッシュ内のすべてのオブジェクトの確保カウントが自動的に追跡され、記録されます。前述のとおり、オブジェクト・キャッシュは、参照がオブジェクトを指し示している場合は確保カウントを増やし、参照がスコープ外になったり、オブジェクトを指していない場合は確保カウントを減らします。

ただし、例外が1つあります。OCCIアプリケーションでRef<T>::ptr()メソッドを使用してオブジェクトへのポインタを取得している場合は、PObjectクラスのpinメソッドとunpinメソッドを使用してオブジェクト・キャッシュ内のオブジェクトの確保と確保解除を制御できます。

キャッシュ内のオブジェクトの操作

オブジェクト・キャッシュではオブジェクト・コピーの内容は管理されず、オブジェクト・コピーが自動的にリフレッシュされることもありません。オブジェクト・コピーの妥当性と一貫性は、アプリケーションで確認する必要があります。

オブジェクトへの変更のフラッシュ

オブジェクト・キャッシュ内のオブジェクト・コピーに変更を加えた場合は、必ずアプリケーションで、変更したオブジェクトをデータベースにフラッシュする必要があります。

オブジェクト・キャッシュ用のメモリーは、オブジェクトがオブジェクト・キャッシュ内にロードされるときに、必要に応じて割り当てられます。

クライアント側オブジェクト・キャッシュは、プログラムのプロセス領域に割り当てられます。このオブジェクト・キャッシュは、データベース・サーバーから取り出してアプリケーションで使用できるオブジェクト用のメモリーです。

OCCI環境をオブジェクト・モードで初期化すると、実際にオブジェクト・コールを使用するかどうかに関係なく、オブジェクト・キャッシュ用のメモリーを割り当てることになります。

OCCI環境ごとに、1つのオブジェクト・キャッシュのみが割り当てられます。1つの環境内で異なる接続を通じて取出しまたは作成されたオブジェクトは、すべて同じ物理オブジェクト・キャッシュを使用します。各接続には、それぞれ専用の論理オブジェクト・キャッシュがあります。

オブジェクトの削除

参照を間接参照してキャッシュに取得したオブジェクトに対しては、明示的な削除を実行しないでください。このようなオブジェクトの場合は、最初に参照が間接参照されると確保カウントが増加し、参照がスコープ外になると確保カウントが減少します。オブジェクトの確保カウントが0（ゼロ）になると（そのオブジェクトへのすべての参照がスコープ外であることを示す）、そのオブジェクトは自動的にガベージ・コレクションの対象となり、その後、キャッシュから削除されます。

new演算子をコールして作成された永続オブジェクトについては、トランザクションをコミットしない場合は、deleteをコールする必要があります。コミットする場合、オブジェクトはコミット後にガベージ・コレクションの対象となります。これは、newを使用してこのようなオブジェクトが作成された場合、確保カウントは0（ゼロ）から始まるためです。ただし、オブジェクトは使用済であるため、キャッシュ内に残ります。コミット後は使用済でなくなるため、ガベージ・コレクションの対象となります。したがって、削除の必要はありません。

コミットが実行されない場合は、deleteを明示的にコールして、そのオブジェクトを破棄する必要があります。この操作は、そのオブジェクトへの参照がない場合に実行できます。一時オブジェクトの場合は、明示的に削除して、そのオブジェクトを破棄する必要があります。

永続オブジェクトに対してdelete演算子をコールすることはできません。マーク済または使用済ではない永続オブジェクトは、確保カウントが0（ゼロ）になると、ガベージ・コレクタによって解放されます。ただし、一時オブジェクトの場合は、明示的に削除して、破棄する必要があります。

OCCIによるC++アプリケーションの移行

この項では、OCCIを使用して既存のC++アプリケーションを移行する方法について説明します。

移行の手順は次のとおりです。

1. オブジェクト・モデルおよびクラス階層の決定

2. JDeveloper9iによるOracleオブジェクト・スキーマへのマップ

3. Oracle Type TranslatorによるC++ヘッダー・ファイルの生成

4. 新しいオブジェクト型定義の操作に必要な古いC++アクセス・クラスの変更

5. 一時オブジェクトおよび永続オブジェクトを管理する機能の追加（必要な場合）

連想アクセスの概要

OCCIでは、SQLを使用してオブジェクトを取り出し、DML操作を実行できます。

この項は、次の項目で構成されています。

- SQLによるオブジェクトへのアクセス

- 値の挿入と変更

関連項目
デモ・プログラムの完全なコード・リスト

SQLによるオブジェクトへのアクセス

前項では、ナビゲーショナル・アクセスについて説明し、初期オブジェクト集合の参照をフェッチするためにのみSQLを使用しました。ここでは、SQLを使用してオブジェクトをフェッチする方法を説明します。

次の例は、ResultSet::getObject()メソッドを使用して連想アクセスでオブジェクトをフェッチし、その際に、SQLを使用してaddr_tab表から各オブジェクトを取得する方法を示しています。

string sel_addr_val = "SELECT VALUE(address) FROM ADDR_TAB address";

ResultSet *rs = stmt->executeQuery(sel_addr_val);

while (rs->next())
{
ADDRESS *addr_val = rs->getObject(1);
cout << "state: " << addr_val->getState();
}

連想アクセスでフェッチされたオブジェクトは期限付きの値インスタンスで、一時オブジェクトと同様に振る舞います。markModified()、flush()、markDeleted()などのメソッドは、永続オブジェクトにのみ適用できます。

これらのオブジェクトに加えた変更は、データベースに反映されません。

戻されるオブジェクトは値インスタンスであるため、オブジェクト・ポインタを削除してメモリーを解放するのは、ユーザーの役割です。

値の挿入と変更

前項では、SQLを使用してオブジェクトにアクセスする方法を説明しました。OCCIでは、SQLを使用して、Statement::setObjectメソッド・インタフェースを通じてデータベース・サーバー内に新規オブジェクトを挿入したり、データベース・サーバー内の既存オブジェクトを変更することもできます。

次の例では、一時オブジェクトAddressを作成し、そのオブジェクトをデータベース表addr_tabに挿入しています。

ADDRESS *addr_val = new address("NV", "12563");  // new a transient instance
stmt->setSQL("INSERT INTO ADDR_TAB values(:1)");
stmt->setObject(1, addr_val);
stmt->execute();

ナビゲーショナル・アクセスの概要

ナビゲーショナル・アクセスを使用して、次の一連の操作を実行します。

この項は、次の項目で構成されています。

- データベース・サーバーからのオブジェクト参照（REF）の取出し

- オブジェクトの確保

- オブジェクト属性の操作

- オブジェクトのマークおよび変更のフラッシュ

- オブジェクトへの変更済（使用済）のマーク付け

- データベースへの変更の記録

- オブジェクト・キャッシュでのガベージ・コレクション

- 参照のトランザクション一貫性の確保

関連項目
デモ・プログラムの完全なコード・リスト

データベース・サーバーからのオブジェクト参照（REF）の取出し

アプリケーションでオブジェクトを操作するには、最初にデータベース・サーバーから1つ以上のオブジェクトを取り出す必要があります。取出しは、1つ以上のオブジェクトへの参照（REF）を戻すSQL文を発行して行います。

SQL文によって、データベースからREFではなく値インスタンスをフェッチすることもできます。

次のSQL文では、1つのオブジェクトaddressへのREFをデータベース表addr_tabから取り出しています。

string sel_addr = "SELECT REF(address)
FROM addr_tab address
WHERE zip_code = '94065'";

次のコード例は、問合せを実行し、結果セットからREFをフェッチする方法を示しています。

ResultSet *rs = stmt->executeQuery(sel_addr);
rs->next();
Ref<address> addr_ref = rs->getRef(1);

この時点で、オブジェクト参照を使用して、オブジェクトまたはデータベースからのオブジェクトにアクセスして操作できます。

関連項目
SQL文の準備および実行の一般情報は、「SQLのDDL文とDML文の実行」を参照してください。

オブジェクトの確保

この項では、1度に1つのオブジェクトを確保する単純な操作の例を示します。複合オブジェクト検索を介した複数のオブジェクトの取出しの詳細は、「複合オブジェクト検索の概要」を参照してください。

フェッチを行うステップが完了すると、アプリケーションでは、オブジェクトへのREFを取得します。この時点では、まだ実際のオブジェクトは操作できません。オブジェクトを操作する前にオブジェクトを確保する必要があります。オブジェクトの確保によって、オブジェクトをオブジェクト・キャッシュ内にロードした後、オブジェクトの属性へのアクセスおよび変更、また1つのオブジェクトからその他のオブジェクトへの参照追跡が可能になります。アプリケーションでは、変更したオブジェクトをデータベース・サーバーに書き込む時期を制御することもできます。

OCCIでは、C++ポインタを間接参照するのと同じ方法でREFの間接参照のみが必要となります。REFを間接参照すると、オブジェクトはC++クラス・インスタンスとして透過的にマテリアライズされます。

前項のAddressクラスの例に続けて、ユーザーが次のメソッドを追加したとします。

string  Address::getState()
{
return state;
}

このREFを間接参照し、オブジェクトの属性およびメソッドにアクセスするには、次のように記述します。

string state = addr_ref->getState();     // -> pins the object

最初にRef<T> (addr_ref)が間接参照されたときに、オブジェクトが確保されます（つまり、オブジェクトがデータベース・サーバーからオブジェクト・キャッシュ内にロードされます）。オブジェクトが確保された後は、Ref<T>の演算子 ->の動作は、C++ポインタ(T *)と同じ動作になります。オブジェクトは、REF (addr_ref)がスコープ外となるまでオブジェクト・キャッシュ内に残留します。その後、ガベージ・コレクションの対象となります。

これでオブジェクトが確保され、アプリケーションでそのオブジェクトを変更できます。

オブジェクト属性の操作

オブジェクト属性の操作は、前項で示したようにオブジェクトにアクセスして行います。Addressクラスに、state属性を入力値に設定する次のユーザー定義メソッドがあるとします。

void Address::setState(string new_state)
{
state = new_state;
}

次の例は、オブジェクトaddrのstate属性を変更する方法を示しています。

addr_ref->setState("PA");

前述のとおり、オブジェクトがオブジェクト・キャッシュ内にない場合は、Ref<T>の演算子 ->の最初の呼出しで、オブジェクトがロードされます。

オブジェクトのマークおよび変更のフラッシュ

前項の例では、オブジェクトの属性を変更しました。この変更は、クライアント側キャッシュにのみ存在します。特定のプログラム手順を実装して、データベースに変更を書き込む必要があります。

オブジェクトへの変更済(使用済)のマーク付け

最初のステップでは、オブジェクトが変更されたことを示します。これは、オブジェクトに対してmarkModified()メソッド（PObjectの導出メソッド）をコールして行います。このメソッドは、オブジェクトに使用済（変更済）のマークを付けます。

前の例に続いて、オブジェクト属性の操作後、次のようにaddr_refが参照するオブジェクトに使用済のマークを付けます。

addr_ref->markModified();

データベースへの変更の記録

使用済フラグが設定されているオブジェクトは、変更をデータベースに記録するために、データベース・サーバーにフラッシュする必要があります。これは、次の3つの方法で実行できます。

- 使用済とマークされた1つのオブジェクトをフラッシュするには、PObjectの導出メソッドであるflushメソッドをコールします。

- オブジェクト・キャッシュ全体をフラッシュするには、Connection::flushCache()メソッドを使用します。この場合、OCCIはオブジェクト・キャッシュによって保持されている使用済リストを横断して、使用済オブジェクトをすべてフラッシュします。

- トランザクションをコミットするには、Connection::commit()メソッドをコールします。この場合も、OCCIは使用済リストを横断して、オブジェクトをデータベース・サーバーにフラッシュします。この使用済リストには、新しく作成された永続オブジェクトが含まれています。

オブジェクト・キャッシュでのガベージ・コレクション

オブジェクト・キャッシュには、次の2つの重要な関連パラメータがあります。

- 最大キャッシュ・サイズ率

- 最適キャッシュ・サイズ

これらのパラメータは、キャッシュ・メモリー使用量のレベルを参照し、対象のオブジェクトをキャッシュで自動的にエージ・アウトしてメモリーを解放する時期を判断するのに役立ちます。

現在キャッシュ内にあるオブジェクトによるメモリー使用量が最大キャッシュ・サイズに達するかそれを超えると、キャッシュでは、確保カウントが0（ゼロ）のマークされていないオブジェクトの解放（またはエージ・アウト）が自動的に開始されます。キャッシュでは、キャッシュ内のメモリー使用量が最適なサイズに達するまで、または解放の対象となるオブジェクトがなくなるまで、オブジェクトの解放を継続します。キャッシュは、指定の最大キャッシュ・サイズより大きくなる場合があります。

オブジェクトの最大キャッシュ・サイズ（バイト単位）は、次に示すように、最適キャッシュ・サイズ（optimal_size）に最大キャッシュ・サイズ率（max_size_percentage）を増分して計算されます。

Maximum cache size = optimal_size + optimal_size * max_size_percentage / 100;

最大キャッシュ・サイズ率のデフォルト値は10%です。最適キャッシュ・サイズのデフォルト値は8MBです。オーバーロードされたPObject::new()演算子を使用して永続オブジェクトが作成されている場合、新しく作成されたオブジェクトは使用済としてマークされ、その確保カウントは0（ゼロ）になります。

これらのパラメータは、Environmentクラスの次のメンバー関数を使用して設定または取得できます。

- void setCacheMaxSize(unsigned int maxSize);

- unsigned int getCacheMaxSize() const;

- void setCacheOptSize(unsigned int OptSize);

- unsigned int getCacheOptSize() const;

オブジェクトの確保カウントがどのように参照カウントとして機能するか、および確保カウントが0（ゼロ）の、マークされていないオブジェクトがどのようにガベージ・コレクションの対象となるかについては、「オブジェクトの確保」で説明しています。新しく作成された永続オブジェクトの場合は、トランザクションのコミット後または異常終了後、およびオブジェクトの確保カウントが0 (ゼロ)の場合に、オブジェクトのマークが解除されます。このオブジェクトを参照しているものはないため、エージ・アウトの候補になります。

多数の文字列またはコレクション属性を持つ複数のオブジェクトを操作している場合、メモリーのほとんどはC++ヒープから割り当てられます。これは、OCCIがSTLを使用するためです。したがって、キャッシュ・サイズを小さい値に設定して、ガベージ・コレクションがアクティブになる前に多くのメモリーが使用されるのを回避する必要があります。

関連項目
詳細は、第13章「OCCI Application Program Interface（API）」を参照してください。

参照のトランザクション一貫性の確保

前の項で説明したとおり、最初にRef<T>を間接参照すると、オブジェクトはデータベース・サーバーからオブジェクト・キャッシュにロードされます。それ以降は、Ref<T>の演算子->の動作はC++ポインタの動作と同じになり、キャッシュ内のオブジェクト・コピーへのアクセスを提供します。ただし、トランザクションがコミットまたは異常終了すると、キャッシュ内のオブジェクト・コピーは無効になります。これは、他のクライアントによってその内容が変更されている可能性があるためです。したがって、トランザクションの終了後にRef<T>を再度間接参照すると、オブジェクト・キャッシュでは、オブジェクトがすでに無効であることが認識され、最新のコピーがデータベース・サーバーからフェッチされます。

複合オブジェクト検索の概要

ここまでの説明では、1度に1つのオブジェクトのみフェッチまたは確保する例を示しました。その場合、オブジェクトを取り出すためのデータベース・サーバー・ラウンドトリップが、確保操作ごとに別個に発生します。

オブジェクト指向アプリケーションでは、相互に関連したオブジェクトの集合として問題をモデル化することがよくあります。これらのオブジェクトは、オブジェクトのグラフを形成します。アプリケーションでは、初期オブジェクト集合の一部からオブジェクトの処理を開始し、その一部のオブジェクトの参照を使用して残りのオブジェクトを横断します。クライアント/サーバー設定では、横断のたびにオブジェクトをフェッチするためのネットワーク・ラウンドトリップが発生し、非効率的です。

このようなアプリケーションでは、複合オブジェクト検索(COR)を使用してパフォーマンスを向上できます。CORはプリフェッチ・メカニズムです。アプリケーションでは、このメカニズムを使用して、リンクされた一連のオブジェクトを1回のネットワーク・ラウンドトリップで取り出すための基準（内容と境界）を指定します。CORでは、プリフェッチされたオブジェクトを確保しません。オブジェクトはオブジェクト・キャッシュ内にフェッチされるため、後続の確保コールはローカル操作で行われます。

複合オブジェクトは、論理的に関連したオブジェクトの集合です。ルート・オブジェクトと、指定のネスト・レベルに基づいてそれぞれプリフェッチされる一連のオブジェクトで構成されています。ルート・オブジェクトは、明示的にフェッチまたは確保されます。ネスト ・レベルは、複合オブジェクトのルート・オブジェクトから指定のプリフェッチ・オブジェクトまでを最短で横断した場合の参照の数です。

アプリケーションで複合オブジェクトを指定するには、複合オブジェクトの内容と境界を記述します。複合オブジェクトのフェッチは、環境のプリフェッチ制限、およびオブジェクト・キャッシュ内で使用可能なメモリーの量によって制約されます。

複合オブジェクト検索を使用するとパフォーマンスのみが改善され、機能性は追加されません。したがって、使用しないことも可能です。

この項は、次の項目で構成されています。

- 複合オブジェクト検索

- 複合オブジェクトのプリフェッチ

関連項目
デモ・プログラムの完全なコード・リスト

複合オブジェクト検索

OCCIアプリケーションでCORを実行するには、適切な属性をRef<T>に設定した後、次のメソッドを使用して間接参照します。

// prefetch attributes of the specified type name up to the specified depth
Ref<T>::setPrefetch(const string &typeName, unsigned int depth);
// prefetch all the attribute types up to the specified depth.
Ref<T>::setPrefetch(unsigned int depth);

アプリケーションでは、REFを通して特定の深さまで到達できる（推移閉包）オブジェクトすべてをフェッチすることも選択できます。そのためには、目的の深さをレベル・パラメータとして設定する必要があります。前述の2つの例では、アプリケーションで(PO object REF, OCCI_MAX_PREFETCH_DEPTH)と(PO object REF, 1)をそれぞれ指定して、必要なオブジェクトをプリフェッチすることもできます。この場合は多数の余分なフェッチが発生しますが、指定が簡単であり、データベース・サーバー・ラウンドトリップが1回のみで済みます。

この説明の例として、次の型宣言があるとします。

CREATE TYPE customer(...);
CREATE TYPE line_item(...);
CREATE TYPE line_item_varray as VARRAY(100) of REF line_item;
CREATE TYPE purchase_order AS OBJECT
( po_number         NUMBER,
cust              REF customer,
related_orders    REF purchase_order,
line_items        line_item_varray);

purchase_order型には、スカラー値po_number、line_itemsのVARRAYおよび2つの参照が含まれます。1つはcustomer型への参照、もう1つはpurchase_order型への参照であり、この型がリンク済リストとして実装されることを示しています。

複合オブジェクトをフェッチする場合は、アプリケーションで次の指定を行う必要があります。

- 目的のルート・オブジェクトへの参照。

- 複合オブジェクトの境界を指定するための1組以上の型および深さ情報。型情報はCORでたどるREF属性を指示し、ネスト・レベルはリンクをたどるレベル数を指示します。

前述のpurchase_orderオブジェクトの場合は、アプリケーションで次の指定を行う必要があります。

- ルートpurchase_orderオブジェクトへの参照。

- customer、purchase_orderまたはline_itemについての1組以上の型および深さ情報。

発注情報をプリフェッチするアプリケーションでは、発注書を発行した顧客の情報にアクセスする必要があります。単純なナビゲーションでは、2つのオブジェクトを取り出すためにデータベース・サーバーに2回アクセスする必要があります。

複合オブジェクト検索を使用すると、purchase_orderオブジェクトを確保するときにcustomerをプリフェッチできます。この場合、複合オブジェクトは、purchase_orderオブジェクトと参照するcustomerオブジェクトで構成されます。

前述の例で、発注情報と関連する顧客情報をプリフェッチする必要がある場合は、次に示すように、アプリケーションでpurchase_orderオブジェクトを指定し、customerはネスト・レベル1までたどるように指示します。

Ref<PURCHASE_ORDER> poref;
poref.setPrefetch("CUSTOMER",1);

発注情報と、発注情報に含まれているオブジェクト・グラフにあるすべてのオブジェクトをプリフェッチする必要がある場合は、次に示すように、アプリケーションでpurchase_orderオブジェクトを指定し、customerおよびpurchase_orderについては、両方とも最大のネスト・レベルまでたどるように指示します。

Ref<PURCHASE_ORDER> poref;
poref.setPrefetch("CUSTOMER", OCCI_MAX_PREFETCH_DEPTH);
poref.setPrefetch("PURCHASE_ORDER", OCCI_MAX_PREFETCH_DEPTH);

OCCI_MAX_PREFETCH_DEPTHは、ルート・オブジェクトから参照を通して到達できる指定の型のオブジェクトすべてのプリフェッチを指定します。

発注情報と発注情報に関連付けられた明細項目すべてをプリフェッチする必要がある場合は、次に示すように、アプリケーションでpurchase_orderオブジェクトを指定し、line_itemsは最大のネスト・レベルまでたどるように指示します。

Ref<PURCHASE_ORDER> poref;
poref.setPrefetch("LINE_ITEM", 1);

複合オブジェクトのプリフェッチ

複合オブジェクトを指定してフェッチした後に行う、複合オブジェクトに含まれるオブジェクトのフェッチでは、ネットワーク・ラウンドトリップは発生しません。これは、オブジェクトがプリフェッチ済であり、オブジェクト・キャッシュ内にあるためです。プリフェッチするオブジェクトが多すぎると、オブジェクト・キャッシュがあふれることがあるので注意が必要です。オブジェクト・キャッシュがあふれると、アプリケーションが確保している他のオブジェクトがキャッシュから押し出され、パフォーマンスの向上ではなく逆にパフォーマンスの低下につながることがあります。

プリフェッチ済のオブジェクトをすべて保持できるメモリーがオブジェクト・キャッシュにない場合は、オブジェクトの一部がプリフェッチされないことがあります。アプリケーションでは、後でそれらのオブジェクトにアクセスするときに、ネットワーク・ラウンドトリップが発生します。

すべてのプリフェッチ・オブジェクトに対して、SELECT権限が必要です。複合オブジェクト内のオブジェクトに対するSELECT権限がアプリケーションにない場合、そのオブジェクトはフェッチできません。

ConnectionクラスのグローバルなpinVectorOfRefs()メソッドを使用すると、1回のラウンドトリップでRefのベクター全体をオブジェクト・キャッシュにプリフェッチできます。このメソッドは、Refのnサイズのベクターのラウンドトリップの回数をnから1に減らし、OUTパラメータ・ベクターを介して新しく確保されたオブジェクトを追跡します。

コレクションの操作

Oracleでは、可変長配列（順序付けられたコレクション）とネストした表（順序付けられていないコレクション）の2種類のコレクションをサポートしています。OCCIでは、この2種類のコレクションはいずれも標準テンプレート・ライブラリ（Standard Template Library: STL）のベクター・コンテナにマップされるため、強力、柔軟かつ高速なSTLベクターによるコレクション要素へのアクセスと操作が可能になります。例4-9は、VARRAYおよびVARRAY型の属性が含まれたオブジェクトを作成するSQLのDDL文と、結果としてOTTで生成されるC++宣言を示しています。

例4-9 VARRAYコレクションの作成方法

CREATE TYPE ADDR_LIST AS VARRAY(3) OF REF ADDRESS;
CREATE TYPE PERSON AS OBJECT (name VARCHAR2(20), addr_l ADDR_LIST);

次に示すのは、OTTによって生成されたC++クラス宣言です。

class PERSON : public PObject
{
protected:
string name;
vector< Ref< ADDRESS > > addr_1;

public:
void *operator new(size_t size);
void *operator new(size_t size,
const Connection* conn,
const string& table);
string  getSQLTypeName() const;
void getSQLTypeName(oracle::occi::Environment *env, void **schemaName,
unsigned int &schemaNameLen, void **typeName,
unsigned int &typeNameLen) const;
PERSON (void *ctx) : PObject(ctx) { };
static void *readSQL(void *ctx);
virtual void readSQL(AnyData& stream);
static void writeSQL(void *obj, void *ctx);
virtual void writeSQL(AnyData& stream);
}

関連項目
デモ・プログラムの完全なコード・リスト

埋込みオブジェクトのフェッチ

使用しているアプリケーションで、埋込みオブジェクト・インスタンス(オブジェクト表でなく、通常の表の列に格納されているオブジェクト)をフェッチする必要がある場合、REF検索機能は使用できません。埋込みインスタンスにはオブジェクト識別子がないため、埋込みインスタンスへの参照は取得できません。したがって、埋込みインスタンスはオブジェクト・ナビゲーションの基礎として機能しません。しかし、アプリケーションで埋込みインスタンスをフェッチする状況は数多くあります。

たとえば、address型が作成されたとします。

CREATE TYPE address AS OBJECT
(  street1             varchar2(50),
street2             varchar2(50),
city                varchar2(30),
state               char(2),
zip                 number(5));

その型は、他の表で列のデータ型として使用できます。

CREATE TABLE clients
( name          varchar2(40),
addr          address);

OCCIアプリケーションで次のSQL文を発行します。

SELECT addr FROM clients
WHERE name='BEAR BYTE DATA MANAGEMENT';

この文は、clients表の埋込みオブジェクトaddressを戻します。アプリケーションでは、このオブジェクトの属性値を別の処理で使用できます。「連想アクセスの概要」の項で説明したように、アプリケーションで文を実行してオブジェクトをフェッチする必要があります。

NULL

データベース表で、行の中に値のない列がある場合、その列はNULLである、またはNULLを含む、と呼ばれます。オブジェクトには、次の2種類のNULLを適用できます。

- オブジェクトの属性はすべて、NULL値を持つことができます。これはオブジェクトの属性の値が不明であることを意味します。

- オブジェクトは、アトミックNULLにできます。したがって、オブジェクト全体の値は不明です。

アトミックNULLは、オブジェクトが存在しないということとは異なります。アトミックNULLのオブジェクトは値が不明なだけで、存在しています。つまり、データを持たないオブジェクトとみなすことができます。

OCCIでは、オブジェクト属性のすべての型について、それぞれ対応するクラスが用意されています。たとえば、NUMBER属性型はNumberクラスにマップされ、REFはRefAnyにマップされます。データ型を表す各OCCIクラスでは、次の2つのメソッドを使用できます。

- isNull(): オブジェクトがNULLかどうかを戻します。

- setNull(): オブジェクトをNULLに設定します。

同様に、これらのメソッドは、PObjectクラスからすべてのオブジェクトに継承され、オブジェクトのNULL情報のアクセスと自動設定を行うために使用されます。

オブジェクト参照の使用

アプリケーションでは、OCCIのポインタや参照を使用して、オブジェクトの内容に柔軟にアクセスできます。OCCIでは、PObject::getRef()メソッドを使用して永続オブジェクトへの参照を戻すことができます。このコールは、永続オブジェクトに対してのみ有効です。

データベースからのオブジェクトの削除

OCCIユーザーは、オーバーロードされたPObject::operator new()を使用して永続オブジェクトを作成できます。ただし、データベース・サーバーからオブジェクトを削除するには、Refでref.markDelete()を直接コールします。これにより、オブジェクトがクライアント・キャッシュに入るのを回避できます。オブジェクトがクライアント・キャッシュ内にある場合は、オブジェクトでobj.markDelete()をコールすることでオブジェクトを削除できます。トランザクションがコミットされると、削除マークが設定されたオブジェクトは永続的に削除されます。

型の継承

オブジェクトの型の継承は、C++やJavaでの継承に類似している点が多くあります。オブジェクト型は、既存のオブジェクト型のサブタイプとして作成できます。サブタイプは、元の型であるスーパータイプの属性およびメソッド（メンバー関数およびプロシージャ）をすべて継承するといえます。単一の継承のみがサポートされます。つまり、1つのオブジェクトが複数のスーパータイプを所有することはできません。継承した属性やメソッドには、新しい属性やメソッドを追加できます。継承した任意のメソッドをオーバーライド（実装を再定義）することもできます。サブタイプは、そのスーパータイプの拡張（つまり、スーパータイプの継承）といえます。

関連項目
この項目の詳細は、『Oracle Databaseオブジェクト・リレーショナル開発者ガイド』を参照してください。

たとえば、Person_t型は、サブタイプStudent_tとサブタイプEmployee_tを所有できます。また、Student_tも独自のサブタイプPartTimeStudent_tを所有できます。サブタイプを所有するには、型宣言にフラグNOT FINALが必要です。デフォルトのフラグはFINALで、この型はサブタイプを所有できないことを意味します。

この章でこれまでに説明した型は、すべてFINALです。Oracle Databaseリリース8.1.7以前に開発されたアプリケーションの型は、すべてFINALです。FINALの型は、NOT FINALに変更できます。サブタイプを持たないNOT FINAL型は、FINALに変更できます。次の例では、Person_tがNOT FINALとして宣言されています。

CREATE TYPE Person_t AS OBJECT
(  ssn NUMBER,
name VARCAHR2(30),
address VARCHAR2(100)) NOT FINAL;

サブタイプは、スーパータイプで宣言された属性とメソッドをすべて継承します。また、新しい属性やメソッドを宣言することもできます。その場合は、スーパータイプとは異なる名前を指定する必要があります。キーワードUNDERによって、次のようにスーパータイプを識別します。

CREATE TYPE Student_t UNDER Person_t
(  deptid NUMBER,
major  VARCHAR2(30)) NOT FINAL;

新しく宣言した属性deptidおよびmajorは、サブタイプStudent_tに所属しています。たとえば、サブタイプEmployee_tを次のように宣言します。

CREATE TYPE Employee_t UNDER Person_t
(  empid NUMBER,
mgr   VARCHAR2(30));

関連項目

- このコード例に関してOTTが生成するクラスの詳細は、「OTTでの型の継承のサポート」を参照してください。

サブタイプStudent_tは、PartTimeStudent_tなどの独自のサブタイプを所有できます。

CREATE TYPE PartTimeStuden_t UNDER Student_t ( numhours NUMBER) ;

代用性

ポリモフィズムの利点の一部は、プロパティが持つ代用性によるものです。代用性によって、サブタイプの値をスーパータイプ用に記述された元のコードで使用できます。この場合、サブタイプに関する事前の知識は特に必要ありません。サブタイプの値は、メソッドが特化されて異なるメカニズムが使用されている場合でも、周辺のコードに対応してスーパータイプの値と同じように振る舞います。

インスタンスの代用性とは、サブタイプのオブジェクト値をスーパータイプで宣言されたコンテキスト内で使用できるようにする機能を指します。REFの代用性とは、サブタイプへのREFをスーパータイプへのREFで宣言されたコンテキスト内で使用できるようにする機能を指します。

REF型の属性は代用可能です。つまり、REF Tとして定義された属性は、Tのインスタンスまたはそのサブタイプの任意のインスタンスへのREFを保持できます。

オブジェクト型の属性は代用可能です。つまり、T（オブジェクト）型として定義された属性は、Tのインスタンスまたはそのサブタイプの任意のインスタンスを保持できます。

コレクション要素の型は代用可能です。つまり、T型の要素を持つコレクションを定義した場合、そのコレクションは、T型のインスタンスとそのサブタイプの任意のインスタンスを保持できます。オブジェクト属性の代用性の例を次に示します。

CREATE TYPE Book_t AS OBJECT
(  title VARCHAR2(30),
author Person_t     /* substitutable */);

したがって、Book_tインスタンスは、次のように、タイトル文字列およびPerson_t（またはPerson_tの任意のサブタイプ）オブジェクトを指定することによって作成できます。

Book_t('My Oracle Experience',
Employee_t(12345, 'Joe', 'SF', 1111, NULL))

NOT INSTANTIABLEの型とメソッド

型はNOT INSTANTIABLEとして宣言できます。これは、その型に（デフォルトまたはユーザー定義の）コンストラクタがないことを意味します。したがって、この型のインスタンスは構築できません。通常、このような型は、インスタンス化可能なサブタイプの定義に使用されます。このプロパティの使用方法を次に示します。

CREATE TYPE Address_t AS OBJECT(...) NOT INSTANTIABLE NOT FINAL;
CREATE TYPE USAddress_t UNDER Address_t(...);
CREATE TYPE IntlAddress_t UNDER Address_t(...);

型のメソッドは、NOT INSTANTIABLEとして宣言できます。メソッドをNOT INSTANTIABLEとして宣言することは、型がそのメソッドを実装しないことを意味します。また、NOT INSTANTIABLEメソッドが含まれている型は、必ずNOT INSTANTIABLEとして宣言する必要があります。たとえば、次のようにします。

CREATE TYPE T AS OBJECT
(  x NUMBER,
NOT INSTANTIABLE MEMBER FUNCTION func1() RETURN NUMBER
) NOT INSTANTIABLE;

NOT INSTANTIABLE型のサブタイプは、スーパータイプの任意のNOT INSTANTIABLEメソッドをオーバーライドして、具体的な実装を行うことができます。NOT INSTANTIABLEメソッドが残っている場合、サブタイプも必ずNOT INSTANTIABLEとして宣言する必要があります。

NOT INSTANTIABLEサブタイプは、インスタンス化可能なスーパータイプの下に定義できます。NOT INSTANTIABLE型をFINALとして宣言することは無効なため、使用できません。

OCCIでの型の継承のサポート

次のコールは、型の継承をサポートしています。

Connection::getMetaData()

このメソッドによって、継承された型に固有の情報が提供されます。継承された型のプロパティには、その他の属性が追加されています。たとえば、型のスーパータイプを取得できます。

バインド関数および定義関数

StatementクラスのsetRef()、setObject()およびsetVector()メソッドは、REF、オブジェクトおよびコレクションをそれぞれバインドするために使用します。これらの関数はすべて、REF、インスタンスおよびコレクション要素の代用性をサポートしています。同様に、データをフェッチするための対応するgetxxx()メソッドも代用性をサポートしています。

OTTでの型の継承のサポート

継承によるオブジェクトのクラス宣言は、そのクラスが親の型クラスから導出され、親のクラスにない属性に対応するフィールドのみが含まれていることを除くと、単純なオブジェクト宣言と似ています。この宣言の構造を例4-10に示します。

例4-10 OTTでの継承サポート

class <typename> : public <parentTypename>
{
protected:
<OCCItype1> <attributename1>;
...
<OCCItypen> <attributenamen>;

public:
void *operator new(size_t size);
void *operator new(size_t size, const Connection* conn,
const string& table);
string  getSQLTypeName() const;
void getSQLTypeName(oracle::occi::Environment *env, void **schemaName,
unsigned int &schemaNameLen, void **typeName,
unsigned int &typeNameLen) const;
<typename> (void *ctx) : <parentTypename>(ctx) { };
static void *readSQL(void *ctx);
virtual void readSQL(AnyData& stream);
static void writeSQL(void *obj, void *ctx);
virtual void writeSQL(AnyData& stream);
}

この構造では、変数はすべて単純なオブジェクトの場合と同じです。parentTypenameは親の型の名前、つまり、その型名が継承している型のクラス名です。

サンプルOCCIアプリケーション

この項では、この章で説明した機能の一部を使用したサンプルOCCIアプリケーションを示します。

例4-11 サンプルOCCIアプリケーションのdemo2.sqlのリスト

drop table ADDR_TAB
/
drop table PERSON_TAB
/
drop type STUDENT
/
drop type PERSON
/
drop type ADDRESS_TAB
/
drop type ADDRESS
/
drop type FULLNAME
/
CREATE TYPE FULLNAME AS OBJECT (first_name CHAR(20), last_name CHAR(20))
/
CREATE TYPE ADDRESS AS OBJECT (state CHAR(20), zip CHAR(20))
/
CREATE TYPE ADDRESS_TAB  AS VARRAY(3) OF REF ADDRESS
/
CREATE TYPE PERSON AS OBJECT (id NUMBER, name FULLNAME,curr_addr REF ADDRESS,
prev_addr_l ADDRESS_TAB) NOT FINAL
/
CREATE TYPE STUDENT UNDER  PERSON (school_name CHAR(20))
/
CREATE TABLE ADDR_TAB OF ADDRESS
/
CREATE TABLE PERSON_TAB OF PERSON
/

例4-12 サンプルOCCIアプリケーションのdemo2.typのリスト

TYPE FULLNAME GENERATE CFullName as MyFullName
TYPE ADDRESS GENERATE CAddress as MyAddress
TYPE PERSON GENERATE CPerson as MyPerson
TYPE STUDENT GENERATE CStudent as MyStudent

例4-13 サンプルOCCIアプリケーションのファイルを生成するOTTコマンドのリスト

OTTはユーザー名demousrを使用して接続を試行します。システムではパスワードが要求されます。

ott userid=demousr intype=demo2.typ code=cpp hfile=demo2.h
cppfile=demo2.cpp mapfile=mappings.cpp attraccess=private

例4-14 サンプルOCCIアプリケーションのmappings.hのリスト

#ifndef MAPPINGS_ORACLE
# define MAPPINGS_ORACLE

#ifndef OCCI_ORACLE
# include <occi.h>
#endif

#ifndef DEMO2_ORACLE
# include "demo2.h"
#endif

void mappings(oracle::occi::Environment* envOCCI_);

#endif

例4-15 サンプルOCCIアプリケーションのmappings.cppのリスト

#ifndef MAPPINGS_ORACLE
# include "mappings.h"
#endif

void mappings(oracle::occi::Environment* envOCCI_)
{
oracle::occi::Map *mapOCCI_ = envOCCI_->getMap();
mapOCCI_->put("HR.FULLNAME", &CFullName::readSQL, &CFullName::writeSQL);
mapOCCI_->put("HR.ADDRESS", &CAddress::readSQL, &CAddress::writeSQL);
mapOCCI_->put("HR.PERSON", &CPerson::readSQL, &CPerson::writeSQL);
mapOCCI_->put("HR.STUDENT", &CStudent::readSQL, &CStudent::writeSQL);
}

例4-16 サンプルOCCIアプリケーションのdemo2.hのリスト

#ifndef DEMO2_ORACLE
# define DEMO2_ORACLE

#ifndef OCCI_ORACLE
# include <occi.h>
#endif

using namespace std;
using namespace oracle::occi;

class MyFullName;
class MyAddress;
class MyPerson;
/*   Changes ended here */

/*  GENERATED DECLARATIONS FOR THE FULLNAME OBJECT TYPE. */
class CFullName : public oracle::occi::PObject {

private:
OCCI_STD_NAMESPACE::string FIRST_NAME;
OCCI_STD_NAMESPACE::string LAST_NAME;

public:   OCCI_STD_NAMESPACE::string getFirst_name() const;
void setFirst_name(const OCCI_STD_NAMESPACE::string &value);
OCCI_STD_NAMESPACE::string getLast_name() const;
void setLast_name(const OCCI_STD_NAMESPACE::string &value);
void *operator new(size_t size);
void *operator new(size_t size, const oracle::occi::Connection * sess,
const OCCI_STD_NAMESPACE::string& table);
void *operator new(size_t, void *ctxOCCI_);
void *operator new(size_t size, const oracle::occi::Connection *sess,
const OCCI_STD_NAMESPACE::string &tableName,
const OCCI_STD_NAMESPACE::string &typeName,
const OCCI_STD_NAMESPACE::string &tableSchema,
const OCCI_STD_NAMESPACE::string &typeSchema);
string  getSQLTypeName() const;
void getSQLTypeName(oracle::occi::Environment *env, void **schemaName,
unsigned int &schemaNameLen, void **typeName,
unsigned int &typeNameLen) const;
CFullName();
CFullName(void *ctxOCCI_) : oracle::occi::PObject (ctxOCCI_) { };
static void *readSQL(void *ctxOCCI_);
virtual void readSQL(oracle::occi::AnyData& streamOCCI_);
static void writeSQL(void *objOCCI_, void *ctxOCCI_);
virtual void writeSQL(oracle::occi::AnyData& streamOCCI_);
~CFullName();
};

/* GENERATED DECLARATIONS FOR THE ADDRESS OBJECT TYPE. */
class CAddress : public oracle::occi::PObject {

private:
OCCI_STD_NAMESPACE::string STATE;
OCCI_STD_NAMESPACE::string ZIP;

public:
OCCI_STD_NAMESPACE::string getState() const;
void setState(const OCCI_STD_NAMESPACE::string &value);
OCCI_STD_NAMESPACE::string getZip() const;
void setZip(const OCCI_STD_NAMESPACE::string &value);
void *operator new(size_t size);
void *operator new(size_t size, const oracle::occi::Connection * sess,
const OCCI_STD_NAMESPACE::string& table);
void *operator new(size_t, void *ctxOCCI_);
void *operator new(size_t size, const oracle::occi::Connection *sess,
const OCCI_STD_NAMESPACE::string &tableName,
const OCCI_STD_NAMESPACE::string &typeName,
const OCCI_STD_NAMESPACE::string &tableSchema,
const OCCI_STD_NAMESPACE::string &typeSchema);
string  getSQLTypeName() const;
void getSQLTypeName(oracle::occi::Environment *env, void **schemaName,
unsigned int &schemaNameLen, void **typeName,
unsigned int &typeNameLen) const;
CAddress();
CAddress(void *ctxOCCI_) : oracle::occi::PObject (ctxOCCI_) { };
static void *readSQL(void *ctxOCCI_);
virtual void readSQL(oracle::occi::AnyData& streamOCCI_);
static void writeSQL(void *objOCCI_, void *ctxOCCI_);
virtual void writeSQL(oracle::occi::AnyData& streamOCCI_);
~CAddress();
};

/* GENERATED DECLARATIONS FOR THE PERSON OBJECT TYPE. */
class CPerson : public oracle::occi::PObject {

private:
oracle::occi::Number ID;
MyFullName * NAME;
oracle::occi::Ref< MyAddress > CURR_ADDR;
OCCI_STD_NAMESPACE::vector< oracle::occi::Ref< MyAddress > > PREV_ADDR_L;

public:   oracle::occi::Number getId() const;
void setId(const oracle::occi::Number &value);
MyFullName * getName() const;
void setName(MyFullName * value);
oracle::occi::Ref< MyAddress > getCurr_addr() const;
void setCurr_addr(const oracle::occi::Ref< MyAddress > &value);
OCCI_STD_NAMESPACE::vector<oracle::occi::Ref< MyAddress>>&
getPrev_addr_l();
const OCCI_STD_NAMESPACE::vector<oracle::occi::Ref<MyAddress>>&
getPrev_addr_l() const;
void setPrev_addr_l(const OCCI_STD_NAMESPACE::vector
<oracle::occi::Ref< MyAddress > > &value);
void *operator new(size_t size);
void *operator new(size_t size, const oracle::occi::Connection * sess,
const OCCI_STD_NAMESPACE::string& table);
void *operator new(size_t, void *ctxOCCI_);
void *operator new(size_t size, const oracle::occi::Connection *sess,
const OCCI_STD_NAMESPACE::string &tableName,
const OCCI_STD_NAMESPACE::string &typeName,
const OCCI_STD_NAMESPACE::string &tableSchema,
const OCCI_STD_NAMESPACE::string &typeSchema);
string  getSQLTypeName() const;
void getSQLTypeName(oracle::occi::Environment *env, void **schemaName,
unsigned int &schemaNameLen, void **typeName,
unsigned int &typeNameLen) const;
CPerson();
CPerson(void *ctxOCCI_) : oracle::occi::PObject (ctxOCCI_) { };
static void *readSQL(void *ctxOCCI_);
virtual void readSQL(oracle::occi::AnyData& streamOCCI_);
static void writeSQL(void *objOCCI_, void *ctxOCCI_);
virtual void writeSQL(oracle::occi::AnyData& streamOCCI_);
~CPerson();
};

/* GENERATED DECLARATIONS FOR THE STUDENT OBJECT TYPE. */
/*  changes to the generated file - declarations for the MyPerson class. */
class MyPerson : public CPerson {

public:
MyPerson(Number id_i, MyFullName *name_i, const Ref<MyAddress>& addr_i) ;
MyPerson(void *ctxOCCI_);
void move(const Ref<MyAddress>& new_addr);
void displayInfo();
MyPerson();
};
/* changes  end here */

class CStudent : public MyPerson {
private:
OCCI_STD_NAMESPACE::string SCHOOL_NAME;

public:
OCCI_STD_NAMESPACE::string getSchool_name() const;
void setSchool_name(const OCCI_STD_NAMESPACE::string &value);\
void *operator new(size_t size);
void *operator new(size_t size, const oracle::occi::Connection * sess,\
const OCCI_STD_NAMESPACE::string& table);
void *operator new(size_t, void *ctxOCCI_);
void *operator new(size_t size, const oracle::occi::Connection *sess,
const OCCI_STD_NAMESPACE::string &tableName,
const OCCI_STD_NAMESPACE::string &typeName,
const OCCI_STD_NAMESPACE::string &tableSchema,
const OCCI_STD_NAMESPACE::string &typeSchema);
string  getSQLTypeName() const;
void getSQLTypeName(oracle::occi::Environment *env, void **schemaName,
unsigned int &schemaNameLen, void **typeName,
unsigned int &typeNameLen) const;
CStudent();
CStudent(void *ctxOCCI_) : MyPerson (ctxOCCI_) { };
static void *readSQL(void *ctxOCCI_);
virtual void readSQL(oracle::occi::AnyData& streamOCCI_);
static void writeSQL(void *objOCCI_, void *ctxOCCI_);
virtual void writeSQL(oracle::occi::AnyData& streamOCCI_);
~CStudent();
};

/*changes  made to the generated file */
/* declarations for the MyFullName class. */
class MyFullName : public  CFullName
{  public:
MyFullName(string first_name, string last_name);
void displayInfo();
MyFullName(void *ctxOCCI_);
};

// declarations for the MyAddress class.
class MyAddress : public CAddress
{  public:
MyAddress(string state_i, string zip_i);
void displayInfo();
MyAddress(void *ctxOCCI_);
};

class MyStudent : public CStudent
{
public :
MyStudent(void *ctxOCCI_) ;
};
/* changes end here */
#endif

例4-17 サンプルOCCIアプリケーションのdemo2.cppのリスト

#ifndef DEMO2_ORACLE
# include "demo2.h"
#endif

/* GENERATED METHOD IMPLEMENTATIONS FOR THE FULLNAME OBJECT TYPE. */
OCCI_STD_NAMESPACE::string CFullName::getFirst_name() const
{
return FIRST_NAME;
}

void CFullName::setFirst_name(const OCCI_STD_NAMESPACE::string &value)
{
FIRST_NAME = value;
}

OCCI_STD_NAMESPACE::string CFullName::getLast_name() const
{
return LAST_NAME;
}

void CFullName::setLast_name(const OCCI_STD_NAMESPACE::string &value)
{
LAST_NAME = value;
}

void *CFullName::operator new(size_t size)
{
return oracle::occi::PObject::operator new(size);
}

void *CFullName::operator new(size_t size, const oracle::occi::Connection *
sess,  const OCCI_STD_NAMESPACE::string& table)
{
return oracle::occi::PObject::operator new(size, sess, table,
(char *) "HR.FULLNAME");
}

void *CFullName::operator new(size_t size, void *ctxOCCI_)
{
return oracle::occi::PObject::operator new(size, ctxOCCI_);
}

void *CFullName::operator new(size_t size,
const oracle::occi::Connection *sess,
const OCCI_STD_NAMESPACE::string &tableName,
const OCCI_STD_NAMESPACE::string &typeName,
const OCCI_STD_NAMESPACE::string &tableSchema,
const OCCI_STD_NAMESPACE::string &typeSchema)
{
return oracle::occi::PObject::operator new(size, sess, tableName,
typeName, tableSchema, typeSchema);
}

OCCI_STD_NAMESPACE::string CFullName::getSQLTypeName() const
{
return OCCI_STD_NAMESPACE::string("HR.FULLNAME");
}

void CFullName::getSQLTypeName(oracle::occi::Environment *env,
void  **schemaName, unsigned int &schemaNameLen, void **typeName,
unsigned int &typeNameLen) const
{
PObject::getSQLTypeName(env, &CFullName::readSQL, schemaName,
schemaNameLen, typeName, typeNameLen);
}

CFullName::CFullName()
{
}

void *CFullName::readSQL(void *ctxOCCI_)
{
MyFullName *objOCCI_ = new(ctxOCCI_) MyFullName(ctxOCCI_);
oracle::occi::AnyData streamOCCI_(ctxOCCI_);

try
{
if (streamOCCI_.isNull())
objOCCI_->setNull();
else
objOCCI_->readSQL(streamOCCI_);
}
catch (oracle::occi::SQLException& excep)
{
delete objOCCI_;
excep.setErrorCtx(ctxOCCI_);
return (void *)NULL;
}
return (void *)objOCCI_;
}

void CFullName::readSQL(oracle::occi::AnyData& streamOCCI_)
{
FIRST_NAME = streamOCCI_.getString();
LAST_NAME = streamOCCI_.getString();
}

void CFullName::writeSQL(void *objectOCCI_, void *ctxOCCI_){
CFullName *objOCCI_ = (CFullName *) objectOCCI_;
oracle::occi::AnyData streamOCCI_(ctxOCCI_);

try
{
if (objOCCI_->isNull())
streamOCCI_.setNull();
else
objOCCI_->writeSQL(streamOCCI_);
}
catch (oracle::occi::SQLException& excep)
{
excep.setErrorCtx(ctxOCCI_);
}
return;
}

void CFullName::writeSQL(oracle::occi::AnyData& streamOCCI_)
{
streamOCCI_.setString(FIRST_NAME);
streamOCCI_.setString(LAST_NAME);
}

CFullName::~CFullName()
{
int i;
}

/* GENERATED METHOD IMPLEMENTATIONS FOR THE ADDRESS OBJECT TYPE. */
OCCI_STD_NAMESPACE::string CAddress::getState() const
{
return STATE;
}

void CAddress::setState(const OCCI_STD_NAMESPACE::string &value)
{
STATE = value;
}

OCCI_STD_NAMESPACE::string CAddress::getZip() const
{
return ZIP;
}

void CAddress::setZip(const OCCI_STD_NAMESPACE::string &value)
{
ZIP = value;
}

void *CAddress::operator new(size_t size)
{
return oracle::occi::PObject::operator new(size);
}

void *CAddress::operator new(size_t size,
const oracle::occi::Connection * sess,
const OCCI_STD_NAMESPACE::string& table)
{
return oracle::occi::PObject::operator new(size, sess, table,
(char *) "HR.ADDRESS");
}

void *CAddress::operator new(size_t size, void *ctxOCCI_)
{
return oracle::occi::PObject::operator new(size, ctxOCCI_);
}

void *CAddress::operator new(size_t size,
const oracle::occi::Connection *sess,
const OCCI_STD_NAMESPACE::string &tableName,
const OCCI_STD_NAMESPACE::string &typeName,
const OCCI_STD_NAMESPACE::string &tableSchema,
const OCCI_STD_NAMESPACE::string &typeSchema)
{
return oracle::occi::PObject::operator new(size, sess, tableName,
typeName, tableSchema, typeSchema);
}

OCCI_STD_NAMESPACE::string CAddress::getSQLTypeName() const
{
return OCCI_STD_NAMESPACE::string("HR.ADDRESS");
}

void CAddress::getSQLTypeName(oracle::occi::Environment *env,
void **schemaName,
unsigned int &schemaNameLen,
void **typeName,
unsigned int &typeNameLen) const
{
PObject::getSQLTypeName(env, &CAddress::readSQL, schemaName,
schemaNameLen, typeName, typeNameLen);
}

CAddress::CAddress()
{
}

void *CAddress::readSQL(void *ctxOCCI_)
{
MyAddress *objOCCI_ = new(ctxOCCI_) MyAddress(ctxOCCI_);
oracle::occi::AnyData streamOCCI_(ctxOCCI_);

try
{
if (streamOCCI_.isNull())
objOCCI_->setNull();
else
objOCCI_->readSQL(streamOCCI_);
}
catch (oracle::occi::SQLException& excep)
{
delete objOCCI_;
excep.setErrorCtx(ctxOCCI_);
return (void *)NULL;
}
return (void *)objOCCI_;
}

void CAddress::readSQL(oracle::occi::AnyData& streamOCCI_)
{
STATE = streamOCCI_.getString();
ZIP = streamOCCI_.getString();
}

void CAddress::writeSQL(void *objectOCCI_, void *ctxOCCI_)
{
CAddress *objOCCI_ = (CAddress *) objectOCCI_;
oracle::occi::AnyData streamOCCI_(ctxOCCI_);

try
{
if (objOCCI_->isNull())
streamOCCI_.setNull();
else
objOCCI_->writeSQL(streamOCCI_);
}
catch (oracle::occi::SQLException& excep)
{
excep.setErrorCtx(ctxOCCI_);
}
return;
}

void CAddress::writeSQL(oracle::occi::AnyData& streamOCCI_)
{
streamOCCI_.setString(STATE);
streamOCCI_.setString(ZIP);
}

CAddress::~CAddress()
{
int i;
}

/* GENERATED METHOD IMPLEMENTATIONS FOR THE PERSON OBJECT TYPE. */
oracle::occi::Number CPerson::getId() const
{
return ID;
}

void CPerson::setId(const oracle::occi::Number &value)
{
ID = value;
}

MyFullName * CPerson::getName() const
{
return NAME;
}

void CPerson::setName(MyFullName * value)
{
NAME = value;
}

oracle::occi::Ref< MyAddress > CPerson::getCurr_addr() const
{
return CURR_ADDR;
}

void CPerson::setCurr_addr(const oracle::occi::Ref< MyAddress > &value)
{
CURR_ADDR = value;
}

OCCI_STD_NAMESPACE::vector< oracle::occi::Ref< MyAddress > >&
CPerson::getPrev_addr_l()
{
return PREV_ADDR_L;
}

const OCCI_STD_NAMESPACE::vector< oracle::occi::Ref< MyAddress > >&
CPerson::getPrev_addr_l() const
{
return PREV_ADDR_L;
}

void CPerson::setPrev_addr_l(const OCCI_STD_NAMESPACE::vector<
oracle::occi::Ref< MyAddress > > &value)
{
PREV_ADDR_L = value;
}
void *CPerson::operator new(size_t size)
{
return oracle::occi::PObject::operator new(size);
}

void *CPerson::operator new(size_t size,
const oracle::occi::Connection * sess,
const OCCI_STD_NAMESPACE::string& table)
{
return oracle::occi::PObject::operator new(size, sess, table,
(char *) "HR.PERSON");
}

void *CPerson::operator new(size_t size, void *ctxOCCI_)
{
return oracle::occi::PObject::operator new(size, ctxOCCI_);
}

void *CPerson::operator new(size_t size,
const oracle::occi::Connection *sess,
const OCCI_STD_NAMESPACE::string &tableName,
const OCCI_STD_NAMESPACE::string &typeName,
const OCCI_STD_NAMESPACE::string &tableSchema,
const OCCI_STD_NAMESPACE::string &typeSchema)
{
return oracle::occi::PObject::operator new(size, sess, tableName,
typeName, tableSchema, typeSchema);
}

OCCI_STD_NAMESPACE::string CPerson::getSQLTypeName() const
{
return OCCI_STD_NAMESPACE::string("HR.PERSON");
}

void CPerson::getSQLTypeName(oracle::occi::Environment *env,
void **schemaName,
unsigned int &schemaNameLen,
void **typeName,
unsigned int &typeNameLen) const
{
PObject::getSQLTypeName(env, &CPerson::readSQL, schemaName,
schemaNameLen, typeName, typeNameLen);
}

CPerson::CPerson()
{
NAME = (MyFullName *) 0;
}

void *CPerson::readSQL(void *ctxOCCI_)
{
MyPerson *objOCCI_ = new(ctxOCCI_) MyPerson(ctxOCCI_);
oracle::occi::AnyData streamOCCI_(ctxOCCI_);
try
{
if (streamOCCI_.isNull())
objOCCI_->setNull();
else
objOCCI_->readSQL(streamOCCI_);
}
catch (oracle::occi::SQLException& excep)
{
delete objOCCI_;
excep.setErrorCtx(ctxOCCI_);
return (void *)NULL;
}
return (void *)objOCCI_;
}

void CPerson::readSQL(oracle::occi::AnyData& streamOCCI_)
{
ID = streamOCCI_.getNumber();
NAME = (MyFullName *) streamOCCI_.getObject(&MyFullName::readSQL);
CURR_ADDR = streamOCCI_.getRef();
oracle::occi::getVectorOfRefs(streamOCCI_, PREV_ADDR_L);
}

void CPerson::writeSQL(void *objectOCCI_, void *ctxOCCI_)
{
CPerson *objOCCI_ = (CPerson *) objectOCCI_;
oracle::occi::AnyData streamOCCI_(ctxOCCI_);
try
{
if (objOCCI_->isNull())
streamOCCI_.setNull();
else
objOCCI_->writeSQL(streamOCCI_);
}
catch (oracle::occi::SQLException& excep)
{
excep.setErrorCtx(ctxOCCI_);
}
return;
}

void CPerson::writeSQL(oracle::occi::AnyData& streamOCCI_)
{
streamOCCI_.setNumber(ID);
streamOCCI_.setObject(NAME);
streamOCCI_.setRef(CURR_ADDR);
oracle::occi::setVectorOfRefs(streamOCCI_, PREV_ADDR_L);
}

CPerson::~CPerson()
{
int i;
delete NAME;
}

/* GENERATED METHOD IMPLEMENTATIONS FOR THE STUDENT OBJECT TYPE. */
OCCI_STD_NAMESPACE::string CStudent::getSchool_name() const
{
return SCHOOL_NAME;
}

void CStudent::setSchool_name(const OCCI_STD_NAMESPACE::string &value)
{
SCHOOL_NAME = value;
}

void *CStudent::operator new(size_t size)
{
return oracle::occi::PObject::operator new(size);
}

void *CStudent::operator new(size_t size,
const oracle::occi::Connection * sess,
const OCCI_STD_NAMESPACE::string& table)
{
return oracle::occi::PObject::operator new(size, sess, table,
(char *) "HR.STUDENT");
}

void *CStudent::operator new(size_t size, void *ctxOCCI_)
{
return oracle::occi::PObject::operator new(size, ctxOCCI_);
}

void *CStudent::operator new(size_t size,
const oracle::occi::Connection *sess,
const OCCI_STD_NAMESPACE::string &tableName,
const OCCI_STD_NAMESPACE::string &typeName,
const OCCI_STD_NAMESPACE::string &tableSchema,
const OCCI_STD_NAMESPACE::string &typeSchema)
{
return oracle::occi::PObject::operator new(size, sess, tableName,
typeName, tableSchema, typeSchema);
}

OCCI_STD_NAMESPACE::string CStudent::getSQLTypeName() const
{
return OCCI_STD_NAMESPACE::string("HR.STUDENT");
}

void CStudent::getSQLTypeName(oracle::occi::Environment *env,
void **schemaName,
unsigned int &schemaNameLen,
void **typeName,
unsigned int &typeNameLen) const
{
PObject::getSQLTypeName(env, &CStudent::readSQL, schemaName,
schemaNameLen, typeName, typeNameLen);
}

CStudent::CStudent()
{
}
void *CStudent::readSQL(void *ctxOCCI_)
{
MyStudent *objOCCI_ = new(ctxOCCI_) MyStudent(ctxOCCI_);
oracle::occi::AnyData streamOCCI_(ctxOCCI_);

try
{
if (streamOCCI_.isNull())
objOCCI_->setNull();
else
objOCCI_->readSQL(streamOCCI_);
}
catch (oracle::occi::SQLException& excep)
{
delete objOCCI_;
excep.setErrorCtx(ctxOCCI_);
return (void *)NULL;
}
return (void *)objOCCI_;
}

void CStudent::readSQL(oracle::occi::AnyData& streamOCCI_)
{
CPerson::readSQL(streamOCCI_);
SCHOOL_NAME = streamOCCI_.getString();
}

void CStudent::writeSQL(void *objectOCCI_, void *ctxOCCI_)
{
CStudent *objOCCI_ = (CStudent *) objectOCCI_;
oracle::occi::AnyData streamOCCI_(ctxOCCI_);
try
{
if (objOCCI_->isNull())
streamOCCI_.setNull();
else
objOCCI_->writeSQL(streamOCCI_);
}
catch (oracle::occi::SQLException& excep)
{
excep.setErrorCtx(ctxOCCI_);
}
return;
}

void CStudent::writeSQL(oracle::occi::AnyData& streamOCCI_)
{
CPerson::writeSQL(streamOCCI_);
streamOCCI_.setString(SCHOOL_NAME);
}

CStudent::~CStudent()
{
int i;
}

OTTによって、FULL_NAME、ADDRESS、PERSONおよびPFGRFDENTクラスの宣言がdemo2.hに生成されると想定します。次のサンプルOCCIアプリケーションは、例4-12のdemo2.typファイルで指定された、OTTによって生成されたクラスを拡張し、ユーザー定義のメソッドをいくつか追加します。これらのクラス宣言は、正しくコンパイルするために、demo2.hに組み込まれています。

例4-18 サンプルOCCIアプリケーションのmyDemo.hのリスト

#ifndef MYDEMO_ORACLE
#define MYDEMO_ORACLE

#include <string>

#ifndef DEMO2_ORACLE
#include <demo2.h>
#endif

using namespace std;
using namespace oracle::occi;

// declarations for the MyFullName class.
class MyFullName : public  CFullName
{  public:
MyFullName(string first_name, string last_name);
void displayInfo();
};

// declarations for the MyAddress class.
class MyAddress : public CAddress
{  public:
MyAddress(string state_i, string zip_i);
void displayInfo();
};

// declarations for the MyPerson class.
class MyPerson : public CPerson
{  public:
MyPerson(Number id_i, MyFullname *name_i,
const Ref<MyAddress>& addr_i);
void move(const Ref<MyAddress>& new_addr);
void displayInfo();
};

#endif

例4-19 サンプルOCCIアプリケーションのmyDemo.cppのリスト

#ifndef DEMO2_ORACLE
#include <demo2.h>
#endif

using namespace std;

/* initialize MyFullName */
MyFullName::MyFullName(string first_name,string last_name)
{
setFirst_name(first_name);
setLast_name(last_name);
}

/* display all the information in MyFullName */
void MyFullName::displayInfo()
{
cout << "FIRST NAME is" << getFirst_name() << endl;
cout << "LAST NAME is" << getLast_name() << endl;
}

MyFullName::MyFullName(void *ctxOCCI_):CFullName(ctxOCCI_)
{
}

/* METHOD IMPLEMENTATIONS FOR MyAddress CLASS. */

/* initialize MyAddress */
MyAddress::MyAddress(string state_i, string zip_i)
{
setState(state_i);
setZip(zip_i);
}

/* display all the information in MyAddress */
void MyAddress::displayInfo()
{
cout << "STATE is" << getState() << endl;
cout << "ZIP is" << getZip() << endl;
}

MyAddress::MyAddress(void *ctxOCCI_) :CAddress(ctxOCCI_)
{
}

/* METHOD IMPLEMENTATIONS FOR MyPerson CLASS. */

/* initialize MyPerson */
MyPerson::MyPerson(Number id_i, MyFullName* name_i,
const Ref<MyAddress>& addr_i)
{
setId(id_i);
setName(name_i);
setCurr_addr(addr_i);
}

MyPerson::MyPerson(void *ctxOCCI_) :CPerson(ctxOCCI_)
{
}

/* move Person from curr_addr to new_addr */
void MyPerson::move(const Ref<MyAddress>& new_addr)
{
// append curr_addr to the vector //
getPrev_addr_l().push_back(getCurr_addr());
setCurr_addr(new_addr);

// mark the object as dirty
this->markModified();
}

/*  display all the information of MyPerson */
void MyPerson::displayInfo()
{
cout << "ID is" << (int)getId() << endl;
getName()->displayInfo();

// de-referencing the Ref attribute using -> operator
getCurr_addr()->displayInfo();
cout << "Prev Addr List: " << endl;
for (int i = 0; i < getPrev_addr_l().size(); i++)
{
// access the collection elements using [] operator
(getPrev_addr_l())[i]->displayInfo();
}
}

MyPerson::MyPerson()
{
}

MyStudent::MyStudent(void *ctxOCCI_) : CStudent(ctxOCCI_)
{
}

例4-20 サンプルOCCIアプリケーションのmain.cppのリスト

#ifndef DEMO2_ORACLE
#include <demo2.h>
#endif

#ifndef MAPPINGS_ORACLE
#include <mappings.h>
#endif

#include <iostream>
using namespace std;
using namespace::oracle;

int main()
{
Environment *env = Environment::createEnvironment(Environment::OBJECT);
mappings(env);

try {
Connection *conn = Connection("HR", "password");

/* Call the OTT generated function to register the mappings */
/* create a persistent object of type ADDRESS in the database table,
ADDR_TAB */
MyAddress *addr1 = new(conn, "ADDR_TAB") MyAddress("CA", "94065");
conn->commit();

Statement *st = conn->createStatement("select ref(a) from addr_tab a");
ResultSet *rs = st->executeQuery();
Ref<MyAddress> r1;
if ( rs->next())
r1 = rs->getRef(1);
st->closeResultSet(rs);
conn->terminateStatement(st);

MyFullName * name1 = new MyFullName("Joe", "Black");

/* create a persistent object of type Person in the database table
PERSON_TAB */
MyPerson *person1 = new(conn, "PERSON_TAB") MyPerson(1,name1,r1);
conn->commit();

/* selecting the inserted information */
Statement *stmt = conn->createStatement();
ResultSet *resultSet =
stmt->executeQuery("SELECT REF(a) from person_tab a where id = 1");

if (resultSet->next())
{
Ref<MyPerson> joe_ref = (Ref<MyPerson>) resultSet->getRef(1);
joe_ref->displayInfo();

/* create a persistent object of type ADDRESS in the database table
ADDR_TAB */
MyAddress *new_addr1 = new(conn, "ADDR_TAB") MyAddress("PA", "92140");
joe_ref->move(new_addr1->getRef());
joe_ref->displayInfo();
}

/* commit the transaction which results in the newly created object
new_addr and the dirty object joe to be flushed to the server.
Note that joe was marked dirty in move(). */
conn->commit();

conn->terminateStatement(stmt);
env->terminateConnection(conn);
}

catch ( exception &x)

{
cout << x.what () << endl;
}
Environment::terminateEnvironment(env);
return 0;
}

5 データ型

この章には、Oracle C++ Call Interfaceアプリケーションで使用するOracleデータ型のリファレンスが記載されています。この情報は、アプリケーションとデータベース・サーバー間におけるデータ転送時に発生する、データの内部表現と外部表現との間の変換を理解するのに役立ちます。

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

- Oracleデータ型の概要

- 内部データ型

- 外部データ型

- データ変換

Oracleデータ型の概要

C++プログラムとOracleデータベース・サーバー間では、通信を正確に行うことが重要です。OCCIアプリケーションでは、SQL問合せを使用してデータベース表からデータを取り出すか、SQLのINSERT、UPDATEおよびDELETE関数を使用して既存のデータを変更できます。ホスト言語のC++とデータベース・サーバー間の通信を容易に行うには、C++データ型とOracleデータ型間の変換方法を理解する必要があります。

Oracleデータベースでは、値は表内の列に格納されています。Oracle内部では、データは内部データ型と呼ばれる特定フォーマットで表現されます。NUMBER、VARCHAR2およびDATEなどは、このOracle内部データ型の例です。

OCCIアプリケーションでは、ホスト言語データ型、またはホスト言語によって事前定義された外部データ型を使用します。データがOCCIアプリケーションとデータベース・サーバーの間で移動する際、データベースのデータは、内部データ型から外部データ型に変換されます。

OCCI型とデータ変換

OCCIでは、Typeと呼ばれる列挙子が定義されています。この列挙子には、OCCIアプリケーションで使用可能なデータの表現フォーマットがリストされています。この表現フォーマットは、外部データ型と呼ばれています。OCCIアプリケーションからデータベース・サーバーにデータを送信すると、外部データ型によって、そのデータのフォーマットがデータベース・サーバーに対して示されます。また、OCCIアプリケーションがデータベース・サーバーからデータを要求すると、外部データ型によって、戻されるデータのフォーマットが示されます。

たとえば、NUMBER列から値を取り出す場合は、その値をOCCIINTフォーマット（整変数への符号付き整数フォーマット）で取り出すようにプログラムを設定できます。あるいは、データをOCCIFLOATフォーマット（浮動小数点フォーマット）で送信するようにクライアントを設定できます。このフォーマットは、NUMBER型の列に挿入されるC++のfloat変数に格納されています。

OCCIアプリケーションでは、setxxx()メソッド(外部データ型はメソッド名によって暗黙的に指定されます)をコールするか、registerOutParam()、setDataBuffer()またはsetDataBufferArray()メソッド(外部データ型はメソッドのコールによって明示的に指定されます)をコールして、入力パラメータをStatementにバインドします。同様に、データ値がResultSetオブジェクトを使用してフェッチされた場合は、取り出したデータの外部表現を指定する必要があります。この指定は、getxxx()メソッド(外部データ型はメソッド名によって暗黙的に指定されます)をコールするか、setDataBuffer()メソッド(外部データ型はメソッドのコールによって明示的に指定されます)をコールして行います。

外部データ型は、内部データ型より多くあります。単一の外部データ型が単一の内部データ型にマップされる場合や、多数の外部データ型が単一の内部データ型にマップされる場合があります。この多対1のマッピングによって、柔軟性が向上します。

関連項目
外部データ型

内部データ型

この項では、Oracleが提供する内部(組込み)データ型について説明します。説明、コード、最大サイズなど、Oracle内部データ型の概要は、表5-1を参照してください。

表5-1 Oracle内部データ型の概要

内部データ型

最大サイズ

BFILE

4GB

BINARY_DOUBLE

8バイト

BINARY_FLOAT

4バイト

CHAR

2000バイト

DATE

7バイト

INTERVAL DAY TO SECOND REF

11バイト

INTERVAL YEAR TO MONTH REF

5バイト

LONG

2GB（2^31-1バイト）

LONG RAW

2GB（2^31-1バイト）

NCHAR

2000バイト

NUMBER

21バイト

NVARCHAR2

4000バイト

RAW

2000バイト

REF

BLOB

4GB

CLOB

4GB

NCLOB

4GB

ROWID

10バイト

TIMESTAMP

11バイト

TIMESTAMP WITH LOCAL TIME ZONE

7バイト

TIMESTAMP WITH TIME ZONE

13バイト

UROWID

4000バイト

ユーザー定義型（オブジェクト型、VARRAY、ネストした表）

VARCHAR2

4000バイト

関連項目

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

- 『Oracle Database概要』

文字列とバイト配列

文字またはバイト配列が含まれている列を指定するには、CHAR、VARCHAR2、RAW、LONGおよびLONG RAWの5つのOracle内部データ型を使用できます。

CHAR、VARCHAR2およびLONG列は、通常、文字データを保持します。RAWとLONG RAWは、ビットマップ化された画像のピクセル値など、文字として解釈されないバイトを保持します。文字データは、ネットワーク間のゲートウェイを介して渡すと、変形する可能性があります。たとえば、異なる言語(単一の文字が異なるバイト数で表現される)を使用しているシステム間で文字データを渡すと、データの長さが大幅に変更される可能性があります。RAWデータがこのように変換されることはありません。

適切なOracle内部データ型を表内の各列に対して選択するのは、データベース設計者の役割です。文字データとバイト配列データを表現する方法、およびOCCIプログラムの変数とOracleデータベース表間でデータを変換する方法には、様々な方法があることを理解しておく必要があります。

ユニバーサルROWID（UROWID）

ユニバーサルROWID (UROWID)は、Oracle表、およびゲートウェイを使用してアクセスするDB2表などの外部キー表の行に対する論理ROWIDと物理ROWIDを格納できるデータ型です。論理ROWIDの値は、索引構成表の行に対する主キー・ベースの論理識別子です。

UROWIDデータ型の列を使用するには、COMPATIBLE初期化パラメータの値を8.1以上に設定する必要があります。

次のOCCI_SQLT型は、ユニバーサルROWIDにバインドできます。

- OCCI_SQLT_CHR（VARCHAR2）

- OCCI_SQLT_VCS（VARCHAR）

- OCCI_SQLT_STR（NULL終了文字列）

- OCCI_SQLT_LVC（LONG VARCHAR）

- OCCI_SQLT_AFC（CHAR）

- OCCI_SQLT_AVC（CHARZ）

- OCCI_SQLT_VST（文字列）

- OCCI_SQLT_RDD（ROWID記述子）

外部データ型

OCCIアプリケーションは、外部データ型を使用してOracleデータベース・サーバーと通信します。具体的には、外部データ型がC++データ型にマップされます。

表5-2は、Oracle外部データ型、等価のC++データ型(Oracle内部データ型からの通常の変換先)および対応するOCCI型を示しています。次の条件に注意してください。

- C++データ型列では、nは変数長を表し、プログラム要件またはオペレーティング・システムに依存します。

- Statementクラスのメソッドにおける型の使用方法は次のとおりです。

- setDataBuffer()およびsetDataBufferArray(): occiCommon.hファイルのOCCI_SQLT_xxxフォーム（OCCI_SQLT_INTなど）のデータ型のみ使用できます。

- registerOutParam(): occiCommon.hファイルのOCCIxxxフォーム（OCCIDOUBLE、OCCICURSORなど）のデータ型のみ使用できます。ただし、いくつか例外があります。OCCIANYDATA、OCCIMETADATA、OCCISTREAMおよびOCCIBOOLは使用できません。

- ResultSetクラスでは、occiCommon.hファイルのOCCI_SQLT_xxxフォーム（OCCI_SQLT_INTなど）のデータ型のみが、setDataBuffer()およびsetDataBufferArray()メソッドで使用できます。

- TIMESTAMPデータ型とTIMESTAMP WITH TIME ZONEデータ型は、総称して日時データ型と呼ばれています。INTERVAL YEAR TO MONTHデータ型とINTERVAL DAY TO SECONDデータ型は、総称して間隔データ型と呼ばれています。

表5-2 外部データ型と対応するC++型およびOCCI型

外部データ型

C++型

OCCI型

使用上の注意

16ビット符号付きINTEGER

signed short, signed int

OCCIINT

setDataBuffer()、setDataBufferArray()で使用します。

32ビット符号付きINTEGER

signed int, signed long

OCCIINT

setDataBuffer()、setDataBufferArray()で使用します。

8ビット符号付きINTEGER

signed char

OCCIINT

setDataBuffer()、setDataBufferArray()で使用します。

BFILE

Bfile

OCCIBFILE

regiserOutParam()で使用します。

FBFILE

OCILobLocator

OCCI_SQLT_FILE

setDataBuffer()、setDataBufferArray()で使用します。

BLOB

OCILobLocator

OCCI_SQLT_BLOB

setDataBuffer()、setDataBufferArray()で使用します。

BLOB

Blob

OCCIBLOB

regiserOutParam()で使用します。

BOOL

bool

OCCIBOOL

regiserOutParam()で使用します。

BYTES

Bytes

OCCIBYTES

regiserOutParam()で使用します。

CHAR

char[n]

OCCI_SQLT_AFC

setDataBuffer()、setDataBufferArray()で使用します。

CHAR

string

OCCICHAR

regiserOutParam()で使用します。

CLOB

OCILobLocator

OCCI_SQLT_CLOB

setDataBuffer()、setDataBufferArray()で使用します。

CHARZ

char[n+1]

OCCI_SQLT_RDD

setDataBuffer()、setDataBufferArray()で使用します。

CLOB

Clob

OCCICLOB

regiserOutParam()で使用します。

CURSOR

ResultSet

OCCICURSOR

regiserOutParam()で使用します。

DATE

char[7]

OCCI_SQLT_DAT

setDataBuffer()、setDataBufferArray()で使用します。

DATE

Date

OCCIDATE

regiserOutParam()で使用します。

DOUBLE

double

OCCIDOUBLE

regiserOutParam()で使用します。

FLOAT

float, double

OCCIFLOAT

setDataBuffer()、setDataBufferArray()で使用します。

FLOAT

float

OCCIFLOAT

regiserOutParam()で使用します。

INT

int

OCCIINT

regiserOutParam()で使用します。

INTERVAL DAY TO SECOND

char[11]

OCCI_SQLT_INTERVAL_DS

setDataBuffer()、setDataBufferArray()で使用します。

INTERVAL YEAR TO MONTH

char[5]

OCCI_SQLT_INTERVAL_YM

setDataBuffer()、setDataBufferArray()で使用します。

INTERVALDS

IntervalDS

OCCIINTERVALDS

regiserOutParam()で使用します。

INTERVALYM

IntervalYM

OCCIINTERVALYM

regiserOutParam()で使用します。

LONG

char[n]

OCCI_SQLT_LNG

setDataBuffer()、setDataBufferArray()で使用します。

LONG RAW

unsigned char[n]

OCCI_SQLT_LBI

setDataBuffer()、setDataBufferArray()で使用します。

LONG VARCHAR

char[n+siezeof(integer)]

OCCI_SQLT_LVC

setDataBuffer()、setDataBufferArray()で使用します。

LONG VARRAW

unsigned char[n+siezeof(integer)]

OCCI_SQLT_LVB

setDataBuffer()、setDataBufferArray()で使用します。

METADATA

MetaData

OCCIMETADATA

regiserOutParam()で使用します。

NAMED DATA TYPE

struct

OCCI_SQLT_NTY

setDataBuffer()、setDataBufferArray()で使用します。

NATIVE DOUBLE

double

OCCIBDOUBLE

setDataBuffer()、setDataBufferArray()で使用します。

NATIVE DOUBLE

Bdouble, double

OCCIBDOUBLE

regiserOutParam()で使用します。

NATIVE FLOAT

float

OCCIBFLOAT

setDataBuffer()、setDataBufferArray()で使用します。

NATIVE FLOAT

BFloat, float

OCCIBFLOAT

regiserOutParam()で使用します。

NULLで終了するSTRING

char[n+1]

OCCI_SQLT_STR

setDataBuffer()、setDataBufferArray()で使用します。

NUMBER

unsigned char[21]

OCCI_SQLT_NUM

setDataBuffer()、setDataBufferArray()で使用します。

NUMBER

Number

OCCINUMBER

regiserOutParam()で使用します。

POBJECT

OTTユーティリティによって生成されたユーザー定義型

OCCIPOBJECT

regiserOutParam()で使用します。

RAW

unsigned char[n]

OCCI_SQLT_BIN

setDataBuffer()、setDataBufferArray()で使用します。

REF

OCIRef

OCCI_SQLT_REF

setDataBuffer()、setDataBufferArray()で使用します。

REF

Ref

OCCIREF

regiserOutParam()で使用します。

REFANY

RefAny

OCCIREFANY

regiserOutParam()で使用します。

ROWID

OCIRowid

OCCI_SQLT_RID

setDataBuffer()、setDataBufferArray()で使用します。

ROWID

Bytes

OCCIROWID

regiserOutParam()で使用します。

ROWID記述子

OCIRowid

OCCI_SQLT_RDD

setDataBuffer()、setDataBufferArray()で使用します。

STRING

STL string

OCCISTRING

regiserOutParam()で使用します。

TIMESTAMP

char[11]

OCCI_SQLT_TIMESTAMP

setDataBuffer()、setDataBufferArray()で使用します。

TIMESTAMP

Timestamp

OCCITIMESTAMP

regiserOutParam()で使用します。

TIMESTAMP WITH LOCAL TIME ZONE

char[7]

OCCI_SQLT_TIMESTAMP_LTZ

setDataBuffer()、setDataBufferArray()で使用します。

TIMESTAMP WITH TIME ZONE

char[13]

OCCI_SQLT_TIMESTAMP_TZ

setDataBuffer()、setDataBufferArray()で使用します。

UNSIGNED INT

unsigned int

OCCIUNSIGNED_INT

setDataBuffer()、setDataBufferArray()で使用します。

UNSIGNED INT

unsigned int

OCCIUNSIGNED_INT

regiserOutParam()で使用します。

VARCHAR

char[n+sizeof( short integer)]

OCCI_SQLT_VCS

setDataBuffer()、setDataBufferArray()で使用します。

VARCHAR2

char[n]

OCCI_SQLT_CHR

setDataBuffer()、setDataBufferArray()で使用します。

VARNUM

char[22]

OCCI_SQLT_VNU

setDataBuffer()、setDataBufferArray()で使用します。

VARRAW

unsigned char[n+sizeof( short integer)]

OCCI_SQLT_VBI

setDataBuffer()、setDataBufferArray()で使用します。

VECTOR

STL vector

OCCIVECTOR

regiserOutParam()で使用します。

外部データ型の説明

この項では、各外部データ型について説明します。

BFILE

BFILE外部データ型を使用すると、データベース・サーバーのファイル・システムにあるファイルに読取り専用バイト・ストリームによるアクセスが可能となります。BFILEは、オペレーティング・システム・ファイル内のデータベース表領域外に格納されているバイナリ・データのラージ・オブジェクトです。このファイルでは、参照セマンティクスが使用されます。OracleサーバーからBFILEにアクセスする場合は、基礎となるサーバーのオペレーティング・システムが、ストリームモードによるこれらのオペレーティング・システム・ファイルへのアクセスをサポートしている必要があります。

BDOUBLE

OCCIのBDoubleインタフェースは、システム固有のdouble型データ、およびbinary_double型の列またはオブジェクト属性のNULL情報をカプセル化します。AnyDataクラス、ResultSetクラス、およびStatementクラスのOCCIメソッド、およびこれらのクラス・オブジェクトをパラメータとして取るグローバル・メソッドは、BDOUBLEデータ型に対して次の定義を使用します。

例5-1 BDOUBLEデータ型の定義

struct BDouble
{
double value;
bool isNull;

BDouble()
{
isNull = false;
value = 0.;
}
};

BFLOAT

OCCIのBFloatインタフェースは、システム固有のfloat型データ、およびbinary_float型の列またはオブジェクト属性のNULL情報をカプセル化します。AnyDataクラス、ResultSetクラス、およびStatementクラスのOCCIメソッド、およびこれらのクラス・オブジェクトをパラメータとして取るグローバル・メソッドは、BFLOATデータ型に対して次の定義を使用します。

例5-2 BFLOATデータ型の定義

struct BFloat
{
float value;
bool isNull;

BFloat()
{
isNull = false;
value = 0.;
}
};

BLOB

BLOB外部データ型には、非構造化バイナリ・ラージ・オブジェクトが格納されます。BLOBは、キャラクタ・セットのセマンティクスを伴わないビットストリームとみなすこともできます。BLOBには、最大4GBのバイナリ・データを格納できます。

BLOBデータ型には、完全なトランザクション・サポートがあります。OCCIを使用して行われた変更は、すべてトランザクションに反映されます。BLOB値に対して行った操作は、コミットまたはロールバックできます。1つのトランザクション内で変数のBLOBロケータを保存し、次にそれを別のトランザクションまたはセッションで使用することはできません。

CHAR

CHAR外部データ型は、最大2000文字の文字列です。文字列は、空白埋めの比較方法を使用して比較されます。

CHARZ

CHARZ外部データ型は、入力時に文字列がNULLで終了し、出力時にOracleで文字列の最後にNULL終了文字列が配置されることを除けば、CHARデータ型と同じです。NULL終了文字列は入出力時に文字列を区切るためのものです。表のデータの一部ではありません。

CLOB

CLOB外部データ型には、固定幅または可変幅の文字データが格納されます。CLOBには、最大4GBの文字データを格納できます。CLOBには、完全なトランザクション・サポートがあります。OCCIを使用して行われた変更は、すべてトランザクションに反映されます。CLOB値に対して行った操作は、コミットまたはロールバックできます。1つのトランザクション内で変数のCLOBロケータを保存し、次にそれを別のトランザクションまたはセッションで使用することはできません。

DATE

DATE外部データ型は、表5-3に示すように、7バイトで構成されたOracle内部日付2進形式を使用して、日付の値の更新、挿入または取出しができます。

表5-3 DATEデータ型の書式

例

バイト1: 世紀

バイト2: 年

バイト3: 月

バイト4: 日

バイト5: 時間

バイト6: 分

バイト7: 秒

1: 2000年6月1日午後3時17分

120

100

6

1

16

18

1

2: BCE 4712年1月1日

53

88

1

1

1

1

1

例1: 2000年6月1日午後3時17分

- 世紀と年を表すバイト（1と2）は、100を加算した表記です。BCE（西暦紀元前）の日付は99以下です。西暦0以降の日付は100以上になります。0以降の日付の場合、バイト1とバイト2の先頭の数字は、西暦であることを示します。

- バイト1では、世紀の2番目と3番目の数字は、年（整数）を100で除算して計算されます。整数除算による小数部分は切り捨てられます。1992年については、1992 / 100 = 19という計算が行われます。

- バイト1の場合、119は、20世紀（1900〜1999）を表します。120の値は、21世紀（2000〜2099）を表すことになります。

- バイト2では、年の2番目と3番目の数字が年のモジュロ100として、1992 % 100 = 92のように計算されます。

- バイト2の場合、192は、現在の世紀の92番目の年を表します。100の値は、現在の世紀の0番目の年を表すことになります。

- 西暦2000年は、バイト1が120、バイト2が100で表されます。

- バイト3から7では、有効な日付はその年の1月1日から開始します。月バイトの範囲は1〜12、日付バイトの範囲は1〜31、時間バイトの範囲は1〜24、分バイトの範囲は1〜60、秒バイトの範囲は1〜60となります。

例2: BCE 4712年1月1日

- 西暦0以前の年数の場合、世紀数と年数は、100とその年数との差異で表されます。

- バイト1では、BCE 4712年1月1日は53世紀（100 - 47 = 53）になります。

- バイト2では、BCE 4712年1月1日は88年（100 - 12 = 88）になります。

日付に時刻が指定されていない場合、時刻はデフォルトで深夜となり、バイト5から6は1（1、1、1）に設定されます。

DATE外部データ型を使用して、日付を2進形式で入力する場合、データベースでは一貫性または範囲のチェックが行われません。この形式によるデータは、入力前にすべて検証する必要があります。

DATE外部データ型の必要性はほとんどありません。ほとんどのプログラムでは、DD-MON-YYYYなどの文字形式で日付が処理されるため、DATEの値を文字形式に変換する方が便利です。かわりに、Dateデータ型を使用することもできます。

DATEの列がプログラム内で文字列に変換されると、その列は使用中セッションのデフォルトの書式マスクで戻されるか、またはINIT.ORAファイルで指定したとおりに戻されます。

このデータ型は、C++のDateデータ型に対応するOCCI DATEとは異なります。

FLOAT

FLOAT外部データ型は、小数部分のある数値を処理します。数値は、ホスト・システムの浮動小数点フォーマットで表されます。通常、長さは4バイトか8バイトです。

Oracleの数値の内部形式は10進数です。ほとんどの浮動小数点は2進数です。したがって、Oracleでは、浮動小数点による表現より高い精度で数値が表されます。

INTEGER

INTEGER外部データ型は、数値の変換に使用されます。外部INTEGERは符号付きの2進数です。外部INTEGERのサイズは、オペレーティング・システムによって異なります。Oracleから戻される数値が整数でない場合は、小数部分が切り捨てられ、エラーは戻りません。戻された数値がシステムの符号付き整数より大きくて表現できない場合は、変換時のオーバーフロー・エラーが戻されます。

FLOATとNUMBER間の変換時に、丸めのエラーが発生する場合があります。問合せでFLOATをバインド変数として使用すると、エラーが戻る場合があります。この問題を回避するには、FLOATを文字列に変換し、操作では、OCCI型のOCCI_SQLT_CHRまたはOCCI型のOCCI_SQLT_STRを使用します。

INTERVAL DAY TO SECOND

INTERVAL DAY TO SECOND外部データ型には、日数、時間数、分数および秒数に関して、2つの日時の値の差異が格納されます。このデータ型は、次のように指定します。

INTERVAL DAY [(day_precision)]
TO SECOND [(fractional_seconds_precision)]

この例では、次のプレースホルダが使用されています。

- day_precision: DAY日時フィールドの桁数。有効な値は、1〜9です。デフォルトは2です。

- fractional_seconds_precision: SECOND日時フィールドの小数部分の桁数。有効な値は、0〜9です。デフォルトは6です。

INTERVAL DAY TO SECONDリテラルをデフォルト以外の日付と秒の精度で指定するには、このリテラル内に精度を指定する必要があります。たとえば、次のように、100日、10時間、20分、42秒と22/100秒の間隔を指定できます。

INTERVAL '100 10:20:42.22' DAY(3) TO SECOND(2)

また、INTERVAL DAY TO SECONDリテラルの省略フォームも使用できます。たとえば、次のようにします。

- INTERVAL '90' MINUTEは、INTERVAL '00 00:90:00.00' DAY TO SECOND(2)にマップされます。

- INTERVAL '30:30' HOUR TO MINUTEは、INTERVAL '00 30:30:00.00' DAY TO SECOND(2)にマップされます。

- INTERVAL '30' SECOND(2,2) は、INTERVAL '00 00:00:30.00' DAY TO SECOND(2)にマップされます。

INTERVAL YEAR TO MONTH

INTERVAL YEAR TO MONTH外部データ型には、YEARとMONTHの日時フィールドを使用して、2つの日時の値の差異が格納されます。INTERVAL YEAR TO MONTHは、次のように指定します。

INTERVAL YEAR [(year_precision)] TO MONTH

プレースホルダyear_precisionは、YEAR日時フィールドの桁数です。year_precisionのデフォルト値は2です。INTERVAL YEAR TO MONTHリテラルをデフォルト以外のyear_precisionで指定するには、このリテラル内に精度を指定する必要があります。たとえば、次のINTERVAL YEAR TO MONTHリテラルは、123年2か月の間隔を示しています。

INTERVAL '123-2' YEAR(3) TO MONTH

また、INTERVAL YEAR TO MONTHリテラルの省略フォームも使用できます。たとえば、次のとおりです。

- INTERVAL '10' MONTHは、INTERVAL '0-10' YEAR TO MONTHにマップされます。

- INTERVAL '123' YEAR(3)は、INTERVAL '123-0' YEAR(3) TO MONTHにマップされます。

LONG

LONG外部データ型には、LONGデータ型の列に4001バイト以上、2GBまでの文字列が格納されます。この型の列は、長い文字列の格納と取出しにのみ使用されます。メソッド、式またはWHERE句では使用できません。LONG列の値は、通常、文字列との間で変換されます。

LONG RAW

LONG RAW外部データ型は、最大2GBのデータを格納できることを除けば、RAW外部データ型と同じです。

LONG VARCHAR

LONG VARCHAR外部データ型には、OracleのLONG列へのデータおよびこの列からのデータが格納されます。先頭の4バイトには、項目の長さが記述されます。LONG VARCHARの最大長は2GBです。

LONG VARRAW

LONG VARRAW外部データ型には、OracleのLONG RAW列へのデータおよびこの列からのデータが格納されます。長さは、先頭の4バイトに記述されます。最大長は2GBです。

NCLOB

NCLOB外部データ型は、CLOBの各国語キャラクタ・バージョンです。この外部データ型には、マルチバイトで固定幅の各国語キャラクタ・セットのキャラクタ（NCHAR）または可変幅キャラクタ・セットのデータが格納されます。NCLOBには、最大4GBの文字テキスト・データを格納できます。

NCLOBには、完全なトランザクション・サポートがあります。OCCIを使用して行われた変更は、すべてトランザクションに反映されます。NCLOB値に対して行った操作は、コミットまたはロールバックできます。1つのトランザクション内で変数のNCLOBロケータを保存し、次にそれを別のトランザクションまたはセッションで使用することはできません。

NCLOB属性を指定してオブジェクトを作成することはできませんが、メソッドでNCLOBパラメータを指定することは可能です。

NUMBER

NUMBERを外部データ型として使用する必要はほとんどありません。NUMBERを使用すると、Oracleでは21バイトの内部2進形式で数値を戻し、入力時にこの形式が必要になります。完全な情報が必要な場合は、次の説明を参照してください。

Oracleでは、NUMBERデータ型の値が可変長形式で格納されます。最初のバイトは指数であり、その後に1〜20個の仮数バイトが続きます。指数バイトの上位ビットは符号ビットです。正数の場合はそのビットが設定され、負数の場合は消去されます。下位の7ビットは指数を表します。この指数はオフセット65で基本100の数字です。

10進数の指数を計算するには、基本100の指数に65を加算し、数値が正数の場合はさらに128を加算します。数値が負数の場合も同様に計算しますが、後でビットが反転されます。たとえば、-5の場合は、基本100の指数 = 62（0x3e）になります。したがって、10進数の指数は、（~0x3e）-128-65 = 0xc1-128-65 = 193-128-65 = 0になります。

各仮数バイトは基本100で範囲1〜100の数字です。正数の場合は、それに1を加算した数字となります。したがって、値5に対する仮数は6です。負数の場合は、1を加算するかわりに、その数字が101から減算されます。つまり、数値-5に対する仮数は、101-5 = 96となります。負数には、102が含まれているバイトがデータ・バイトの後に追加されます。ただし、20個の仮数バイトを持つ負数には、102のバイトは後続しません。仮数バイトは基本100であるため、各バイトは2桁の10進数値を表すことができます。仮数は正規化され、先行する0（ゼロ）は格納されません。

仮数を表すために最大20個のデータ・バイトを使用できます。ただし、精度が保証されているのは19個のみです。19個のデータ・バイトは、それぞれ基本100を表し、NUMBER内部データ型に対して38桁の最大精度を提供します。

このデータ型は、C++のNumberデータ型に対応するOCCI NUMBERとは異なります。

OCCI BFILE

関連項目
第13章「OCCI Application Program Interface (API)」の「Bfileクラス」

OCCI BLOB

関連項目
第13章「OCCI Application Program Interface（API）」の「Blobクラス」

OCCI BYTES

関連項目
第13章「OCCI Application Program Interface（API）」の「Bytesクラス」

OCCI CLOB

関連項目
第13章「OCCI Application Program Interface（API）」の「Clobクラス」

OCCI DATE

関連項目
第13章「OCCI Application Program Interface（API）」の「Dateクラス」

OCCI INTERVALDS

関連項目
第13章「OCCI Application Program Interface (API)」の「IntervalDSクラス」

OCCI INTERVALYM

関連項目
第13章「OCCI Application Program Interface (API)」の「IntervalYMクラス」

OCCI NUMBER

関連項目
第13章「OCCI Application Program Interface（API）」の「Numberクラス」

OCCI POBJECT

関連項目
第13章「OCCI Application Program Interface（API）」の「PObjectクラス」

OCCI REF

関連項目
第13章「OCCI Application Program Interface（API）」の「Refクラス」

OCCI REFANY

関連項目
第13章「OCCI Application Program Interface (API)」の「RefAnyクラス」

OCCI STRING

OCCI STRING外部データ型は、STL String型に対応しています。

OCCI TIMESTAMP

関連項目
第13章「OCCI Application Program Interface（API）」の「Timestampクラス」

OCCI VECTOR

OCCI VECTOR外部データ型は、ネストした表やVARRAYなどのコレクションを表すために使用されます。CREATE TYPE num_type as VARRAY OF NUMBER(10)は、C++アプリケーションではvector<int>、vector<Number>として表すことができます。

RAW

RAW外部データ型は、Oracleで解釈または処理されないバイナリ・データやバイト列で使用されます。たとえば、RAWは図形の文字列で使用できます。RAW列の最大長は2000バイトです。

Oracle表内のRAWデータが文字列に変換される場合、データは16進コードで表されます。RAWデータの各バイトは、それぞれの値を示す00〜FFの範囲の2文字で表されます。RAWを使用して文字列を入力する場合は、16進コードを使用する必要があります。

REF

REF外部データ型は、名前付きデータ型に対する参照です。アプリケーションで使用するためにREFを割り当てるには、REFへのポインタとして変数を宣言します。

ROWID

ROWID外部データ型は、データベース表内の特定の行を識別します。多くの場合、ROWIDは次の例にあるような文の発行による問合せで戻されます。

SELECT ROWID, var1, var2 FROM db;

戻されたROWIDは、後続のDELETE文で使用できます。

UPDATE操作でSELECTを実行する場合は、ROWIDが暗黙的に戻されます。

STRING

STRING外部データ型は、VARCHAR2外部データ型(データ型コード1)のように動作します。ただし、STRING外部データ型は、NULLで終了する必要があります。

このデータ型は、C++ STL文字列データ型に対応するOCCI STRINGとは異なります。

TIMESTAMP

TIMESTAMP外部データ型は、DATEデータ型を拡張したデータ型です。この外部データ型には、DATEデータ型の年、月および日に加えて、時間、分および秒の各値が格納されます。TIMESTAMPデータ型は、次のように指定します。

TIMESTAMP [(fractional_seconds_precision)]

プレースホルダfractional_seconds_precisionでは、必要に応じて、SECOND日時フィールドの小数部分の桁数を0〜9の範囲で指定します。デフォルト値は6です。たとえば、次のようにTIMESTAMP(2)をリテラルとして指定します。

TIMESTAMP '1997-01-31 09:26:50.10'

このデータ型は、OCCI TIMESTAMPとは異なります。

TIMESTAMP WITH LOCAL TIME ZONE

TIMESTAMP WITH TIME ZONE (TSTZ)外部データ型はTIMESTAMPの改良型で、その値に明示的なタイム・ゾーン置換が含まれています。タイム・ゾーン置換は、現地時間とUTC（協定世界時、以前はグリニッジ標準時）との差異（時分による）です。TIMESTAMP WITH TIME ZONEデータ型は、次のように指定します。

TIMESTAMP(fractional_seconds_precision) WITH TIME ZONE

プレースホルダfractional_seconds_precisionでは、必要に応じて、SECOND日時フィールドの小数部分の桁数を0〜9の範囲で指定します。デフォルトは6です。

2つのTIMESTAMP WITH TIME ZONEの値がUTCで同じ時刻を表している場合は、データに格納されているTIME ZONEオフセットに関係なく同一とみなされます。

TIMESTAMP WITH TIME ZONE

TIMESTAMP WITH TIME ZONE外部データ型はTIMESTAMPの改良型で、その値にタイム・ゾーン置換が含まれています。タイム・ゾーン置換は、現地時間とUTC（協定世界時、以前はグリニッジ標準時）との差異（時分による）です。TIMESTAMP WITH TIME ZONEデータ型は、次のように指定します。

TIMESTAMP [(fractional_seconds_precision)] WITH TIME ZONE

プレースホルダfractional_seconds_precisionでは、必要に応じて、SECOND日時フィールドの小数部分の桁数を0〜9の範囲で指定します。デフォルトは6です。たとえば、次のようにTIMESTAMP(0) WITH TIME ZONEをリテラルとして指定します。

TIMESTAMP '1997-01-31 09:26:50+02.00'

UNSIGNED INT

UNSIGNED INT外部データ型は、符号なし2進整数に対して使用されます。バイト単位のサイズは、オペレーティング・システムによって異なります。ワード内のバイトの順序は、ホスト・システムのアーキテクチャによって決まります。Oracleから出力される数値が整数でない場合は、小数部分が切り捨てられ、エラーは戻りません。戻される数値が、オペレーティング・システムの符号なし整数より大きくて表現できない場合は、変換時のオーバーフロー・エラーが戻されます。

VARCHAR

VARCHAR外部データ型には、可変長の文字列が格納されます。先頭の2バイトには文字列の長さが記述され、残りのバイトには実際の文字列が含まれます。バインドまたは定義コールで指定する文字列の長さには、この2バイトを含める必要があるため、VARCHAR文字列の最大長は、65535バイトではなく、65533バイトになります。これより長い文字列を変換する場合は、LONG VARCHAR外部データ型を使用します。

VARCHAR2

VARCHAR2外部データ型は、最大4000バイトの可変長文字列です。

VARNUM

VARNUM外部データ型は、最初のバイトに数値表現の長さが含まれることを除けば、NUMBER外部データ型と同じです。この長さを示す値には、長さを記述するバイト自体は含まれません。最大長のVARNUMに備えて、22バイトを確保してください。VARNUMの値をデータベースに送信するときは、長さを記述するバイトを設定する必要があります。

表5-4 VARNUMの例

10進数

長さバイト

指数バイト

仮数バイト

終了文字バイト

0

1

128

該当なし

該当なし

5

2

193

6

該当なし

-5

3

62

96

102

2767

3

194

28, 68

該当なし

-2767

4

61

74, 34

102

100000

2

195

11

該当なし

1234567

5

196

2, 24, 46, 68

該当なし

VARRAW

VARRAW外部データ型は、最初の2バイトにデータの長さを記述することを除けば、RAW外部データ型と同じです。バインドまたは定義コールで指定する文字列の長さには、この2バイトが含まれている必要があります。したがって、送受信可能なVARRAW文字列の最大長は、65535バイトではなく、65533バイトになります。これより長い文字列を変換する場合は、LONG VARRAWデータ型を使用します。

NATIVE DOUBLE

この外部データ型は、IEEE754標準の倍精度浮動小数点データ型を実装します。数値は、ホスト・システム固有の浮動小数点フォーマットで表されます。データ型は、バイトと同等の標準フォーマットでOracleサーバーに格納されます。格納するには、長さを記述するバイトを含む8バイトが必要です。これは、Oracle NUMBERの代替として使用でき、NUMBERに比べて次の利点があります。

- 格納に使用するバイト数が少なくて済みます。

- RDBMSクライアントで使用されるデータ型と一致します。

- 科学計算で使用される様々な値をサポートします。

NATIVE FLOAT

この外部データ型は、IEEE754の単精度浮動小数点データ型を実装します。数値は、ホスト・システム固有の浮動小数点フォーマットで表されます。データ型は、バイトと同等の標準フォーマットでOracleサーバーに格納されます。格納するためには、長さを記述するバイトを含む4バイトが必要です。これは、Oracle NUMBERの代替として使用でき、NUMBERに比べて次の利点があります。

- 格納に使用するバイト数が少なくて済みます。

- RDBMSクライアントで使用されるデータ型と一致します。

- 科学計算で使用される様々な値をサポートします。

データ変換

表5-5は、サポートされている、Oracle内部データ型から外部データ型への変換、および外部データ型から列の内部表現への変換を示しています。

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

- データベースに格納されているREFは、出力時にOCCI_SQLT_REFに変換されます。

- OCCI_SQLT_REFは、入力時にREFの内部表現に変換されます。

- データベースに格納されている名前付きデータ型は、出力時にOCCI_SQLT_NTY (アプリケーション内ではC構造体で表現されます)に変換されます。

- OCCI_SQLT_NTY (アプリケーション内ではC構造体で表現されます)は、入力時に、対応するデータ型の内部表現に変換されます。

- LOBとBFILEは、OCCIアプリケーション内では記述子で表現されるため、入出力時の変換はありません。

表5-5に示したように、変換には次の数値コードがあります。

1. データ型は、入力時にはOracle ROWID形式である必要があります。出力時は、Oracle ROWID形式で戻されます。

2. データ型は、入力時にはOracle DATE形式である必要があります。出力時は、Oracle DATE形式で戻されます。

3. データ型は、入力時には16進フォーマットである必要があります。出力時は、16進フォーマットで戻されます。

4. データ型は、出力時には有効な数値を表している必要があります。

5. 長さは2000文字以下であることが必要です。

6. データ型は、出力時には16進フォーマットで格納される必要があります。出力時は16進フォーマットです。

表5-5 外部データ型と内部データ型間のデータ変換

内部データ型

外部データ型

VARCHAR2

NUMBER

LONG

ROWID

DATE

RAW

LONG RAW

CHAR

BFLOAT

BDOUBLE

CHAR

I/O

I/O

I/O

I/O^1

I/O^2

I/O^3

I3、5

I/O

I/O

I/O

CHARZ

I/O

I/O

I/O

I/O^1

I/O^2

I/O^3

I3、5

I/O

-

-

DATE

I/O

-

I

-

I/O

-

-

I/O

-

-

DECIMAL

I/O^4

I/O

I

-

-

-

-

I/O^4

-

-

FLOAT

I/O^4

I/O

I

-

-

-

-

I/O^4

I/O

I/O

INTEGER

I/O^4

I/O

I

-

-

-

-

I/O^4

I/O

I/O

LONG

I/O

I/O

I/O

I/O^1

I/O^2

I/O^3

I/O3、5

I/O

I/O

I/O

LONG RAW

O^6

-

I5、6

-

-

I/O

I/O

O^6

-

-

LONG VARCHAR

I/O

I/O

I/O

I/O^1

I/O^2

I/O^3

I/O3、5

I/O

I/O

I/O

LONG VARRAW

I/O^6

-

I5、6

-

-

I/O

I/O

I/O^6

-

-

NUMBER

I/O^4

I/O

I

-

-

-

-

I/O^4

I/O

I/O

OCCI BDouble

I/O

I/O

I

-

-

-

-

I/O

I/O

I/O

OCCI BFloat

I/O

I/O

I

-

-

-

-

I/O

I/O

I/O

OCCI Bytes

I/O^6

-

I5、6

-

-

I/O

I/O

I/O^6

-

-

OCCI Date

I/O

-

I

-

I/O

-

-

I/O

-

-

OCCI Number

I/O^4

I/O

I

-

-

-

-

I/O^4

I/O

I/O

OCCI Timestamp

-

-

-

-

-

-

-

-

-

-

RAW

I/O^6

-

I5、6

-

-

I/O

I/O

I/O^6

-

-

ROWID

I

-

I

I/O

-

-

-

I

-

-

STL string

I/O

I/O

I/O

I/O^1

I/O^2

I/O^3

I/O^3

-

I/O^4

I/O^4

STRING

I/O

I/O

I/O

I/O^1

I/O^2

I/O^3

I/O3、5

I/O

I/O

I/O

UNSIGNED

I/O^4

I/O

I

-

-

-

-

I/O^4

I/O

I/O

VARCHAR

I/O

I/O

I/O

I/O^1

I/O^2

I/O^3

I/O^3

-

I/O

I/O

VARCHAR2

I/O

I/O

I/O

I/O^1

I/O^2

I/O^3

I/O3、5

I/O

I/O

I/O

VARNUM

I/O^4

I/O

I

-

-

-

-

I/O^4

I/O

I/O

VARRAW

I/O^6

-

I5、6

-

-

I/O

I/O

I/O^6

-

-

LOBデータ型のデータ変換

表5-6 LOBのデータ変換

外部データ型

内部データ型

CLOB

BLOB

VARCHAR

I/O

-

CHAR

I/O

-

LONG

I/O

-

LONG VARCHAR

I/O

-

STL String

I/O

-

RAW

-

I/O

VARRAW

-

I/O

LONG RAW

-

I/O

LONG VARRAW

-

I/O

OCCI Bytes

-

I/O

関連項目
LOBデータ型の概要については、『Oracle Database SecureFilesおよびラージ・オブジェクト開発者ガイド』を参照してください。

日付、タイムスタンプおよび間隔データ型のデータ変換

文字データ型を、日時列または間隔列のフェッチ操作または挿入操作で使用するホスト変数に対して使用することもできます。Oracleでは、文字データ型と日時/間隔データ型との間の変換が行われます。

表5-7 日付、タイムスタンプおよび間隔データ型のデータ変換

外部型

内部型

VARCHAR、CHAR

DATE

TS

TSTZ

TSLTZ

INTERVAL YEAR TO MONTH

INTERVAL DAY TO SECOND

VARCHAR2、CHAR

I/O

I/O

I/O

I/O

I/O

I/O

I/O

STL String

I/O

I/O

I/O

I/O

I/O

I/O

I/O

DATE

I/O

I/O

I/O

I/O

I/O

-

-

OCCI Date

I/O

I/O

I/O

I/O

I/O

-

-

ANSI DATE

I/O

I/O

I/O

I/O

I/O

-

-

TIMESTAMP（TS）

I/O

I/O

I/O

I/O

I/O

-

-

OCCI Timestamp

I/O

I/O

I/O

I/O

I/O

-

-

TIMESTAMP WITH TIME ZONE（TSTZ）

I/O

I/O

I/O

I/O

I/O

-

-

TIMESTAMP WITH LOCAL TIME ZONE（TSLTZ）

I/O

I/O

I/O

I/O

I/O

-

-

INTERVAL YEAR TO MONTH

I/O

-

-

-

-

I/O

-

OCCI IntervalYM

I/O

-

-

-

-

I/O

-

INTERVAL DAY TO SECOND

I/O

-

-

-

-

-

I/O

OCCI IntervalDS

I/O

-

-

-

-

-

I/O

これらの変換は、日付、タイムスタンプおよび間隔データ型のデータ変換の場合に適用されます。

- タイム・ゾーンがあるソースをタイム・ゾーンのないターゲットに割り当てると、ソースのタイム・ゾーン部分は無視されます。タイム・ゾーンのないソースをタイム・ゾーンがあるターゲットに割り当てると、ターゲットのタイム・ゾーンには、セッションのデフォルト・タイム・ゾーンが設定されます。

- Oracle DATEをTIMESTAMPに割り当てると、DATEのTIME部分がTIMESTAMPにコピーされます。TIMESTAMPをOracle DATEに割り当てると、割当て後のDATEのTIME部分には0（ゼロ）が設定されます。この0（ゼロ）設定は、Oracle DATEからANSI準拠のDATETIMEデータ型への移行を容易にするために行われます。

- ANSI DATEをOracle DATEまたはTIMESTAMPに割り当てると、Oracle DATEのTIME部分とTIMESTAMPには0（ゼロ）が設定されます。Oracle DATEまたはTIMESTAMPをANSI DATEに割り当てると、TIME部分は無視されます。

- DATETIMEを文字列に割り当てると、DATETIMEは、セッションのデフォルトのDATETIME形式によって変換されます。文字列をDATETIMEに割り当てる場合は、その文字列にセッションのデフォルトのDATETIME形式に基づく有効なDATETIME値が含まれていることが必要です。

- 文字列をINTERVALに割り当てる場合、その文字列が有効なINTERVAL文字形式であることが必要です。

- TSLTZからCHAR、DATE、TIMESTAMPおよびTSTZへの変換時には、セッションのタイム・ゾーンに値が調整されます。

- CHAR、DATEおよびTIMESTAMPからTSLTZへの変換時には、そのセッションのタイム・ゾーンがメモリーに格納されます。

- TSLTZをANSI DATEに割り当てると、時間部分が0 (ゼロ)になります。

- TSTZからの変換時には、タイム・スタンプが存在しているタイム・ゾーンがメモリーに格納されます。

- 文字列を間隔に割り当てる場合、その文字列は有効な間隔の文字フォーマットである必要があります。

6 メタデータ

この章では、結果セットまたはデータベースに関するメタデータの取出し方法を説明します。

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

- メタデータの概要

- データベース・メタデータの記述

メタデータの概要

データベース・オブジェクトには、そのデータベース・オブジェクトを記述する様々な属性があります。DESCRIBE操作を実行すると、特定のスキーマ・オブジェクトに関する情報を取得できます。結果は、Metadataクラスのオブジェクトとしてアクセスできます。結果にアクセスするには、Metadataクラスの様々なメソッドに、オブジェクト属性を引数として渡します。

DESCRIBE操作を明示的に実行できる対象は、データベース全体、ResultSetクラスに含まれている列の型とプロパティ、または、スキーマ・オブジェクトとサブスキーマ・オブジェクト、たとえば、表、型、順序、ビュー、型属性、列、プロシージャ、型メソッド、引数、関数、コレクション、結果、パッケージ、シノニム、およびリストなどです。

検索する属性の型を指定する必要があります。MetaDataクラスのgetAttributeCount()、getAttributeId()およびgetAttributeType()の各メソッドを使用すると、使用可能な各属性をスキャンできます。

すべてのDESCRIBE情報は、その情報に対する最後の参照が削除されるまでキャッシュされます。この方法によって、開放されているDESCRIBE情報に、ユーザーが間違えてアクセスすることがなくなります。

メタデータが明示的な記述の場合は、ConnectionクラスのgetMetaData()メソッドをコールしてメタデータを取得します。また、結果セット列のメタデータを取得するには、ResultSetクラスのgetColumnListMetaData()メソッドをコールします。この2つのメソッドでは、詳細な情報を持つMetaDataオブジェクトが戻されます。MetaDataクラスには、この情報にアクセスするためのgetxxx()メソッドが用意されています。

関連項目
表13-27「MetaDataクラスで使用される列挙値」

DESCRIBE操作の実行時には、次の問題に注意してください。

- ATTR_TYPECODEでは、CREATE TYPE文で型を新規作成したときに指定した型を表す型コードが戻されます。これらの型コードは、TypeCode列挙型で、OCCI_TYPECODE定数によって表されます。内部PL/SQL型(ブール、索引付きの表)はサポートされていません。

- ATTR_DATA_TYPEでは、データベース列のデータ型を表す型が戻されます。これらの値は、Type列挙型です。たとえば、LONG型では、OCCI_SQLT_LNG型が戻されます。

データベース・メタデータの記述

データベース・メタデータの記述は、明示的なDESCRIBE操作と同じになります。記述対象のオブジェクトは、スキーマ内のオブジェクトである必要があります。型の記述では、getMetaData()メソッドを接続からコールし、オブジェクトの名前またはRefAnyオブジェクトを渡します。最初にOBJECTモードで環境を初期化する必要があります。getMetaData()メソッドでは、MetaData型のオブジェクトが戻されます。MetaData型の各オブジェクトには、記述ツリーの一部である属性のリストがあります。この記述ツリーを再帰的に横断して参照できるサブツリーで、詳細な情報を表示できます。オブジェクトに関する詳細情報は、getxxx()メソッドをコールして取得できます。

データベースとそのオブジェクトを再帰的に記述するブラウザの構築が必要な場合は、(データベースも含めて)そのデータベースにある各オブジェクトの属性数、属性IDのリストおよび属性型のリストに関する情報にアクセスできます。この情報を使用すると、記述ツリーを最上位ノード（データベース）から表の列、型の属性、プロシージャやファンクションのパラメータに至るまで、再帰的にたどることができます。

たとえば、表とその内容を記述するという典型的なケースを想定します。getMetaData()メソッドを接続からコールし、記述する表の名前を渡します。戻されたMetaDataオブジェクトには、表に関する情報が含まれています。記述するオブジェクト(表、列、型、コレクション、ファンクション、プロシージャなど)の型はわかっているため、属性リストを取得できます。対応するgetxxx()メソッドをコールすると、表に指定されている型の変数内に値を取り出すことができます。

表6-1 属性のグループ化

属性の型

説明

パラメータ属性

すべての要素に属する属性

表およびビューの属性

表およびビューに属する属性

プロシージャ、ファンクションおよびサブプログラムの属性

プロシージャ、ファンクションおよびパッケージ・サブプログラムに属する属性

パッケージ属性

パッケージに属する属性

型属性

型に属する属性

型属性の属性

型属性に属する属性

型メソッド属性

型メソッドに属する属性

コレクション属性

コレクション型に属する属性

シノニム属性

シノニムに属する属性

順序属性

順序に属する属性

列属性

表またはビューの列に属する属性

引数属性および結果属性

引数または結果に属する属性

リスト属性

リスト・タイプを指定する属性

スキーマ属性

スキーマに固有の属性

データベース属性

データベースに固有の属性

メタデータのコード例

この項では、メタデータを使用するためのコード例を示します。

- 例6-1 単純なデータベース表の属性に関するメタデータの取得方法

- 例6-2 ユーザー定義型を含む列からのメタデータの取得方法

- 例6-3 参照からのオブジェクト・メタデータの取得方法

- 例6-4 ResultSetオブジェクトからの選択リストに関するメタデータの取得方法

例6-1 単純なデータベース表の属性に関するメタデータの取得方法

この例は、単純なデータベース表の属性に関するメタデータの取得方法を示しています。

/* Create an environment and a connection to the HR database */
.
.
/* Call the getMetaData method on the Connection object obtainedv*/
MetaData emptab_metaData = connection->getMetaData(
"EMPLOYEES", MetaData::PTYPE_TABLE);
/* Now that you have the metadata information on the EMPLOYEES table,
call the getxxx methods using the appropriate attributes */

/* Call getString */
cout<<"Schema:"<<
(emptab_metaData.getString(MetaData::ATTR_OBJ_SCHEMA))<<endl;

if(emptab_metaData.getInt(
emptab_metaData::ATTR_PTYPE)==MetaData::PTYPE_TABLE)
cout<<"EMPLOYEES is a table"<<endl;
else
cout<<"EMPLOYEES is not a table"<<endl;

/* Call getInt to get the number of columns in the table */
int columnCount=emptab_metaData.getInt(MetaData::ATTR_NUM_COLS);
cout<<"Number of Columns:"<<columnCount<<endl;

/* Call getTimestamp to get the timestamp of the table object */
Timestamp tstamp = emptab_metaData.getTimestamp(MetaData::ATTR_TIMESTAMP);
/* Now that you have the value of the attribute as a Timestamp object,
you can call methods to obtain the components of the timestamp */
int year;
unsigned int month, day;
tstamp.getData(year, month, day);

/* Call getVector for attributes of list type, such as ATTR_LIST_COLUMNS */
vector<MetaData>listOfColumns;
listOfColumns=emptab_metaData.getVector(MetaData::ATTR_LIST_COLUMNS);

/* Each of the list elements represents a column metadata,
so now you can access the column attributes*/
for (int i=0;i<listOfColumns.size();i++
{
MetaData columnObj=listOfColumns[i];
cout<<"Column Name:"<<(columnObj.getString(MetaData::ATTR_NAME))<<endl;
cout<<"Data Type:"<<(columnObj.getInt(MetaData::ATTR_DATA_TYPE))<<endl;
.
.
/* and so on to obtain metadata on other column specific attributes */
}

例6-2 ユーザー定義型を含む列からのメタデータの取得方法

この例は、データベース表のユーザー定義型を含む列からのメタデータの取得方法を示しています。

/* Create an environment and a connection to the HR database */
...
/* Call the getMetaData method on the Connection object obtained */
MetaData custtab_metaData = connection->getMetaData(
"CUSTOMERS", MetaData::PTYPE_TABLE);

/* Have metadata information on CUSTOMERS table; call the getxxx methods */
/* Call getString */
cout<<"Schema:"<<(custtab_metaData.getString(MetaData::ATTR_OBJ_SCHEMA))
<<endl;
if(custtab_metaData.getInt(custtab_metaData::ATTR_PTYPE)==MetaData::PTYPE_TABLE)
cout<<"CUSTOMERS is a table"<<endl;
else
cout<<"CUSTOMERS is not a table"<<endl;

/* Call getVector to obtain list of columns in the CUSTOMERS table */
vector<MetaData>listOfColumns;
listOfColumns=custtab_metaData.getVector(MetaData::ATTR_LIST_COLUMNS);

/* Assuming metadata for column cust_address_typ is fourth element in list*/
MetaData customer_address=listOfColumns[3];

/* Obtain the metadata for the customer_address attribute */
int typcode = customer_address.getInt(MetaData::ATTR_TYPECODE);
if(typcode==OCCI_TYPECODE_OBJECT)
cout<<"customer_address is an object type"<<endl;
else
cout<<"customer_address is not an object type"<<endl;

string objectName=customer_address.getString(MetaData::ATTR_OBJ_NAME);

/* Now that you have the name of the address object,
the metadata of the attributes of the type can be obtained by using
getMetaData on the connection by passing the object name
*/
MetaData address = connection->getMetaData(objectName);

/* Call getVector to obtain the list of the address object attributes */
vector<MetaData> attributeList =
address.getVector(MetaData::ATT_LIST_TYPE_ATTRS);

/* and so on to obtain metadata on other address object specific attributes */

例6-3 参照からのオブジェクト・メタデータの取得方法

この例は、オブジェクトへの参照が使用されているときに、そのオブジェクトに関するメタデータを取得する方法を示しています。

Type ADDRESS(street VARCHAR2(50), city VARCHAR2(20));
Table Person(id NUMBER, addr REF ADDRESS);

/* Create an environment and a connection to the HR database */
.
.
/* Call the getMetaData method on the Connection object obtained */
MetaData perstab_metaData = connection->getMetaData(
"Person", MetaData::PTYPE_TABLE);

/* Now that you have the metadata information on the Person table,
call the getxxx methods using the appropriate attributes */
/* Call getString */
cout<<"Schema:"<<(perstab_metaData.getString(MetaData::ATTR_OBJ_SCHEMA))<<endl;

if(perstab_metaData.getInt(perstab_metaData::ATTR_PTYPE)==MetaData::PTYPE_TABLE)
cout<<"Person is a table"<<endl;
else
cout<<"Person is not a table"<<endl;

/* Call getVector to obtain the list of columns in the Person table*/
vector<MetaData>listOfColumns;
listOfColumns=perstab_metaData.getVector(MetaData::ATTR_LIST_COLUMNS);

/* Each of the list elements represents a column metadata,
so now get the data type of the column by passing ATTR_DATA_TYPE
to getInt */
for(int i=0;i<numCols;i++)
{
int dataType=colList[i].getInt(MetaData::ATTR_DATA_TYPE);
/* If the data type is a reference, get the Ref and obtain the metadata
about the object by passing the Ref to getMetaData */
if(dataType==SQLT_REF)
RefAny refTdo=colList[i].getRef(MetaData::ATTR_REF_TDO);

/* Now you can obtain the metadata about the object as shown
MetaData tdo_metaData=connection->getMetaData(refTdo);

/* Now that you have the metadata about the TDO, you can obtain the metadata
about the object */
}

例6-4 ResultSetオブジェクトからの選択リストに関するメタデータの取得方法

この例は、ResultSetからの選択リストに関するメタデータの取得方法について示しています。

/* Create an environment and a connection to the database */
...
/* Create a statement and associate it with a select clause */
string sqlStmt="SELECT * FROM EMPLOYEES";
Statement *stmt=conn->createStatement(sqlStmt);

/* Execute the statement to obtain a ResultSet */
ResultSet *rset=stmt->executeQuery();

/* Obtain the metadata about the select list */
vector<MetaData>cmd=rset->getColumnListMetaData();

/* The metadata is a column list and each element is a column metaData */
int dataType=cmd[i].getInt(MetaData::ATTR_DATA_TYPE);
...

getMetaDataメソッドがコールされるのは、ATTR_COLLECTION_ELEMENT属性の場合のみです。

属性参照

この項では、スキーマ・オブジェクトとサブスキーマ・オブジェクトに属する属性について説明します。

パラメータ属性

すべての要素には、その要素に固有の属性およびいくつかの汎用属性があります。表6-2では、すべての要素に属する属性について説明します。

表6-2 すべての要素に属する属性

属性

説明

属性のデータ型

ATTR_OBJ_ID

オブジェクトIDまたはスキーマID。

unsigned int

ATTR_OBJ_NAME

オブジェクト名、スキーマ名またはデータベース名。

string

ATTR_OBJ_SCHEMA

オブジェクトが置かれているスキーマ。

string

ATTR_OBJ_PTYPE

パラメータによって記述される情報の型。可能な値は次のとおりです。

PTYPE_TABLE、表

PTYPE_VIEW、ビュー

PTYPE_PROC、プロシージャ

PTYPE_FUNC、ファンクション

PTYPE_PKG、パッケージ

PTYPE_TYPE、型

PTYPE_TYPE_ATTR、型の属性

PTYPE_TYPE_COLL、型情報のコレクション

PTYPE_TYPE_METHOD、型のメソッド

PTYPE_SYN、シノニム

PTYPE_SEQ、順序

PTYPE_COL、表またはビューの列

PTYPE_ARG、ファンクションまたはプロシージャの引数

PTYPE_TYPE_ARG、型のメソッドの引数

PTYPE_TYPE_RESULT、メソッドの結果

PTYPE_SCHEMA、スキーマ

PTYPE_DATABASE、データベース

int

ATTR_TIMESTAMP

この説明の基礎となるオブジェクトのTIMESTAMP（Oracle DATE形式）。

Timestamp

次の各項では、各種の要素に固有の属性を示しています。

表およびビューの属性

表またはビューのパラメータ（PTYPE_TABLE型またはPTYPE_VIEW型）には、表6-3に記載されている型固有の属性があります。

表6-3 表またはビューに属する属性

属性

説明

属性のデータ型

ATTR_OBJID

オブジェクトID。

unsigned int

ATTR_NUM_COLS

列数。

int

ATTR_LIST_COLUMNS

列リスト（PTYPE_LIST型）。

vector<MetaData>

ATTR_REF_TDO

記述されているオブジェクト型へのREF。

RefAny

ATTR_IS_TEMPORARY

表またはビューが一時的であるかどうかを識別します。

bool

ATTR_IS_TYPED

表またはビューが型指定かどうかを識別します。

bool

ATTR_DURATION

一時表の継続時間。指定できる値は次のとおりです。

- DURATION_SESSION（セッション）

- DURATION_TRANS（トランザクション）

- DURATION_NULL（一時表でない表）

int

表に属する追加属性は、表6-4に記載されています。

表6-4 表に固有の属性

属性

説明

属性のデータ型

ATTR_DBA

セグメント・ヘッダーのデータ・ブロック・アドレス。

unsigned int

ATTR_TABLESPACE

表がある表領域。

int

ATTR_CLUSTERED

表をクラスタ化するかどうかを識別します。

bool

ATTR_PARTITIONED

表をパーティション化するかどうかを識別します。

bool

ATTR_INDEX_ONLY

表が索引のみかどうかを識別します。

bool

プロシージャ、ファンクションおよびサブプログラムの属性

プロシージャまたはファンクションのパラメータ（PTYPE_PROC型またはPTYPE_FUNC型）には、表6-5に記載されている型固有の属性があります。

表6-5 プロシージャまたはファンクションに属する属性

属性

説明

属性のデータ型

ATTR_LIST_ARGUMENTS

引数のリスト。「リスト属性」を参照してください。

vector<MetaData>

ATTR_IS_INVOKER_RIGHTS

プロシージャまたはファンクションに対して実行者権限が設定されているかどうかを識別します。

int

パッケージ・サブプログラムに属する追加属性は、表6-6に記載されています。

表6-6 パッケージ・サブプログラムに属する属性

属性

説明

属性のデータ型

ATTR_NAME

プロシージャまたはファンクションの名前。

string

ATTR_OVERLOAD_ID

オーバーロードする側のID番号（これはプロシージャまたはファンクションがパッケージの一部でかつそれらをオーバーロードする場合に必要です）。戻り値は、PL/SQLファンクションまたはプロシージャによる直接問合せとは異なる可能性があります。

int

パッケージ属性

パッケージのパラメータ（PTYPE_PKG型）には、表6-7に記載されている型固有の属性があります。

表6-7 パッケージに属する属性

属性

説明

属性のデータ型

ATTR_LIST_SUBPROGRAMS

サブプログラムのリスト。「リスト属性」を参照してください。

vector<MetaData>

ATTR_IS_INVOKER_RIGHTS

パッケージに対して実行者権限が設定されているかどうかを識別します。

bool

型属性

型のパラメータ（PTYPE_TYPE型）には、表6-8に記載されている属性があります。

表6-8 型に属する属性

属性

説明

属性のデータ型

ATTR_REF_TDO

列の型がオブジェクト型の場合に、型の型記述子オブジェクトのメモリー内REFを戻します。

RefAny

ATTR_TYPECODE

型コードです。指定できる値は次のとおりです。

- OCCI_TYPECODE_OBJECT

- OCCI_TYPECODE_NAMEDCOLLECTION

int

ATTR_COLLECTION_TYPECODE

型がコレクションの場合のコレクションの型コード。これ以外の型の場合は無効です。指定できる値は次のとおりです。

- OCCI_TYPECODE_VARRAY

- OCCI_TYPECODE_TABLE

int

ATTR_VERSION

ユーザーによって割り当てられたバージョンが含まれるNULL終了文字列。

string

ATTR_IS_FINAL_TYPE

最終の型であるかどうかを識別します。

bool

ATTR_IS_INSTANTIABLE_TYPE

インスタンス化可能な型であるかどうかを識別します。

bool

ATTR_IS_SUBTYPE

サブタイプであるかどうかを識別します。

bool

ATTR_SUPERTYPE_SCHEMA_NAME

スーパータイプが含まれているスキーマの名前。

string

ATTR_SUPERTYPE_NAME

スーパータイプの名前。

string

ATTR_IS_INVOKER_RIGHTS

この型が実行者権限であるかどうかを識別します。

bool

ATTR_IS_INCOMPLETE_TYPE

この型が不完全かどうかを識別します。

bool

ATTR_IS_SYSTEM_TYPE

システムの型であるかどうかを識別します。

bool

ATTR_IS_PREDEFINED_TYPE

事前定義の型であるかどうかを識別します。

bool

ATTR_IS_TRANSIENT_TYPE

一時的な型であるかどうかを識別します。

bool

ATTR_IS_SYSTEM_GENERATED_TYPE

システム生成の型であるかどうかを識別します。

bool

ATTR_HAS_NESTED_TABLE

この型にネストした表の属性があるかどうかを識別します。

bool

ATTR_HAS_LOB

この型にLOB属性があるかどうかを識別します。

bool

ATTR_HAS_FILE

この型にFILE属性があるかどうかを識別します。

bool

ATTR_COLLECTION_ELEMENT

コレクション要素へのハンドル。

「コレクション属性」を参照してください。

MetaData

ATTR_NUM_TYPE_ATTRS

型属性の数。

unsigned int

ATTR_LIST_TYPE_ATTRS

型属性のリスト。

「リスト属性」を参照してください。

vector<MetaData>

ATTR_NUM_TYPE_METHODS

型メソッドの数。

unsigned int

ATTR_LIST_TYPE_METHODS

型メソッドのリスト。

「リスト属性」を参照してください。

vector<MetaData>

ATTR_MAP_METHOD

型のマップ・メソッド。

「型メソッド属性」を参照してください。

MetaData

ATTR_ORDER_METHOD

型のオーダー・メソッド。「型メソッド属性」を参照してください。

MetaData

型属性の属性

型の属性のパラメータ（PTYPE_TYPE_ATTR型）には、表6-9に記載されている属性があります。

表6-9 型属性に属する属性

属性

説明

属性のデータ型

ATTR_DATA_SIZE

型属性の最大サイズ。この長さは、文字列および行の文字数ではなくバイト数で戻されます。NUMBERについては22が戻されます。

int

ATTR_TYPECODE

型コード。

int

ATTR_DATA_TYPE

型属性のデータ型

int

ATTR_NAME

型属性名である文字列へのポインタ。

string

ATTR_PRECISION

数値型属性の精度。精度が0（ゼロ）以外で、スケールが-127である場合、FLOATとなります。それ以外の場合はNUMBER(p, s)となります。精度が0である場合、NUMBER(p, s)はNUMBERで表現できます。

int

ATTR_SCALE

数値型属性のスケール。精度が0（ゼロ）以外で、スケールが-127である場合、FLOATとなります。それ以外の場合はNUMBER(p, s)となります。精度が0である場合、NUMBER(p, s)はNUMBERで表現できます。

int

ATTR_TYPE_NAME

型名である文字列。データ型がSQLT_NTYまたはSQLT_REFである場合、戻り値には型名が含まれます。データ型がSQLT_NTYである場合、名前付きデータ型の型の名前が戻されます。データ型がSQLT_REFである場合、REFが指す名前付きデータ型の型名が戻されます。

string

ATTR_SCHEMA_NAME

型が作成されたスキーマ名が含まれる文字列。

string

ATTR_REF_TDO

列型がオブジェクト型である場合に、型のTDOのメモリー内REFが戻されます。

RefAny

ATTR_CHARSET_ID

型属性が文字列またはキャラクタ・タイプである場合のキャラクタ・セットID。

int

ATTR_CHARSET_FORM

型属性が文字列またはキャラクタ・タイプである場合のキャラクタ・セット・フォーム。

int

ATTR_FSPRECISION

日時または間隔における秒の小数部分の精度。

int

ATTR_LFPRECISION

間隔における整数部分のフィールドの精度。

int

型メソッド属性

型のメソッドのパラメータ（PTYPE_TYPE_METHOD型）には、表6-10に記載されている属性があります。

表6-10 型メソッドに属する属性

属性

説明

属性のデータ型

ATTR_NAME

メソッド（プロシージャまたはファンクション）の名前。

string

ATTR_ENCAPSULATION

メソッドのカプセル化レベル。指定できる値は次のとおりです。

- OCCI_TYPEENCAP_PRIVATE

- OCCI_TYPEENCAP_PUBLIC)

int

ATTR_LIST_ARGUMENTS

引数のリスト。

vector<MetaData>

ATTR_IS_CONSTRUCTOR

メソッドがコンストラクタであるかどうかを識別します。

bool

ATTR_IS_DESTRUCTOR

メソッドがデストラクタであるかどうかを識別します。

bool

ATTR_IS_OPERATOR

メソッドが演算子であるかどうかを識別します。

bool

ATTR_IS_SELFISH

メソッドが自己参照であるかどうかを識別します。

bool

ATTR_IS_MAP

メソッドがマップ・メソッドであるかどうかを識別します。

bool

ATTR_IS_ORDER

メソッドがオーダー・メソッドであるかどうかを識別します。

bool

ATTR_IS_RNDS

メソッドに対して「Read No Data State」が設定されているかどうかを識別します。

bool

ATTR_IS_RNPS

メソッドに対して「Read No Process State」が設定されているかどうかを識別します。

bool

ATTR_IS_WNDS

メソッドに対して「Write No Data State」が設定されているかどうかを識別します。

bool

ATTR_IS_WNPS

メソッドに対して「Write No Process State」が設定されているかどうかを識別します。

bool

ATTR_IS_FINAL_METHOD

最終のメソッドであるかどうかを識別します。

bool

ATTR_IS_INSTANTIABLE_METHOD

インスタンス化可能なメソッドであるかどうかを識別します。

bool

ATTR_IS_OVERRIDING_METHOD

オーバーライドする側のメソッドであるかどうかを識別します。

bool

コレクション属性

コレクション型のパラメータ（PTYPE_COLL型）には、表6-11に記載されている属性があります。

表6-11 コレクション型に属する属性

属性

説明

属性のデータ型

ATTR_DATA_SIZE

型属性の最大サイズ。この長さは、文字列および行の文字数ではなくバイト数で戻されます。NUMBERについては22が戻されます。

int

ATTR_TYPECODE

Typecode。

int

ATTR_DATA_TYPE

型属性のデータ型。

int

ATTR_NUM_ELEMENTS

配列内の要素数。配列であるコレクションについてのみ有効です。

unsigned int

ATTR_NAME

型属性名である文字列へのポインタ。

string

ATTR_PRECISION

数値型属性の精度。精度が0（ゼロ）以外で、スケールが-127である場合、FLOATとなります。それ以外の場合はNUMBER(p, s)となります。精度が0である場合、NUMBER(p, s)はNUMBERで表現できます。

int

ATTR_SCALE

数値型属性のスケール。精度が0（ゼロ）以外で、スケールが-127である場合、FLOATとなります。それ以外の場合はNUMBER(p, s)となります。精度が0である場合、NUMBER(p, s)はNUMBERで表現できます。

int

ATTR_TYPE_NAME

型名である文字列。データ型がSQLT_NTYまたはSQLT_REFである場合、戻り値には型名が含まれます。データ型がSQLT_NTYである場合、名前付きデータ型の型の名前が戻されます。データ型がSQLT_REFである場合、REFが指す名前付きデータ型の型名が戻されます。

string

ATTR_SCHEMA_NAME

型が作成されたスキーマ名が含まれる文字列。

string

ATTR_REF_TDO

型のTDOのメモリー内REFが戻されます。

RefAny

ATTR_CHARSET_ID

Typecode。

int

ATTR_CHARSET_FORM

型属性のデータ型。

int

シノニム属性

シノニムのパラメータ（PTYPE_SYN型）には、表6-12に記載されている属性があります。

表6-12 シノニムに属する属性

属性

説明

属性のデータ型

ATTR_OBJID

オブジェクトID。

unsigned int

ATTR_SCHEMA_NAME

シノニム変換のスキーマ名が含まれるNULL終了文字列。

string

ATTR_NAME

シノニム変換のオブジェクト名が含まれるNULL終了文字列。

string

ATTR_LINK

シノニム変換のデータベース・リンク名が含まれるNULL終了文字列。

string

順序属性

順序のパラメータ（PTYPE_SEQ型）には、表6-13に記載されている属性があります。

表6-13 順序に属する属性

属性

説明

属性のデータ型

ATTR_OBJID

オブジェクトID。

unsigned int

ATTR_MIN

最小値（Oracle NUMBER形式）。

Number

ATTR_MAX

最大値（Oracle NUMBER形式）。

Number

ATTR_INCR

増分数（Oracle NUMBER形式）。

Number

ATTR_CACHE

キャッシュされた順序番号の数。順序がキャッシュされた順序でない場合は、0（ゼロ）となります（Oracle NUMBER形式）。

Number

ATTR_ORDER

順序が順序指定されているかどうかを識別します。

bool

ATTR_HW_MARK

最高水位標（Oracle NUMBER形式）。

Number

列属性

表またはビューの列のパラメータ（PTYPE_COL型）には、表6-14に記載されている属性があります。

表6-14 表またはビューの列に属する属性

属性

説明

属性のデータ型

ATTR_DATA_SIZE

列の最大サイズ。この長さは、文字列および行の文字数ではなくバイト数で戻されます。NUMBERについては22が戻されます。

int

ATTR_DATA_TYPE

列のデータ型。

Type

ATTR_NAME

列名である文字列へのポインタ。

string

ATTR_PRECISION

精度を戻します。

int

ATTR_SCALE

数値列のスケール。精度が0（ゼロ）以外で、スケールが-127である場合、FLOATとなります。それ以外の場合はNUMBER(p, s)となります。精度が0である場合、NUMBER(p, s)はNUMBERで表現できます。

int

ATTR_IS_NULL

列にnull値が許可されていない場合、FALSEが戻されます。

bool

ATTR_TYPE_NAME

型名である文字列が戻されます。データ型がOCCI_SQLT_NTYまたはOCCI_SQLT_REFである場合、戻り値には型名が含まれます。データ型がOCCI_SQLT_NTYである場合、名前付きデータ型の型の名前が戻されます。データ型がOCCI_SQLT_REFである場合、REFが指す名前付きデータ型の型名が戻されます。

string

ATTR_SCHEMA_NAME

型が作成されたスキーマ名が含まれる文字列が戻されます。

string

ATTR_REF_TDO

列型がオブジェクト型である場合の、型のTDOのREF。

RefAny

ATTR_CHARSET_ID

文字の列のキャラクタ・セットID。設定されていない場合、キャラクタ・セットIDのデフォルトは直接パス・コンテキストで設定されたキャラクタ・セットIDになります。

int

ATTR_CHARSET_FORM

列のキャラクタ・セット・フォーム。この属性を設定すると、クライアント側のデータベースまたは各国語キャラクタ・セットの使用が指定されます。

int

引数属性および結果属性

引数、プロシージャ型またはファンクション型（PTYPE_ARG型）、型メソッド引数（PTYPE_TYPE_ARG型）、あるいはメソッド結果（PTYPE_TYPE_RESULT型）のパラメータには、表6-15に記載されている属性があります。

表6-15 引数または結果に属する属性

属性

説明

属性のデータ型

ATTR_NAME

引数名である文字列へのポインタが戻されます。

string

ATTR_POSITION

引数リスト内の引数の位置。常に0が戻されます。

int

ATTR_TYPECODE

Typecode。

int

ATTR_DATA_TYPE

引数のデータ型。

int

ATTR_DATA_SIZE

引数のデータ型のサイズ。この長さは、文字列および行の文字数ではなくバイト数で戻されます。NUMBERについては22が戻されます。

int

ATTR_PRECISION

数値引数の精度。精度が0（ゼロ）以外で、スケールが-127である場合、FLOATとなります。それ以外の場合はNUMBER(p, s)となります。精度が0である場合、NUMBER(p, s)はNUMBERで表現できます。

int

ATTR_SCALE

数値引数のスケール。精度が0（ゼロ）以外で、スケールが-127である場合、FLOATとなります。それ以外の場合はNUMBER(p, s)となります。精度が0である場合、NUMBER(p, s)はNUMBERで表現できます。

int

ATTR_LEVEL

データ型レベル。この属性では常に0が戻されます。

int

ATTR_HAS_DEFAULT

引数にデフォルト値があるかどうかを示します。

int

ATTR_LIST_ARGUMENTS

引数がレコードまたは表の型である場合の、次レベルにある引数のリスト。

vector<MetaData>

ATTR_IOMODE

引数モードを示します。有効な値は次のとおりです。

- IN（OCCI_TYPEPARAM_IN）の場合は0

- OUT（OCCI_TYPEPARAM_OUT）の場合は1

- IN/OUT（OCCI_TYPEPARAM_INOUT）の場合は2

int

ATTR_RADIX

基数が戻されます（数値型の場合）。

int

ATTR_IS_NULL

列にNULL値が許可されていない場合、FALSEが戻されます。

bool

ATTR_TYPE_NAME

型名(またはパッケージのローカル型の場合はパッケージ名)である文字列が戻されます。データ型がSQLT_NTYまたはSQLT_REFである場合、戻り値には型名が含まれます。データ型がSQLT_NTYである場合、名前付きデータ型の型の名前が戻されます。データ型がSQLT_REFである場合、REFが指す名前付きデータ型の型名が戻されます。

string

ATTR_SCHEMA_NAME

SQLT_NTYまたはSQLT_REFの場合、型が作成されたスキーマ名(またはローカル・パッケージ型の場合はパッケージ名)が含まれる文字列が戻されます。

string

ATTR_SUB_NAME

SQLT_NTYまたはSQLT_REFの場合、型名が含まれる文字列が戻されます。

string

ATTR_LINK

SQLT_NTYまたはSQLT_REFの場合、型が存在するデータベースのデータベース・リンク名が含まれる文字列が戻されます。パッケージがリモートの場合に、パッケージのローカル型に対してのみ該当します。

string

ATTR_REF_TDO

引数型がオブジェクトである場合、型のTDOのREFが戻されます。

RefAny

ATTR_CHARSET_ID

引数が文字列またはキャラクタ・タイプである場合、キャラクタ・セットIDが戻されます。

int

ATTR_CHARSET_FORM

引数が文字列またはキャラクタ・タイプである場合、キャラクタ・セット・フォームが戻されます。

int

リスト属性

リスト内のすべての要素についてリスト型の属性を記述できます。ファンクション引数リストの場合、位置0には戻り値のパラメータがあります（PTYPE_ARG）。

すべての要素についてリストが繰り返し記述されます。結果はC++ vector<MetaData>に格納されます。リスト型の属性を記述するには、getVector()メソッドをコールします。表6-16にリスト属性を示しています。

表6-16 ATTR_LIST_TYPEの値

可能な値

説明

ATTR_LIST_COLUMNS

列リスト

ATTR_LIST_ARGUMENTS

プロシージャまたはファンクションの引数リスト

ATTR_LIST_SUBPROGRAMS

サブプログラム・リスト

ATTR_LIST_TYPE_ATTRIBUTES

型属性リスト

ATTR_LIST_TYPE_METHODS

型メソッド・リスト

ATTR_LIST_OBJECTS

スキーマ内のオブジェクト・リスト

ATTR_LIST_SCHEMAS

データベース内のスキーマ・リスト

スキーマ属性

スキーマ型のパラメータ（PTYPE_SCHEMA型）には、表6-17に記載されている属性があります。

表6-17 スキーマに固有の属性

属性

説明

属性のデータ型

ATTR_LIST_OBJECTS

スキーマ内のオブジェクトのリスト

string

データベース属性

データベースのパラメータ（PTYPE_DATABASE型）には、表6-18に記載されている属性があります。

表6-18 データベースに固有の属性

属性

説明

属性のデータ型

ATTR_VERSION

データベースのバージョン。

string

ATTR_CHARSET_ID

サーバー・ハンドルからのデータベース・キャラクタ・セットID。

int

ATTR_NCHARSET_ID

サーバー・ハンドルからのデータベース・ネイティブ・キャラクタ・セットID。

int

ATTR_LIST_SCHEMAS

データベース内のスキーマのリスト（PTYPE_SCHEMA型）。

vector<MetaData>

ATTR_MAX_PROC_LEN

プロシージャ名の最大長。

unsigned int

ATTR_MAX_COLUMN_LEN

列名の最大長。

unsigned int

ATTR_CURSOR_COMMIT_BEHAVIOR

データベース内のカーソルおよびプリコンパイルされた文に対するCOMMIT操作の効果。値は次のとおりです。

- OCCI_CURSOR_OPEN（コミット操作前のカーソルの状態を保持）

- OCCI_CURSOR_CLOSED (カーソルはCOMMIT時にクローズされるものの、アプリケーションは文を再プリコンパイルなしで再度実行可能)

int

ATTR_MAX_CATALOG_NAMELEN

カタログ（データベース）名の最大長。

int

ATTR_CATALOG_LOCATION

修飾表内のカタログの位置。値は次のとおりです。

- OCCI_CL_START

- OCCI_CL_END

int

ATTR_SAVEPOINT_SUPPORT

データベースがセーブポイントをサポートしているかどうかを識別します。値は次のとおりです。

- OCCI_SP_SUPPORTED

- OCCI_SP_UNSUPPORTED

int

ATTR_NOWAIT_SUPPORT

データベースがNOWAIT句をサポートしているかどうかを識別します。値は次のとおりです。

- OCCI_NW_SUPPORTED

- OCCI_NW_UNSUPPORTED

int

ATTR_AUTOCOMMIT_DDL

DDL文に自動コミット・モードが必須かどうかを識別します。値は次のとおりです。

- OCCI_AC_DDL

- OCCI_NO_AC_DDL

int

ATTR_LOCKING_MODE

データベースのロック・モード。値は次のとおりです。

- OCCI_LOCK_IMMEDIATE

- OCCI_LOCK_DELAYED

int

7 LOBによるプログラミング

この章では、LOBおよびOCCIでの使用方法の概要を説明します。

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

- LOBの概要

- OCCIアプリケーションでのLOBの作成

- LOBのオープンおよびクローズの制限

- LOBの読込みおよび書込み

- LOB属性を含むオブジェクトの使用

- SecureFilesの使用

関連項目:
LOBの広範な情報については、『Oracle Database SecureFilesおよびラージ・オブジェクト開発者ガイド』を参照してください。

LOBの概要

Oracle C++ Call Interfaceには、ラージ・オブジェクト（LOB）に対して操作を実行するためのクラスおよびメソッドが含まれます。LOBは、データベースに対する位置に応じて、内部または外部のいずれかとなります。

内部LOBの概要

内部LOBは、領域を最適化し効率的なアクセスを可能にする方法で、データベース表領域内に格納されます。内部LOBではコピー・セマンティクスが使用され、サーバーのトランザクション・モデルに反映されます。トランザクションまたはメディアの障害が発生した後で、内部LOBをリカバリできます。また、内部LOB値への変更はコミットまたはロールバックできます。内部LOBのインスタンスを定義するには、次の3つのSQLデータ型があります。

- BLOB: 値が非構造化バイナリ(RAW)データで構成されているLOB

- CLOB: Oracleデータベースに対して定義されたデータベース・キャラクタ・セットに対応する文字データで値が構成されているLOB

- NCLOB: Oracleデータベースに対して定義された各国語キャラクタ・セットに対応する文字データで値が構成されているLOB

LOBのコピー・セマンティクスは、LOBを挿入する際や、同じ表内の別の行に含まれるLOBでLOBを更新する際に、LOBロケータおよびLOB値の両方がコピーされるよう指示します。つまり、各行にLOB値のコピーが置かれます。

外部LOBの概要

BFILEは、データベース表領域外のオペレーティング・システム・ファイルに格納されたラージ・バイナリ(RAW)データのオブジェクト・データです。そのため、外部LOBと呼ばれます。これらのファイルでは参照セマンティクスが使用されます。ここでは、同じ表内での挿入または更新時に、LOBのロケータのみが複製されます。BFILEは、ハード・ディスクなどの従来の2次ストレージ・デバイスの他に、CD-ROM、PhotoCDおよびDVDなどの3次ブロック・ストレージ・デバイスにも格納できます。BFILEデータ型を使用すると、データベース・サーバーのファイル・システムにあるラージ・ファイルに読取り専用バイト・ストリームによるアクセスが可能となります。基礎となるサーバーのオペレーティング・システムが、ストリーム・モードによるこれらのファイルへのアクセスをサポートしている場合、OracleからBFILEにアクセスできます。

外部LOBはトランザクションに反映されません。基礎となるファイルおよびオペレーティング・システムによって、整合性および永続性についてのサポートが提供される必要があります。外部LOBは単一デバイスに置く必要があります。つまり、ディスク・アレイ全体でストライプ化することはできません。

LOBの格納

LOB値の格納場所を決定するのは、主にそのサイズです。LOB値は、行データとインラインに、または行の外に格納されます。

- ロケータ格納: LOB値の実際の場所へのポインタであるLOBロケータは、行データとインラインに格納されており、LOB値の格納場所を示します。
内部LOBの場合、データベース表領域に格納されたLOB値へのロケータがLOB列に格納されます。各内部LOB列および特定の行の属性には、それぞれ一意のLOBロケータと、データベース表領域に格納されたLOB値の個別コピーが含まれます。

外部LOBの場合、BFILEが格納された外部オペレーティング・システム・ファイルへのロケータがLOB列に格納されます。各外部LOB列および指定行の属性には、それぞれのBFILEロケータがあります。ただし、2つの異なる行に、同じオペレーティング・システム・ファイルを指すBFILEロケータが含まれる場合があります。

- インライン格納: LOBに格納されているデータは、LOB値と呼ばれます。内部LOBの値は、他の行データとインラインに格納される場合とそうでない場合があります。DISABLE STORAGE IN ROWを設定せず、内部LOB値が約4,000バイトを下回る場合、この値はインラインに格納されます。それ以外の場合は、行の外に格納されます。
LOBはラージ・オブジェクトであるため、アプリケーションで小規模のLOBと大規模のLOBが混在する場合、インライン格納のみが関係します。LOB値は、約4,000バイトを超えると行の外に自動的に移動されます。

OCCIアプリケーションでのLOBの作成

アプリケーションでLOBを使用するには、次の手順を実行します。

- データベースで新規LOBロケータを初期化します。

- LOBに値を割り当てます。BFILEの場合、有効な外部ファイルへの参照を割り当てます。

- LOBにアクセスして操作するには、アプリケーションでLOBを使用するためのメソッドを実装したOCCIクラスを参照してください。第13章「OCCI Application Program Interface（API）」に、すべての詳細が記述されています。

- Bfileクラスには、BFILE用のAPIが含まれます(表13-7を参照)。

- Blobクラスには、BLOB用のAPIが含まれます(表13-8を参照)。

- Clobクラスには、CLOBおよびNCLOB用のAPIが含まれます(表13-10を参照)。

- 書込み、コピー、切捨ておよび類似した操作によって内部LOB列または属性を変更する場合は、必ずターゲットLOBが含まれる行をロックする必要があります。SELECT...FOR UPDATE文を使用して、LOBロケータを選択します。

- LOB書込みコマンドを成功させるには、トランザクションをオープンしておく必要があります。したがって、トランザクションをコミットする前にデータを書き込む必要があります(COMMITによってトランザクションがクローズするため)。オープンしておかないと、SELECT...FOR UPDATE文を再発行して行を再ロックする必要があります。OCCIの各LOBクラス実装には、open()メソッドおよびclose()メソッドがあります。LOBがオープンされているかどうかをチェックするには、クラスのisOpen()メソッドをコールします。

- open()メソッド、close()メソッドおよびisOpen()メソッドは、一連のLOB操作の最初と最後をマークする際にも使用する必要があります。LOBが変更された場合は、常に拡張可能索引の更新がトリガーされます。これらの変更がopen() ... close()コード・ブロック内で行われた場合、個々のトリガーはclose()コール後まで無効化され、その後同時に発行されます。この実装によって、LOBがクローズされているときに、索引の更新などのメンテナンス操作を効率的に処理できます。ただし、これはopen() ... close()コード・ブロックの実行中は拡張可能索引が無効であることも意味します。
内部LOBの場合、オープンの概念はLOBロケータではなくLOBに関連付けられている点に注意してください。LOBロケータには、LOBロケータが参照するLOBがオープンしているかどうかの情報は格納されていません。複数のLOBロケータが同じオープンLOBを指す可能性があります。ただし、外部LOBの場合、オープンは特定の外部LOBロケータに関連付けられています。したがって、異なる外部LOBロケータを使用して、同じBFILEに対し複数のopen()コールを実行できます。

LOBのオープンおよびクローズの制限

オープンLOB値をクローズする必要があるトランザクションの定義は、次のいずれかとなります。

- SET TRANSACTIONおよびCOMMITの間

- DATA MODIFYING DMLおよびCOMMITの間

- SELECT...FOR UPDATEおよびCOMMITの間

- 自律型トランザクション・ブロック内

LOBのオープンおよびクローズのメカニズムには、次の制限があります。

- トランザクションをコミットする前に、アプリケーションでオープンしているすべてのLOBをクローズする必要があります。さもないとエラーが発生します。トランザクションがロールバックされた場合、オープンLOBはすべて変更とともに廃棄されるため、関連付けられたトリガーは起動されません。

- オープン内部LOBの数には制限はありませんが、オープン・ファイルの数には制限があります。オープンしているロケータを別のロケータに割り当てた場合、新規LOBのオープンとみなされない点に注意してください。

- ロケータが異なるかどうかにかかわらず、同じトランザクション内で同じ内部LOBを2回オープンまたはクローズするとエラーになります。

- オープンしていないLOBをクローズするとエラーになります。

LOBの読込みおよび書込み

LOBの読込みおよび書込みには、非ストリームおよびストリームという一般的な2つのメソッドがあります。

LOBの読込み

例7-1は、非ストリーム・メソッドを使用して、NULL以外の内部LOBからデータを取得する方法を示しています。このメソッドでは、読込みオフセットおよび残りの読込み量を追跡し、これらの値をread()メソッドに渡す必要があります。

例7-1 非ストリームBLOBの読込み方法

ResultSet *rset=stmt->executeQuery("SELECT ad_composite FROM print_media
WHERE product_id=6666");
while(rset->next())
{
Blob blob=rset->getBlob(1);
if(blob.isNull())
cerr <<"Null Blob"<<endl;
else
{
blob.open(OCCI_LOB_READONLY);

const unsigned int BUFSIZE=100;
char buffer[BUFSIZE];
unsigned int readAmt=BUFSIZE;
unsigned int offset=1;

//reading readAmt bytes from offset 1
blob.read(readAmt,buffer,BUFSIZE,offset);

//process information in buffer
...
blob.close();
}
}
stmt->closeResultSet(rset);

例7-2は類似しているもので、BFILEロケータがNULLでない場合に、非ストリーム読込みを使用して、BFILEからデータを読み込む方法を示しています。

例7-2 非ストリームBFILEの読込み方法

ResultSet *rset=stmt->executeQuery("SELECT ad_graphic FROM print_media
WHERE product_id=6666");
while(rset->next())
{
Bfile file=rset->getBfile(1);
if(bfile.isNull())
cerr <<"Null Bfile"<<endl;
else
{
//display the directory alias and the file name of the BFILE
cout <<"File Name:"<<bfile.getFileName()<<endl;
cout <<"Directory Alias:"<<bfile.getDirAlias()<<endl;

if(bfile.fileExists())
{
unsigned int length=bfile.length();
char *buffer=new char[length];
bfile.read(length, buffer, length, 1);
//read all the contents of the BFILE into buffer, then process
...
delete[] buffer;
}
else
cerr <<"File does not exist"<<endl;
}
}
stmt->closeResultSet(rset);

例7-1および例7-2とは異なり、例7-3に示しているNULL以外のBLOBでのストリーム読込みでは、オフセットの追跡は必要ありません。

例7-3 ストリームBLOBの読込み方法

ResultSet *rset=stmt->executeQuery("SELECT ad_composite FROM print_media
WHERE product_id=6666");
while(rset->next())
{
Blob blob=rset->getBlob(1);
if(blob.isNull())
cerr <<"Null Blob"<<endl;
else
{
Stream *instream=blob.getStream(1,0);
//reading from offset 1 to the end of the BLOB

unsigned int size=blob.getChunkSize();
char *buffer=new char[size];

while((unsigned int length=instream->readBuffer(buffer,size))!=-1)
{
//process "length" bytes read into buffer
...
}
delete[] buffer;
blob.closeStream(instream);
}
}
stmt->closeResultSet(rset);

LOBの書込み

例7-4は、非ストリーム書込みを使用して、NULL以外の内部LOBにデータを書き込む方法を示しています。writeChunk()メソッドは、open()メソッドおよびclose()メソッドで囲まれています。このメソッドは、現在オープンしているLOBを操作し、チャンクの読込みごとにトリガーが起動されないようにします。write()メソッドは、writeChunk()メソッドに使用できます。ただし、write()メソッドはLOBを暗黙的にオープンおよびクローズします。

例7-4 非ストリームBLOBの書込み方法

ResultSet *rset=stmt->executeQuery("SELECT ad_composite FROM print_media
WHERE product_id=6666 FOR UPDATE");
while(rset->next())
{
Blob blob=rset->getBlob(1);
if(blob.isNull())
cerr <<"Null Blob"<<endl;
else
{
blob.open(OCCI_LOB_READWRITE);

const unsigned int BUFSIZE=100;
char buffer[BUFSIZE];
unsigned int writeAmt=BUFSIZE;
unsigned int offset=1;

//writing writeAmt bytes from offset 1
//contents of buffer are replaced after each writeChunk(),
//typically with an fread()
while(<fread "BUFSIZE" bytes into buffer succeeds>)
{
blob.writeChunk(writeAmt, buffer, BUFSIZE, offset);
offset += writeAmt;
}
blob.writeChunk(<remaining amt>, buffer, BUFSIZE, offset);

blob.close();
}
}
stmt->closeResultSet(rset);
conn->commit();

例7-5は、ストリーム書込みを使用して移入された内部LOBにデータを書き込む方法を示しています。

例7-5 ストリームBLOBの書込み方法

ResultSet *rset=stmt->executeQuery("SELECT ad_composite FROM print_media
WHERE product_id=6666 FOR UPDATE");
while(rset->next())
{
Blob blob=rset->getBlob(1);
if(blob.isNull())
cerr <<"Null Blob"<<endl;
else
{
char buffer[BUFSIZE];
Stream *outstream=blob.getStream(1,0);

//writing from buffer beginning at offset 1 until
//a writeLastBuffer() method is issued.
//contents of buffer are replaced after each writeBuffer(),
//typically with an fread()
while(<fread "BUFSIZE" bytes into buffer succeeds>)
ostream->writeBuffer(buffer,BUFSIZE);
ostream->writeLastBuffer(buffer,<remaining amt>);
blob.closeStream(outstream);
}
}
stmt->closeResultSet(rset);
conn->commit();

LOBの読込みおよび書込みのパフォーマンス向上

内部LOBの読込みおよび書込みは、いずれかのgetChunkSize()メソッドを使用してパフォーマンスを改善できます。

getChunkSize()メソッドの使用

getChunkSize()メソッドでは、使用可能なチャンク・サイズについて、BLOBではバイト数で戻し、CLOBおよびNCLOBでは文字数で戻します。使用可能なチャンク・サイズの倍数で読込みまたは書込みが開始されており、要求サイズも使用可能なチャンク・サイズの倍数である場合に、パフォーマンスが向上します。LOBが含まれる表を作成する場合、LOB列についてチャンク・サイズを指定できます。

getChunkSize()メソッドをコールすると、LOBの使用可能なチャンク・サイズが戻されます。アプリケーションは、同じチャンクを操作する複数のLOB書込みコールを発行せずに、チャンク全体の書込みが可能になるまで一連の書込み操作をバッチ処理することができます。

LOBの最後まで読み込むには、データ量を4GBに指定したread()メソッドを使用します。これにより、データ量を4GBに指定したread()メソッドがLOBの最後に到達するまで読込みを実行するため、getLength()メソッドの最初のコールに関係するラウンドトリップが回避されます。

可変幅文字が格納されたLOBの場合、GetChunkSize()メソッドによって、LOBチャンクに適合するUnicode文字数が戻されます。

LOBの更新

データベースでLOBの値を更新するには、新しい値をLOBに割り当て、データベースでSQL UPDATEコマンドを実行し、トランザクションをコミットする必要があります。例7-6は、既存のCLOBの更新方法(この場合は空白に設定)を示し、例7-7はBFILEの更新方法を示しています。

例7-6 CLOB値の更新

Clob clob(conn);
clob.setEmpty();
stmt->setSQL("UPDATE print_media SET ad_composite = :1
WHERE product_id=6666");
stmt->setClob(1, clob);
stmt->executeUpdate();
conn->commit();

例7-7 BFILE値の更新

Bfile bfile(conn);
bfile.setName("MEDIA_DIR", "img1.jpg");
stmt->setSQL("UPDATE print_media SET ad_graphic = :1
WHERE product_id=6666");
stmt->setBfile(1, bfile);
stmt->executeUpdate();
conn->commit();

複数のLOBの読込みと書込み

Oracle Database 10g リリース2では、複数のLOB（Bfile、Blob、ClobおよびNClobなど）の読込みと書込み時のアプリケーションのパフォーマンスを向上する新しいインタフェースがOCCIに追加されました。

これらのインタフェースには、一度に1つのLOB読込みと書込みを行う標準の方法に比べ、いくつかの利点があります。

- OCCIで複数のLOBの読込みと書込みを1回のサーバー・ラウンドドリップで行うことで、アプリケーションとバック・エンドの間のI/O時間が短縮され、パフォーマンスが向上します。

- 新しいAPIでは、以前の限度である4GBより大きなLOBをサポートしています。新しいインタフェースでは、容量、オフセット、バッファおよび長さパラメータについてoraub8データ型に対応します。これらのパラメータは、コンパイラとオペレーティング・システムに応じた64ビットのネイティブ・データ型にマッピングされています。

- Clobに関するメソッドでは、ユーザーは読み込むまたは書き込むデータ量を文字数またはバイト数で指定できます。

この機能のための新しいAPIは、第13章「OCCI Application Program Interface（API）」の「Connectionクラス」の項で説明します。これには、readVectorOfBfiles()、readVectorOfBlobs()、readVectorOfClobs()（一般的なキャラクタ・セット、特にUTF16をサポートするためのオーバーロード）、writeVectorOfBlobs()およびwriteVectorOfClobs()（一般的なキャラクタ・セット、特にUTF16をサポートするためのオーバーロード）があります。

複数のLOBの読込みと書込みのためのインタフェースの使用方法

readVectorOfxxx()インタフェースとwriteVectorOfxxx()インタフェースはそれぞれ、次のパラメータを使用します。

- conn: Connectionクラス・オブジェクト

- vec: LOBオブジェクト(Bfile、Blob、ClobまたはNClob)のベクター

- byteAmts: 読込みまたは書込みのバイト数の配列

- charAmts: 読込みまたは書込みの文字数の配列（ClobとNClobのみに適用可能）

- offsets: オフセットの配列(BfileとBlobはバイト数、ClobとNClobは文字数)

- buffers: バッファ・ポイントの配列

- bufferLengths: バッファの長さの配列

ベクター内のLOBの読込みまたは書込みのいずれかでエラーが発生すると、操作全体がキャンセルされます。byteAmtsまたはcharAmtsパラメータをチェックし、読み書きされる実際のバイト数または文字数を指定する必要があります。

LOB属性を含むオブジェクトの使用

OCCIアプリケーションは、演算子new()を使用して、LOB属性を含む永続オブジェクトを作成できます。デフォルトでは、LOB属性はすべてデフォルト・コンストラクタを使用して構成され、NULLに初期化されます。

例7-8は、内部LOB属性を含む永続オブジェクトの作成および使用方法を示しています。例7-9は、外部LOB属性を含む永続オブジェクトの作成および使用方法を示しています。

例7-8 BLOB属性を含む永続オブジェクトの使用方法

1. BLOB属性を含む永続オブジェクトを作成します。

Person *p=new(conn,"PERSON_TAB")Person();
p->imgBlob = Blob(conn);

2. Blobオブジェクトを空に初期化します。

p->imgBlob.setEmpty();

または、既存の値に設定します。

3. Blobオブジェクトに使用済のマークを付けます。

p->markModified();

4. オブジェクトをフラッシュします。

p->flush();

5. オブジェクトへのREFを取得した後にこのオブジェクトを再確保し、これによって、データベースからリフレッシュしたオブジェクト・バージョンを取得し、初期化されたLOBを取得します。

Ref<Person> r = p->getRef();
delete p;
p = r.ptr();

6. データを書き込みます。

p->imgBlob.write( ... );

例7-9 BFILE属性を含む永続オブジェクトの使用方法

1. BFILE属性を含む永続オブジェクトを作成します。

Person *p=new(conn,"PERSON_TAB")Person();
p->imgBFile = BFile(conn);

2. Bfileオブジェクトを初期化します。

p->setName(directory_alias, file_name);

3. Bfileオブジェクトに使用済のマークを付けます。

p->markModified();

4. オブジェクトをフラッシュします。

p->flush();

5. データを読み込みます。

p->imgBfile.read( ... );

SecureFilesの使用

Oracle Database 11gリリース1で導入されたSecureFiles LOBでは、LOB圧縮、暗号化および重複除外に関する強力な新機能が追加されています。

関連項目
『Oracle Database SecureFilesおよびラージ・オブジェクト開発者ガイド』

SecureFileの圧縮の使用

SecureFilesの圧縮では、LOBデータのサーバー側の圧縮が可能であり、これはアプリケーションに対して透過的に行われます。SecureFilesの圧縮を使用すると、SecureFiles LOBデータの読込みおよび更新のパフォーマンスに対する影響を最小限に抑えて、記憶領域を節減できます。

SecureFilesの暗号化の使用

SecureFilesでは、LOBデータの新規暗号化機能が導入されています。また、透過的データ暗号化が拡張され、暗号化されたSecureFiles LOBへの効率的かつランダムな読込みおよび書込みアクセスが有効化されています。

SecureFilesの重複除外の使用

SecureFilesの重複除外により、Oracle Databaseでは重複したLOBデータを自動的に検出し、SecureFiles LOBの単一コピーを格納して領域を節約できます。

SecureFilesの圧縮、暗号化および重複除外の結合

圧縮、暗号化および重複除外を任意に組み合せることができます。Oracle Databaseでは、次の規則に従ってこれらの機能が適用されます。

- 重複除外検出(有効化されている場合)は、圧縮および暗号化の前に実行されます。これにより、重複するSecureFiles LOBに対する不要およびコストが高い可能性のある圧縮および暗号化操作が防止されます。

- 圧縮は、最大限の圧縮率を実現するために、暗号化の前に実行されます。

SecureFilesのLOBの型および定数

次のSecureFiles LOB型は、圧縮、暗号化および重複除外の柔軟性を高めます。表7-1ではLobOptionTypeのオプション、表7-2ではLobOptionValueのオプションを示しています。

表7-1 LobOptionType型の値

値

説明

OCCI_LOB_OPT_COMPRESS

圧縮オプション型

OCCI_LOB_OPT_ENCRYPT

暗号化オプション型

OCCI_LOB_OPT_DEDUPLICATE

重複除外オプション型

表7-2 LobOptionValue型の値

値

説明

OCCI_LOB_COMPRESS_OFF

SecureFiles圧縮をオフにします。

OCCI_LOB_COMPRESS_ON

SecureFiles圧縮をオンにします。

OCCI_LOB_ENCRYPT_OFF

SecureFiles暗号化をオフにします。

OCCI_LOB_ENCRYPT_ON

SecureFiles暗号化をオンにします。

OCCI_LOB_DEDUPLICATE_OFF

SecureFiles重複除外をオフにします。

OCCI_LOB_DEDUPLICATE_ON

LOB重複除外をオフにします。

8 オブジェクト型トランスレータ・ユーティリティ

この章では、オブジェクト型トランスレータ(OTT)ユーティリティについて説明します。このユーティリティを使用して、データベース・オブジェクト型、LOB型および名前付きコレクション型をC++クラスの宣言にマッピングし、OCCIアプリケーションで使用できるようにします。

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

- オブジェクト型トランスレータ・ユーティリティの概要

- OTTユーティリティの使用

- データベースでの型の作成

- OTTユーティリティの起動

- INTYPEファイルの使用

- OTTユーティリティのデータ型マッピング

- OUTTYPEファイルの概要

- OTTユーティリティとOCCIアプリケーション

- ユーザー追加コードの引継ぎ

関連項目
この章で使用するデモ・プログラムの完全なコード・リストおよびOTTユーティリティによって生成されるクラスおよびメソッド実装は、$ORACLE_HOME/rdbms/demoを参照してください。

オブジェクト型トランスレータ・ユーティリティの概要

オブジェクト型トランスレータ（OTT）ユーティリティは、Oracleデータベース・サーバーのユーザー定義型を利用するアプリケーションの開発に役立ちます。

オブジェクト型は、SQLのCREATE TYPE文を使用して作成できます。これらの型の定義はデータベースに格納されており、その後データベース表の作成に使用できます。表が作成されると、OCCIプログラマは表に格納されているオブジェクトにアクセスできます。

オブジェクト・データにアクセスするアプリケーションには、データをホスト言語形式で表現する機能が必要です。この機能は、オブジェクト型クラスをC++で表現することで実現します。

構造体またはクラスを手動でコーディングしてデータベース・オブジェクト型を表現することもできますが、時間がかかり、エラーが発生しやすくなります。OTTユーティリティは、C++に対する適切なクラスを自動的に生成することで、このステップを簡略化します。

OCCIの場合、アプリケーションでは、次のファイルを組み込んでリンクする必要があります。

- 生成されたクラス宣言が含まれたヘッダー・ファイルを組み込みます。

- マッピングを登録する関数のプロトタイプが含まれたヘッダー・ファイルを組み込みます。

- オブジェクトをインスタンス化している間にOCCIがコールする静的メソッドが含まれたC++ソース・ファイルとのリンクを設定します。

- マッピングを環境に登録する関数が含まれているファイルとのリンクを設定して、この関数をコールします。

OTTユーティリティの使用

データベース型をC++の表現に変換するには、OTTユーティリティを明示的に起動する必要があります。OCCIプログラマでは、マッピングを環境に登録する必要があります。この関数はOTTユーティリティによって生成されます。

ほとんどのオペレーティング・システムでは、コマンドラインからOTTユーティリティを起動します。OTTユーティリティでは、INTYPEファイルを入力として受け取り、OUTTYPEファイル、プロトタイプ情報が含まれる1つ以上のC++ヘッダー・ファイルおよび生成されたマッピングを登録する追加C++メソッド・ファイルを生成します。

例8-1 OTTユーティリティの使用方法

次のコマンドは、OTTユーティリティを起動してC++クラスを生成します。OTTはユーザー名demousrを使用して接続を試行します。システムではパスワードが要求されます。

ott userid=demousr intype=demoin.typ outtype=demoout.typ code=cpp
hfile=demo.h cppfile=demo.cpp mapfile=RegisterMappings.cpp

OTTユーティリティでは、demoin.typファイルをINTYPEファイルとして使用し、demoout.typファイルをOUTTYPEファイルとして使用します。生成された宣言はCODE=cppパラメータで指定されたC++でdemo.hファイルに出力され、メソッド実装はdemo.cppファイルに出力され、マッピングを登録する関数は、RegisterMappings.hに出力されたプロトタイプとともに、RegisterMappings.cppに出力されます。

関連項目
完全なC++の例は、「C++クラスの拡張」を参照してください。

データベースでの型の作成

OTTユーティリティを使用する最初のステップは、オブジェクト型または名前付きコレクション型を作成してデータベースに格納することです。そのためには、SQLのCREATE TYPE文を使用します。

例8-2 OTTユーティリティのオブジェクト作成文

CREATE TYPE FULL_NAME AS OBJECT (first_name CHAR(20), last_name CHAR(20));
CREATE TYPE ADDRESS AS OBJECT (state CHAR(20), zip CHAR(20));
CREATE TYPE ADDRESS_TAB AS VARRAY(3) OF REF ADDRESS;
CREATE TYPE PERSON AS OBJECT (id NUMBER, name FULL_NAME, curr_addr REF ADDRESS,
prev_addr_1 ADDRESS_TAB) NOT FINAL;
CREATE TYPE STUDENT UNDER PERSON (school_name CHAR(20));

OTTユーティリティの起動

データベースに型を作成した後の次のステップでは、OTTユーティリティを起動します。

OTTパラメータの指定

OTTパラメータは、コマンドラインまたは構成ファイルのいずれかで指定できます。一部のパラメータはINTYPEファイルでも指定できます。

1つのパラメータを複数の場所で指定する場合は、コマンドラインのパラメータ値がINTYPEファイルのパラメータ値よりも優先されます。INTYPEファイルの値は、ユーザー定義の構成ファイルの値よりも優先されます。また、このユーザー定義の構成ファイルの値は、デフォルトの構成ファイルの値よりも優先されます。

したがって、パラメータの優先順位は、次のとおりです。

1. OTTコマンドライン

2. INTYPEファイルの値

3. ユーザー定義の構成ファイル

4. デフォルトの構成ファイル

グローバル・オプション（つまり、コマンドラインのオプションまたはTYPE文の前にあるINTYPEファイルの最初のオプション）の場合は、コマンドラインの値がINTYPEファイルの値よりも優先されます。（INTYPEファイルでグローバル指定できるオプションは、CASE、INITFILE、INITFUNC、MAPFILEおよびMAPFUNCです。HFILEまたはCPPFILEは、グローバル指定できません。）INTYPEファイルにTYPE指定で記述されている内容は、特定の型に対してのみ適用され、この特定の型に対して通常適用されるコマンドラインの内容よりも優先されます。したがって、TYPE person HFILE=p.hを入力すると、その内容はpersonのみに適用され、コマンドラインのHFILEが上書きされます。この文は、コマンドライン・パラメータとみなされません。

コマンドラインのパラメータの設定

コマンドラインに設定されたパラメータ（オプションとも呼ばれます）は、他で設定されたパラメータやオプションよりも優先されます。

INTYPEファイルのパラメータの設定

INTYPEファイルは、OTTユーティリティで変換する型のリストです。

CASE、CPPFILE、HFILE、INITFILE、INITFUNC、MAPFILEおよびMAPFUNCの各パラメータは、INTYPEファイルに指定できます。

構成ファイルのパラメータの設定

構成ファイルは、OTTパラメータが記述されているテキスト・ファイルです。ファイル内の各非空白行には、1つのパラメータと、それに関連付けられた1つ以上の値が含まれています。同じ行に複数のパラメータを指定した場合は、最初のパラメータのみが使用されます。構成ファイルの非空白行では、空白を使用できません。

構成ファイルは、コマンドラインで名前を指定できます。また、デフォルトの構成ファイルは常に読み込まれます。このデフォルトの構成ファイルは、常に存在している必要がありますが、空でも構いません。デフォルトの構成ファイルの名前はottcfg.cfgであり、ファイルの位置はオペレーティング・システム固有の設定です。

関連項目
デフォルトの構成ファイルの位置は、使用しているオペレーティング・システムのマニュアルを参照してください。

コマンドラインでのOTTユーティリティの起動

ほとんどのプラットフォームでは、コマンドラインからOTTユーティリティを起動します。コマンドラインでは特に、入出力ファイルおよびデータベース接続情報を指定できます。

関連項目
オペレーティング・システムでOTTユーティリティを起動する方法は、使用しているオペレーティング・システムのマニュアルを参照してください。

例8-3 OTTユーティリティを起動してC++クラスを生成する方法

OTTはユーザー名demousrを使用して接続を試行します。システムではパスワードが要求されます。

ott userid=demousr intype=demoin.typ outtype=demoout.typ code=cpp
hfile=demo.h cppfile=demo.cpp mapfile=RegisterMappings.cpp

注意:
OTTコマンドラインの等号（=）の前後には空白を使用できません。

OTTコマンドライン文は、コマンドOTTと、その後に続くOTTユーティリティ・パラメータのリストで構成されています。

HFILEパラメータは、ほとんどの場合に使用されます。省略した場合は、INTYPEファイル内の各型に対して、HFILEを個別に指定する必要があります。OTTユーティリティは、INTYPEファイルにリストされていない型の変換が必要であると判断した場合は、エラーをレポートします。したがって、INTYPEファイルが以前にOTT OUTTYPEファイルとして生成されている場合のみ、HFILEパラメータを省略できます。

INTYPEファイルを省略すると、スキーマ全体が変換されます。詳細は、次の項のパラメータの説明を参照してください。

OTTコマンドラインで使用する要素

OTTコマンドラインで使用する要素は、次のとおりです。

- OTTユーティリティを起動するOTTコマンド。必ずコマンドラインの先頭に置きます。

- USERIDパラメータ

- INTYPEパラメータ

- OUTTYPEパラメータ

- CODEパラメータ

- HFILEパラメータ

- CPPFILEパラメータ

- MAPFILEパラメータ

OTTユーティリティのパラメータ

OTTユーティリティを使用してC++を生成するには、CODEパラメータをCODE=CPPに設定する必要があります。CODE=CPPを指定した場合は、メソッド実装ファイルとマッピング登録関数ファイルのファイル名を定義するために、CPPFILEパラメータとMAPFILEパラメータを指定する必要があります。マッピング関数の名前は、OTTユーティリティによってMAPFILEから作成するか、MAPFUNCパラメータを使用して指定できます。また、ATTRACCESSは、生成したコードの変更を指定できるオプションのパラメータです。これらのパラメータは、C++クラスの生成を制御します。

- OTTコマンドラインにパラメータを入力します。この場合、parameterはリテラル・パラメータ文字列であり、valueは有効なパラメータ設定値です。リテラル・パラメータ文字列は大/小文字を区別しません。

parameter=value

- コマンドラインのパラメータは、空白またはタブのいずれかを使用して区切ります。

- パラメータは構成ファイル内にも指定できます。ただし、この場合は、行内の空白は許可されないため、各パラメータは独立した行に指定する必要があります。また、CASE、CPPFILE、HFILE、INITFILE、INTFUNC、MAPFILEおよびMAPFUNCの各パラメータは、INTYPEファイルに指定できます。

表8-1は、OTTユーティリティのすべてのパラメータを示しています。

表8-1 OTTユーティリティのパラメータの概要

パラメータ

説明

ATTRACCESS

型属性へのアクセスがPROTECTEDまたはPRIVATEのいずれになるかを指定します。

CASE

生成されるC++識別子の大/小文字の区別に影響します。

CODE

変換のターゲット言語を指定します。CPPを使用します。

CONFIG

共通に使用されるパラメータ指定がリストされるOTT構成ファイルの名前を指定します。

CPPFILE

メソッド実装が書き込まれるC++ソース・ファイルの名前を指定します。

ERRTYPE

エラー・メッセージ出力ファイルの名前を指定します。

HFILE

生成されたC++クラスが書き込まれるC++のヘッダー・ファイル名を指定します。

INTYPE

INTYPEファイルの名前を指定します。

MAPFILE

OTTユーティリティで生成するマッピング・ファイルとそれに対応するヘッダー・ファイルの名前を指定します。

MAPFUNC

生成するマッピングの登録に使用する関数の名前を指定します。

OUTTYPE

OUTTYPEファイルの名前を指定します。

SCHEMA_NAMES

デフォルト・スキーマに基づいて命名した型のデータベース名の修飾を制御します。

TRANSITIVE

INTYPEに明示的にリストされていない型の依存性を変換するかどうかを指定します。

UNICODE

アプリケーションがUTF16をサポートし、UString型を生成する必要があるかどうかを指定します。

USE_MARKER

ユーザーが追加したコードを引き継ぐために、OTTマーカーをサポートする必要があるかどうかを指定します。

USERID

OTTユーティリティが使用するデータベース接続情報を指定します。

ATTRACCESS

このパラメータは、型属性へのアクセスを指定します。

- PROTECTEDは、デフォルトです。

- PRIVATEの場合、OTTユーティリティにより、getXXX()およびsetXXX()のそれぞれの型属性に対して、アクセッサ・メソッドおよびミューテータ・メソッドが生成されます。

CASE

このパラメータは、生成されるC++識別子の大/小文字の区別に影響します。CASEの有効な値は、次のとおりです。

- SAMEの場合、データベース型と属性名をC++識別子に変換するときに、文字の大/小文字は変更されません。

- LOWERの場合、大文字はすべて小文字に変換されます。

- UPPER の場合、小文字はすべて大文字に変換されます。

- OPPOSITEの場合、大文字はすべて小文字に変換され、小文字はすべて大文字に変換されます。

このパラメータは、INTYPEファイルに記述されていない識別子（明示的にリストされていない属性または型）のみに作用します。大/小文字の変換は、正当な識別子が生成された後で行われます。

INTYPEファイルに記述されていない、大/小文字の区別のないSQL識別子は、CASE=SAMEの場合は大文字で、CASE=OPPOSITEの場合は小文字で表現されます。SQL識別子は、宣言時に引用符が付けられていない場合、大/小文字が区別されません。

CODE

このパラメータは、OTTユーティリティで出力するホスト言語を指定します。OCCIアプリケーション用にC++コードを生成するには、CODE=CPPをOTTユーティリティに指定する必要があります。

CONFIG

このパラメータは、共通に使用されるパラメータ指定がリストされるOTT構成ファイルの名前を指定します。パラメータ指定は、オペレーティング・システム固有の位置にあるシステム構成ファイルからも読み込まれます。残りのすべてのパラメータ指定は、コマンドラインまたはINTYPEファイルに指定する必要があります。

OTTコマンドラインに指定できるのは、CONFIGパラメータのみです。このパラメータはCONFIGファイルに指定できません。

CPPFILE

このパラメータは、OTTユーティリティで生成するメソッド実装が格納されるC++ソース・ファイルの名前を指定します。このファイルに生成されるメソッドは、オブジェクトをインスタンス化するときにOCCIによってコールされます。アプリケーション内で直接コールされることはありません。

次の場合、このパラメータは必須です。

- INTYPEファイルに指定されていない型の生成が必要で、2つ以上のCPPFILEが生成されている場合。この場合、未指定の型は、コマンドラインに指定したCPPFILEに格納されます。

- INTYPEパラメータが未指定で、スキーマ内のすべての型をOTTユーティリティで変換する場合。

CPPFILEパラメータがINTYPEファイルの個々の型に対して指定されている場合、このパラメータはオプションです。

ERRTYPE

このパラメータは、エラー・メッセージ出力ファイルの名前を指定します。情報メッセージおよびエラー・メッセージは、ERRTYPEパラメータを指定したかどうかに関係なく、標準出力に送信されます。基本的に、ERRTYPEファイルは、エラー・メッセージが追加されたINTYPEファイルのコピーです。ほとんどの場合、エラー・メッセージにはエラーの原因となったテキストへのポインタが含まれます。

コマンドラインで、拡張子を付けずにファイル名をERRTYPEパラメータに指定すると、.TLSや.tlsなどのプラットフォーム固有の拡張子が自動的に追加されます。

HFILE

このパラメータは、OTTユーティリティで生成するヘッダー・ファイル（.h）の名前を指定します。コマンドラインに指定されたHFILEには、型の宣言が含まれています。この宣言は、INTYPEファイルに指定されていますが、そのヘッダー・ファイルはこのファイルには指定されていません。

このパラメータは、各型のヘッダー・ファイルがINTYPEファイルに個別に指定されていない場合に必要です。このパラメータは、INTYPEファイルに記述されていない型を、他の型が必要とする理由から生成する場合にも必要です。この他の型は、2つ以上の異なるファイルで宣言されます。

コマンドラインまたはINTYPEファイルで、拡張子を付けずにファイル名をHFILEパラメータに指定すると、.Hや.hなどのプラットフォーム固有の拡張子が自動的に追加されます。

INTYPE

このパラメータは、オブジェクト型指定のリストを読み込む元のファイル名を指定します。OTTユーティリティによって、リストにある各型が変換されます。INTYPEパラメータが指定されていない場合は、ユーザーのスキーマにある型すべてが変換されます。

コマンドラインで、拡張子を付けずにファイル名をINTYPEパラメータに指定すると、.TYPや.typなどのプラットフォーム固有の拡張子が自動的に追加されます。

USERIDが第1パラメータ、INTYPEが第2パラメータの場合で、USERID=が省略されている場合は、INTYPE=を省略できます。

INTYPEファイルは、型宣言に対するMakeファイルとみなすことができます。このファイルには、C++クラスを必要とする型がリストされます。

関連項目
INTYPEファイルのフォーマットの詳細は、「INTYPEファイルの構造」を参照してください。

MAPFILE

このパラメータは、OTTユーティリティで生成するマッピング・ファイル（XXX.cpp）とそれに対応するヘッダー・ファイル（XXX.h）の名前を指定します。XXX.cppファイルにはマッピングを登録する関数の実装が格納され、XXX.hファイルにはその関数のプロトタイプが格納されます。

このパラメータは、コマンドラインまたはINTYPEファイルに指定できます。

MAPFUNC

このパラメータは、OTTユーティリティで生成する、マッピングの登録に使用する関数の名前を指定します。

このパラメータを省略すると、マッピングを登録する関数の名前は、MAPFILEパラメータに指定されているファイル名に基づいて作成されます。

このパラメータは、コマンドラインまたはINTYPEファイルに指定できます。

OUTTYPE

このパラメータは、OTTユーティリティが処理するオブジェクト・データ型すべての型情報を出力するファイルの名前を指定します。このファイルには、INTYPEファイルに明示的に指定されたすべての型が格納されます。また、変換が必要な他の型の宣言で使用されているために変換される、追加の型が格納される場合があります。このファイルは、OTTユーティリティの今後の起動で、INTYPEファイルとして使用できます。

INTYPEパラメータとOUTTYPEパラメータが同一のファイルを参照している場合、INTYPEファイルの古い情報は、新しいINTYPEの情報によって置換されます。これは、型の変更から始まり、型宣言の生成、ソースコードの編集、プリコンパイル、コンパイル、デバッグに至るサイクル内で、同一のINTYPEファイルを繰返し使用するときに便利です。

コマンドラインまたはINTYPEファイルに、拡張子を付けずにファイル名をOUTTYPEパラメータに指定すると、.TYPや.typなどのプラットフォーム固有の拡張子が自動的に追加されます。

SCHEMA_NAMES

OUTTYPEファイルで命名されたデフォルト・スキーマに基づく型のデータベース名を修飾する場合、このパラメータで制御します。OTTユーティリティによって生成されたOUTTYPEファイルには、型名を含めて、OTTユーティリティで処理された型の情報が記述されます。次の値が有効です。

- ALWAYS（デフォルト）の場合、OUTTYPEファイル内のすべての型名はスキーマ名で修飾されます。

- IF_NEEDEDの場合、デフォルト・スキーマに所属するOUTTYPEファイル内の型名は、スキーマ名で修飾されません。その他のスキーマに所属する型名は、スキーマ名で修飾されます。

- FROM_INTYPEの場合、INTYPEファイルに記述されている型は、INTYPEファイル内のスキーマ名で修飾されている場合に限って、OUTTYPEファイル内のスキーマ名で修飾されます。INTYPEファイルには記述されていないが、型の依存性のために生成されたデフォルト・スキーマ内の型は、その型に依存しているOTTユーティリティで最初に検出された型がスキーマ名付きで記述されている場合にのみ、スキーマ名付きで記述されます。ただし、OTTユーティリティが接続しているデフォルト・スキーマにない型は、常に、明示的に指定したスキーマ名付きで記述されます。

デフォルト・スキーマ以外のスキーマに基づく型の名前は、OUTTYPEファイル内のスキーマ名で常に修飾されます。

スキーマ名の有無によって、プログラム実行中に型を検索するスキーマが決定されます。

例8-4 OTTユーティリティでのSCHEMA_NAMESパラメータの使用方法

SCHEMA_NAMESパラメータがFROM_INTYPEに設定され、INTYPEファイルに次の指定がある例を想定します。

TYPE Person
TYPE joe.Dept
TYPE sam.Company

OTTユーティリティとアプリケーションの両方がスキーマjoeに接続する場合、アプリケーションはOTTユーティリティが使用する型と同じ型（joe.Person）を使用します。OTTユーティリティはスキーマjoeに接続しているが、アプリケーションはスキーマmaryに接続している場合、アプリケーションはmary.Person型を使用します。この動作は、スキーマjoeとスキーマmaryで同一のCREATE TYPE Person文が実行されている場合にのみ適切です。

一方、アプリケーションは、接続しているスキーマに関係なく、joe.Dept型を使用します。この動作のためには、スキーマ名をINTYPEファイルで使用している型名に挿入する必要があります。

ユーザーが明示的に名前を指定していない型が、OTTユーティリティによって変換される場合があります。たとえば、次のSQL宣言を想定します。

CREATE TYPE Address AS OBJECT
(
street    VARCHAR2(40),
city      VARCHAR(30),
state     CHAR(2),
zip_code  CHAR(10)
);

CREATE TYPE Person AS OBJECT
(
name      CHAR(20),
age       NUMBER,
addr      ADDRESS
);

OTTユーティリティはスキーマjoeに接続し、SCHEMA_NAMES=FROM_INTYPEが指定され、ユーザーのINTYPEファイルには、TYPE PersonまたはTYPE joe.Personのいずれかが含まれていると仮定します。INTYPEファイルには、joe.Person型でネストしたオブジェクト型として使用されているjoe.Address型は指定されていません。

- INTYPEファイルにType Personが指定されている場合は、TYPE PersonとTYPE AddressがOUTTYPEファイルに指定されます。

- INTYPEファイルにTYPE joe.Personが指定されている場合は、TYPE joe.PersonとTYPE joe.AddressがOUTTYPEファイルに指定されます。

- OTTユーティリティが変換する複数の型には、joe.Address型が埋め込まれているが、そのことがINTYPEファイルには明示的に記述されていない場合、スキーマ名を使用するかどうかの判断は、埋め込まれたjoe.Address型をOTTユーティリティが最初に検出したときに行われます。なんらかの理由で、ユーザーがスキーマ名をjoe.Address型には付け、Person型には付けないようにするには、TYPE joe.Addressのように、この内容をINTYPEファイルで明示的に指定する必要があります。

各型を単一のスキーマ内で宣言する通常の場合は、すべての型名をINTYPEファイル内のスキーマ名で修飾することが最も安全です。

TRANSITIVE

このパラメータは、INTYPEファイルに明示的にリストされていない型の依存性を変換するかどうかを指定します。次の値が有効です。

- TRUE（デフォルト）: 他の型に必要な型で、INTYPEファイルに指定されていない型が生成されます。

- FALSE: INTYPEファイルに指定されていない型は生成されません。これは、ファイルに指定されていない型が、生成された他の型に対する属性の型として使用されている場合にも適用されます。

UNICODE

このパラメータは、アプリケーションでUnicode (UTF16)をサポートするかどうかを指定します。

- NONE (デフォルト)

- ALL: すべてのCHAR (CHAR/VARCHAR)およびNCHAR (NCHAR/NVARCHAR2)型属性が、OTT生成のC++クラス・ファイルでUString型として宣言されます。対応するgetXXX()/setXXX()の戻り値または戻りパラメータは、UString型です。また、生成される永続演算子newは、UString引数のみ受け入れます。
この設定は、クライアント・キャラクタセットおよび各国語キャラクタセットの両方がUTF16である場合に必要です。

- ONLYNCHAR: ALLオプションに類似していますが、NCHAR型属性のみがUStringとして宣言されます。
この設定は、アプリケーションにおいて環境の各国語キャラクタセットのみをUTF16に設定する場合に必要です。

例8-5 OTTでUnicodeをサポートするためのスキーマの定義方法

create type CitiesList as varray(100) of varchar2(100);

create type Country as object
(  CNo Number(10),
CName Varchar2(100),
CNationalName NVarchar2(100),
MainCities CitiesList);

例8-6 OTTでのUNICODE=ALLパラメータの使用方法

class Country : public oracle::occi::PObject
{
private:
oracle::occi::Number CNO;
oracle::occi::UString CNAME;
oracle::occi::UString CNATIONALNAME;
OCCI_STD_NAMESPACE:::vector< oracle::occi::UString > MAINCITIES;

public:

oracle::occi::Number getCno() const;
void setCno(const oracle::occi::Number &value);

oracle::occi::UString getCname() const;
void setCname(const oracle::occi::UString &value);

oracle::occi::UString getCnationalname() const;
void setCnationalname(const oracle::occi::UString &value);

OCCI_STD_NAMESPACE::vector< oracle::occi::UString >& getMaincities();
const OCCI_STD_NAMESPACE::vector< oracle::occi::UString >&
getMaincities() const;
void setMaincities(const OCCI_STD_NAMESPACE::vector< oracle::occi::UString
> &value);
...
}

例8-7 OTTでのUNICODE=ONLYCHARパラメータの使用方法

class Country : public oracle::occi::PObject
{
private:
oracle::occi::Number CNO;
oracle::occi::string CNAME;
oracle::occi::UString CNATIONALNAME;
OCCI_STD_NAMESPACE::vector< std::string > MAINCITIES;

public:

oracle::occi::Number getCno() const;
void setCno(const oracle::occi::Number &value);

oracle::occi::string getCname() const;
void setCname(const OCCI_STD_NAMESPACE::string &value);

oracle::occi::UString getCnationalname() const;
void setCnationalname(const oracle::occi::UString &value);

OCCI_STD_NAMESPACE::vector< OCCI_STD_NAMESPACE::string>&
getMaincities();
const OCCI_STD_NAMESPACE::vector< OCCI_STD_NAMESPACE::string >&
getMaincities() const;
void setMaincities(const OCCI_STD_NAMESPACE::vector
< OCCI_STD_NAMESPACE::string > &value);
...
}

USE_MARKER

このパラメータは、ユーザーが追加したコードを引き継ぐために、OTTマーカーをサポートするかどうかを指定します。次の値が有効です。

- FALSE (デフォルト): OTT_USERCODE_STARTとOTT_USERCODE_ENDの2つのマーカーの間にユーザーがコードを指定しても、追加したコードは引き継がれません。

- TRUE: OTT_USER_CODESTARTとOTT_USERCODE_ENDの2つのマーカーの間にユーザーが指定したコードは、同じファイルが再生成されたときに引き継がれます。

USERID

このパラメータは、Oracleユーザー名およびオプションのデータベース名（Oracle Netのデータベース指定文字列）を指定します。データベース名を省略すると、デフォルトのデータベースが使用されます。

USERID=username[@db_name]

これが第1パラメータである場合は、USERID=を省略して、次のように指定できます。

OTT username ...

ユーザーIDに対応するパスワードが要求されるので注意してください。

このパラメータはオプションです。このパラメータを省略すると、OTTユーティリティは、ユーザーOPS$usernameでデフォルトのデータベースに自動的に接続します。usernameは、オペレーティング・システムのユーザー名です。

OTTパラメータの指定可能な場所

OTTパラメータは、コマンドラインまたはコマンドラインで名前が指定されたCONFIGファイル、あるいはその両方に指定できます。パラメータの一部は、INTYPEファイルにも指定できます。

OTTユーティリティは、次のように起動します。

OTT parameters

CONFIGパラメータを使用して、構成ファイルの名前をコマンドラインで次のように指定できます。

CONFIG=filename

コマンドラインでこのパラメータの名前を指定すると、他のパラメータは、ファイル名filenameの構成ファイルから読み込まれます。

パラメータは、オペレーティング・システム固有の位置にあるデフォルトの構成ファイルからも読み込まれます。このファイルの存在は必要ですが、空でも構いません。構成ファイルにデータを入力する場合、空白は使用できないこと、パラメータは1行ごとに入力する必要があることに注意してください。

引数を指定しないでOTTユーティリティを実行すると、オンライン・パラメータ・リファレンスが表示されます。

OTTユーティリティによって変換される型は、INTYPEパラメータで指定されたファイルに従って名前が付けられます。CASE、CPPFILE、HFILE、INITFILE、INITFUNC、MAPFILEおよびMAPFUNCの各パラメータは、INTYPEファイルにも指定できます。OTTユーティリティによって生成されたOUTTYPEファイルにはCASEパラメータが含まれ、初期化ファイルが生成された場合はINITFILEパラメータとINITFUNCパラメータが、C++コードが生成された場合はMAPFILEパラメータとMAPFUNCパラメータが含まれます。OUTTYPEファイルおよびC++用のCPPFILEは、各型に対するHFILEを個別に指定します。

OTTコマンドの大/小文字区別は、オペレーティング・システムによって異なります。

ファイル名の比較に関する制限

現在、OTTユーティリティでは、コマンドラインまたはINTYPEファイルにユーザーが指定したファイル名を比較することによって、2つのファイルが同一かどうかを判断しています。しかし、OTTユーティリティで2つのファイル名が同一のファイルを参照しているかどうかを判別する必要がある場合、1つの潜在的な問題が生じます。たとえば、OTTで生成されたファイルfoo1.hで、foo1.hに記述されている型宣言と、/private/smith/foo1.hに記述されている別の型宣言が必要な場合、OTTユーティリティは、2つのファイルが同一の場合は1つの#includeを、異なる場合は2つの#includeを生成する必要があります。しかし、実際にはOTTは2つのファイルが異なるとみなし、次のように2つの#includeを生成します。

#ifndef FOO1_ORACLE
#include "foo1.h"
#endif
#ifndef FOO1_ORACLE
#include "/private/smith/foo1.h"
#endif

foo1.hと/private/smith/foo1.hが異なるファイルである場合は、最初のファイルのみがインクルードされることになります。foo1.hと/private/smith/foo1.hが同一ファイルである場合は、冗長な#includeが記述されることになります。

そのため、1つのファイルをコマンドラインまたはINTYPEファイルに複数回指定する場合は、ファイルの各指定で同じファイル名を使用する必要があります。

INTYPEファイルの使用

OTTユーティリティの実行時に、INTYPEファイルは、変換するデータベース型をOTTユーティリティに指定します。INTYPEファイルは、生成する構造体やクラスの名前付けも制御します。INTYPEファイルは、直接作成できますが、以前にOTTユーティリティを起動したときに生成されたOUTTYPEファイルを利用することもできます。INTYPEファイルを使用しないと、OTTユーティリティが接続しているスキーマのすべての型が変換されます。

INTYPEファイルの概要

例8-8 OTTユーティリティを使用したユーザー定義INTYPEファイルの作成方法

CASE=LOWER
TYPE employee
TRANSLATE SALARY$ AS salary
DEPTNO AS department
TYPE ADDRESS
TYPE item
TYPE "Person"
TYPE PURCHASE_ORDER AS p_o

- 1行目のCASEパラメータは、小文字によるC識別子の生成を示しています。ただし、このCASEパラメータは、INTYPEファイルに明示的に記述されていない識別子にのみ適用されます。そのため、常にemployeeとADDRESSは、それぞれemployeeとADDRESSというC構造体になります。これらの構造体のメンバーには、小文字で名前が指定されます。

- TYPEキーワードで始まる行は、変換するデータベース内の型を指定します。この例では、EMPLOYEE型、ADDRESS型、ITEM型、PERSON型およびPURCHASE_ORDER型を変換するように設定しています。

- TRANSLATE...ASキーワードは、オブジェクト型をC構造体に変換するときに、オブジェクト属性の名前を変更することを指定しています。この例では、employee型のSALARY$属性がsalaryに変換されます。

- 最終行のASキーワードは、オブジェクト型を構造体に変換するときに、名前を変更することを指定しています。この例では、purchase_orderデータベース型をp_oと呼ばれる構造体に変換します。

OTTユーティリティでは、INTYPEファイルにリストされていない他の型の変換が必要になる場合があります。これは、OTTユーティリティは、変換前にINTYPEファイルにある型の依存性を分析し、必要に応じて他の型を変換するためです。たとえば、ADDRESS型はINTYPEファイルにリストされていなくても、Person型にADDRESS型の属性がある場合、OTTユーティリティでは、Person型の定義が必須のため、ADDRESSを変換します。

INTYPEファイルに指定されていない必要なオブジェクト型を、OTTユーティリティで生成するかどうかを指定できます。必要なオブジェクト型をOTTユーティリティで生成しない場合は、TRANSITIVE=FALSEを設定してください。デフォルトは、TRANSITIVE=TRUEです。

INTYPEファイルでは、通常の大/小文字の区別がないSQL識別子は、大/小文字のどのような組合せのつづりでも可能です。引用符は付けません。

CREATE TYPE "Person"などの大/小文字を区別して作成されているSQL識別子を参照するには、TYPE "Person"のように引用符を使用してください。SQL識別子は、宣言時に引用符が付けられた場合、大/小文字が区別されます。引用符は、TYPE "CASE"などのOTT予約語であるSQL識別子を参照するためにも使用できます。この場合、そのSQL識別子が、CREATE TYPE Caseのように大/小文字の区別なしに作成されていた場合、引用符付きの名前は大文字であることが必要です。SQL識別子の名前を参照するためのOTT予約語に引用符が付けられていない場合、OTTユーティリティは、INTYPEファイルに構文エラーをレポートします。

関連項目

- INTYPEファイルの構造に関する詳細な指定と使用可能なオプションは、「INTYPEファイルの構造」を参照してください。

- CASEパラメータの詳細は、「CASE」を参照してください。

INTYPEファイルの構造

INTYPEファイルとOUTTYPEファイルには、OTTユーティリティによって変換された型がリストされ、型名または属性名を有効なCまたはC++識別子に変換する方法の決定に必要なすべての情報が含まれています。これらのファイルには、1つ以上の型指定が記述されています。また、CASE、CPPFILE、HFILE、INITFILE、INITFUNC、MAPFILEまたはMAPFUNCが指定されている場合もあります。

CASE、INITFILE、INITFUNC、MAPFILEまたはMAPFUNCオプションを指定する場合は、すべての型指定に先行して指定する必要があります。これらのオプションがコマンドラインとINTYPEファイルの両方に指定されている場合は、コマンドラインの値が使用されます。

関連項目
簡単なユーザー定義のINTYPEファイルの例およびこのファイルからOTTユーティリティによって生成される完全なOUTTYPEファイルの例は、「OUTTYPEファイルの概要」を参照してください。

INTYPEファイルの型指定

INTYPEファイル内の型指定によって、変換するオブジェクト・データ型の名前が指定されます。次の記述は、ユーザー作成INTYPEファイルの例です。

TYPE employee
TRANSLATE SALARY$ AS salary
DEPTNO AS department
TYPE ADDRESS
TYPE PURCHASE_ORDER AS p_o

型指定の構造は、次のとおりです。

TYPE type_name
[GENERATE type_identifier]
[AS type_identifier]
[VERSION [=] version_string]
[HFILE [=] hfile_name]
[CPPFILE [=] cppfile_name]
[TRANSLATE{member_name [AS identifier]}...]

type_nameの構文は、次のフォーマットに従います。

[schema_name.]type_name

この構文のschema_nameは、指定されたオブジェクト・データ型を所有するスキーマの名前です。type_nameは、その型の名前です。未指定の場合、デフォルト・スキーマはOTTユーティリティを起動しているユーザーIDのスキーマになります。特定のスキーマを使用するには、schema_nameを使用する必要があります。

型指定の構成要素は、次のとおりです。

- type_name: オブジェクト・データ型の名前です。

- type_identifier: クラスの表現に使用するCまたはC++の識別子です。GENERATE句は、OTTユーティリティが生成するクラスの名前を指定するために使用されます。記述するクラスの名前は、AS句によって指定されます。GENERATE句は、通常、クラスを拡張するために使用されます。ユーザー定義型を示すC構造体またはC++クラスの名前は、必要に応じて、GENERATE句を伴わずに、AS句によって指定されます。

- version_string: 型のバージョン文字列です。OTTユーティリティが前の起動でコードを生成したときに使用した内容です。バージョン文字列は、OTTユーティリティによって生成され、OUTTYPEファイルに出力されます。このファイルは、後でOTTユーティリティを起動するときにINTYPEファイルとして使用できます。バージョンの文字列は、OTTユーティリティ操作には影響を与えませんが、実行中のプログラムで使用するオブジェクト・データ型のバージョンを選択するために使用できます。

- hfile_name: 対応するクラスの宣言が書き込まれるヘッダー・ファイルの名前です。HFILE句を省略すると、コマンドラインのHFILEパラメータで指定したファイルが使用されます。

- cppfile_name: 対応するクラスのメソッド実装が書き込まれるC++ソース・ファイルの名前です。CPPFILE句を省略すると、コマンドラインのCPPFILEパラメータで指定したファイルが使用されます。

- member_name: 識別子に変換される属性（データ・メンバー）の名前です。

- identifier: プログラムで属性を表現するために使用するCまたはC++の識別子です。この方法によって、任意の数の属性に対して識別子を指定できます。属性が指定されていない場合には、デフォルトの名前マッピング・アルゴリズムが使用されます。

オブジェクト・データ型は、次のいずれかの場合に変換できます。

- そのオブジェクト・データ型がINTYPEファイルに指定されている場合。

- そのオブジェクト・データ型には変換が必要な別の型の宣言が必要で、TRANSITIVEパラメータがTRUEに設定されている場合。

明示的に記述されていない型が、あるファイル内で正確に宣言された型に必要とされる場合、必要とされる型の変換結果は、その結果を必要とする明示的に宣言された型と同じファイルに書き込まれます。

明示的に記述されていない型が、複数の異なるファイル内で宣言された型に必要とされる場合、必要とされる型の変換結果は、グローバルなHFILEファイルに書き込まれます。

INTYPEファイルに指定されていない必要なオブジェクト型を、OTTユーティリティで生成するかどうかを指定できます。必要なオブジェクト型をOTTユーティリティで生成しない場合は、TRANSITIVE=FALSEを設定してください。デフォルトは、TRANSITIVE=TRUEです。

ネストされたインクルード・ファイル（#include）の生成

OTTユーティリティで生成したHFILEファイルには、他の必要なファイルをインクルード（#include）し、ファイル名から作成した記号を定義（#define）します。この記号#defineは、関連するHFILEファイルがインクルードされているかどうかの判断に使用できます。たとえば、次の型を持つデータベースについて考えます。

create type px1 AS OBJECT (col1 number, col2 integer);
create type px2 AS OBJECT (col1 px1);
create type px3 AS OBJECT (col1 px1);

INTYPEファイルには、次の情報が記述されます。

CASE=lower
type pxl
hfile tott95a.h
type px3
hfile tott95b.h

次のように、OTTユーティリティを起動します。

>ott hr intype=tott95i.typ outtype=tott95o.typ code=cpp
...
Enter password: password

OTTユーティリティは、tott95a.hとtott95b.hというファイル名を持つ2つのヘッダー・ファイルを作成します。これらのファイルを次に示します。

例8-9 ott95a.hのリスト

#ifndef TOTT95A_ORACLE
# define TOTT95A_ORACLE

#ifndef OCCI_ORACLE
# include <occi.h>
#endif

/************************************************************/
//  generated declarations for the PX1 object type.
/************************************************************/

class px1 : public oracle::occi::PObject {

protected:
oracle::occi::Number col1;
oracle::occi::Number col2;

public:
void *operator new(size_t size);
void *operator new(size_t size, const oracle::occi::Connection * sess,
const OCCI_STD_NAMESPACE::string& table);
void *operator new(size_t, void *ctxOCCI_);
void *operator new(size_t size, const oracle::occi::Connection *sess,
const OCCI_STD_NAMESPACE::string &tableName,
const OCCI_STD_NAMESPACE::string &typeName,
const OCCI_STD_NAMESPACE::string &tableSchema,
const OCCI_STD_NAMESPACE::string &typeSchema);
void getSQLTypeName(oracle::occi::Environment *env, void **schemaName,
unsigned int &schemaNameLen, void **typeName,
unsigned int &typeNameLen) const;
px1();
px1(void *ctxOCCI_) : oracle::occi::PObject (ctxOCCI_) { };
static void *readSQL(void *ctxOCCI_);
virtual void readSQL(oracle::occi::AnyData& streamOCCI_);
static void writeSQL(void *objOCCI_, void *ctxOCCI_);
virtual void writeSQL(oracle::occi::AnyData& streamOCCI_);
~px1();
};

#endif

例8-10 ott95b.hのリスト

#ifndef TOTT95B_ORACLE
# define TOTT95B_ORACLE

#ifndef OCCI_ORACLE
# include <occi.h>
#endif

#ifndef TOTT95A_ORACLE
# include "tott95a.h"
#endif

/************************************************************/
//  generated declarations for the PX3 object type.
/************************************************************/

class px3 : public oracle::occi::PObject {

protected:
px1 * col1;

public:
void *operator new(size_t size);
void *operator new(size_t size, const oracle::occi::Connection * sess,
const OCCI_STD_NAMESPACE::string& table);
void *operator new(size_t, void *ctxOCCI_);
void *operator new(size_t size, const oracle::occi::Connection *sess,
const OCCI_STD_NAMESPACE::string &tableName,
const OCCI_STD_NAMESPACE::string &typeName,
const OCCI_STD_NAMESPACE::string &tableSchema,
const OCCI_STD_NAMESPACE::string &typeSchema);
void getSQLTypeName(oracle::occi::Environment *env, void **schemaName,
unsigned int &schemaNameLen, void **typeName,
unsigned int &typeNameLen) const;
px3();
px3(void *ctxOCCI_) : oracle::occi::PObject (ctxOCCI_) { };
static void *readSQL(void *ctxOCCI_);
virtual void readSQL(oracle::occi::AnyData& streamOCCI_);
static void writeSQL(void *objOCCI_, void *ctxOCCI_);
virtual void writeSQL(oracle::occi::AnyData& streamOCCI_);
~px3();
};
#endif

tott95b.hファイルでは、記号TOTT95B_ORACLEがファイルの先頭に定義（#define）されています。これによって、次の構造体を使用してこのヘッダー・ファイルを別のファイルに条件付きでインクルード(#include)できます。

#ifndef TOTT95B_ORACLE
#include "tott95b.h"
#endif

この方法を使用すると、たとえば、foo.hにtott95b.hをインクルード（#include）できます。この場合、foo.hに他のファイルのインクルード（#include）があるかどうか、また、tott95b.hのインクルード（#include）があるかどうかを事前に知る必要はありません。

次に、ファイルtott95a.hがインクルードされます。これは、このファイルにはtott95b.hに必要なstruct px1の宣言が指定されているためです。INTYPEファイルの要求で、複数のファイルに型宣言を書き込む場合、OTTユーティリティは、各HFILEにインクルード(#include)する必要のある他のファイルを判断し、必要な#includeファイルをそれぞれ生成します。

OTTユーティリティでは、この#includeに" "が使用されます。tott95b.hがインクルードされているプログラムをコンパイルするとき、tott95a.hの検索は、ソース・プログラムが検出された場所から開始され、以降は実装定義の検索規則に従います。この方法でtott95a.hを検索できない場合は、tott95a.hの位置を指定するために完全なファイル名(スラッシュ文字(/)で始まるUNIXの絶対パス名など)がINTYPEファイルに必要です。

OTTユーティリティのデータ型マッピング

OTTユーティリティによって、データベース型からC++クラスが生成されると、構造体またはクラスには、オブジェクト型の各属性に対応する1つの要素が含まれます。属性のデータ型は、Oracleオブジェクト・データ型で使用される型にマッピングされます。Oracleのデータ型には、事前定義の基本的な一連の型が組み込まれており、オブジェクト型やコレクションなどのユーザー定義の型の作成をサポートします。

一連の事前定義の型には、数値型や文字型を含む、プログラマによく知られている標準の型があります。ラージ・オブジェクト・データ型(BLOBやCLOBなど)も含まれています。

例8-11 OTTユーティリティを使用したオブジェクト属性の表現方法

Oracleには、オブジェクト型属性をC++クラスで表現するための一連の事前定義の型も含まれています。次のようなオブジェクト型定義とそれに対応するOTT生成の構造体宣言を想定します。

CREATE TYPE employee AS OBJECT
(  name       VARCHAR2(30),
empno      NUMBER,
deptno     NUMBER,
hiredate   DATE,
salary     NUMBER
);

CASEパラメータがLOWERに設定され、型名または属性名の明示的なマッピングがないと仮定すると、OTTユーティリティの出力は、次のようになります。

#ifndef DATATYPES_ORACLE
# define DATATYPES_ORACLE

#ifndef OCCI_ORACLE
# include <occi.h>
#endif

/************************************************************/
//  generated declarations for the EMPLOYEE object type.
/************************************************************/

class employee : public oracle::occi::PObject {

protected:
OCCI_STD_NAMESPACE::string NAME;
oracle::occi::Number EMPNO;
oracle::occi::Number DEPTNO;   oracle::occi::Date HIREDATE;
oracle::occi::Number SALARY;

public:
void *operator new(size_t size);
void *operator new(size_t size, const oracle::occi::Connection * sess,
const OCCI_STD_NAMESPACE::string& table);
void *operator new(size_t, void *ctxOCCI_);
void *operator new(size_t size, const oracle::occi::Connection *sess,
const OCCI_STD_NAMESPACE::string &tableName,
const OCCI_STD_NAMESPACE::string &typeName,
const OCCI_STD_NAMESPACE::string &tableSchema,
const OCCI_STD_NAMESPACE::string &typeSchema);
void getSQLTypeName(oracle::occi::Environment *env, void **schemaName,
unsigned int &schemaNameLen, void **typeName,
unsigned int &typeNameLen) const;
employee();
employee(void *ctxOCCI_) : oracle::occi::PObject (ctxOCCI_) { };
static void *readSQL(void *ctxOCCI_);
virtual void readSQL(oracle::occi::AnyData& streamOCCI_);
static void writeSQL(void *objOCCI_, void *ctxOCCI_);
virtual void writeSQL(oracle::occi::AnyData& streamOCCI_);
~employee();

};

#endif

表8-2は、属性として使用できる型から、OTTユーティリティで生成されるオブジェクト・データ型へのマッピングのリストです。

表8-2 オブジェクト型属性のC++オブジェクト・データ型マッピング

オブジェクト属性の型

C++マッピング

BFILE

Bfile

BLOB

Blob

BINARY_DOUBLE

BDouble

BINARY_FLOAT

BFloat

CHAR(n)、CHARACTER(n)

string

CLOB

Clob

DATE

Date

DEC、DEC(n)、DEC(n,n)

Number

DECIMAL、DECIMAL(n)、DECIMAL(n,n)

Number

FLOAT、FLOAT(n)、DOUBLE PRECISION

Number

INT、INTEGER、SMALLINT

Number

INTERVAL DAY TO SECOND

IntervalDS

INTERVAL YEAR TO MONTH

IntervalYM

ネストされたオブジェクト型

ネストされたオブジェクト型のC++の名前

NESTED TABLE

vector<attribute_type>

NUMBER、NUMBER(n)、NUMBER(n,n)

Number

NUMERIC、NUMERIC(n)、NUMERIC(n,n)

Number

RAW

Bytes

REAL

Number

REF

Ref<attribute_type>

TIMESTAMP、TIMESTAMP WITH TIME ZONE、TIMESTAMP WITH LOCAL TIME ZONE

Timestamp

VARCHAR(n)

string

VARCHAR2(n)

string

VARRAY

vector<attribute_type>

例8-12 OTTユーティリティを使用したオブジェクト・データ型のマップ方法

この例では、次のデータベース型が作成されていることを想定しています。

CREATE TYPE my_varray AS VARRAY(5) of integer;

CREATE TYPE object_type AS OBJECT
(object_name VARCHAR2(20));

CREATE TYPE other_type AS OBJECT
(object_number NUMBER);

CREATE TYPE my_table AS TABLE OF object_type;

CREATE TYPE many_types AS OBJECT
(
the_varchar    VARCHAR2(30),
the_char       CHAR(3),
the_blob       BLOB,
the_clob       CLOB,
the_object     object_type,
another_ref    REF other_type,
the_ref        REF many_types,
the_varray     my_varray,
the_table      my_table,
the_date       DATE,
the_num        NUMBER,
the_raw        RAW(255)
);

INTYPEファイルが存在し、次のオプションが含まれます。

CASE = LOWER
TYPE many_types

次の記述は、C++に関するOTTの型マッピングの例です。前項の例で作成された型と次のオプションを含むINTYPEファイルを前提にしています。

CASE = LOWER
TYPE many_types

#ifndef MYFILENAME_ORACLE
#define MYFILENAME_ORACLE

#ifndef OCCI_ORACLE
#include <occi.h>
#endif

/************************************************************/
//  generated declarations for the OBJECT_TYPE object type.
/************************************************************/

class object_type : public oracle::occi::PObject
{
protected:
OCCI_STD_NAMESPACE::string object_name;

public:
void *operator new(size_t size);
void *operator new(size_t size, const oracle::occi::Connection * sess,
const OCCI_STD_NAMESPACE::string& table);
void getSQLTypeName(oracle::occi::Environment *env, void **schemaName,
unsigned int &schemaNameLen, void **typeName,
unsigned int &typeNameLen) const;
object_type();
object_type(void *ctxOCCI_) : oracle::occi::PObject (ctxOCCI_) { };
static void *readSQL(void *ctxOCCI_);
virtual void readSQL(oracle::occi::AnyData& streamOCCI_);
static void writeSQL(void *objOCCI_, void *ctxOCCI_);
virtual void writeSQL(oracle::occi::AnyData& streamOCCI_);
};

/************************************************************/
//  generated declarations for the OTHER_TYPE object type.
/************************************************************/

class other_type : public oracle::occi::PObject
{
protected:
oracle::occi::Number object_number;

public:
void *operator new(size_t size);
void *operator new(size_t size, const oracle::occi::Connection * sess,
const OCCI_STD_NAMESPACE::string& table);
void getSQLTypeName(oracle::occi::Environment *env, void **schemaName,
unsigned int &schemaNameLen, void **typeName,
unsigned int &typeNameLen) const;
other_type();
other_type(void *ctxOCCI_) : oracle::occi::PObject (ctxOCCI_) { };
static void *readSQL(void *ctxOCCI_);
virtual void readSQL(oracle::occi::AnyData& streamOCCI_);
static void writeSQL(void *objOCCI_, void *ctxOCCI_);
virtual void writeSQL(oracle::occi::AnyData& streamOCCI_);
};

/************************************************************/
//  generated declarations for the MANY_TYPES object type.
/************************************************************/

class many_types : public oracle::occi::PObject
{
protected:
OCCI_STD_NAMESPACE::string the_varchar;
OCCI_STD_NAMESPACE::string the_char;
oracle::occi::Blob the_blob;
oracle::occi::Clob the_clob;
object_type * the_object;
oracle::occi::Ref< other_type > another_ref;
oracle::occi::Ref< many_types > the_ref;
OCCI_STD_NAMESPACE::vector< oracle::occi::Number > the_varray;
OCCI_STD_NAMESPACE::vector< object_type * > the_table;
oracle::occi::Date the_date;
oracle::occi::Number the_num;
oracle::occi::Bytes the_raw;

public:
void *operator new(size_t size);
void *operator new(size_t size, const oracle::occi::Connection * sess,
const OCCI_STD_NAMESPACE::string& table);
void getSQLTypeName(oracle::occi::Environment *env, void **schemaName,
unsigned int &schemaNameLen, void **typeName,
unsigned int &typeNameLen) const;
many_types();
many_types(void *ctxOCCI_) : oracle::occi::PObject (ctxOCCI_) { };
static void *readSQL(void *ctxOCCI_);
virtual void readSQL(oracle::occi::AnyData& streamOCCI_);
static void writeSQL(void *objOCCI_, void *ctxOCCI_);
virtual void writeSQL(oracle::occi::AnyData& streamOCCI_);
};

#endif

OTTユーティリティでは、次のC++クラス宣言が生成されます（コメントはOTT出力の一部ではなく、例を明解にする目的でのみ追加したものです）。

C++では、TRANSITIVE=TRUEの場合、OTTユーティリティは、変換する型の属性として使用されている型をすべて自動的に変換します。これには、オブジェクト型属性のポインタまたはREFによってのみアクセスされる型も含まれます。C++の例では、many_typesオブジェクトのみがINTYPEファイルに指定されていますが、クラス宣言はすべてのオブジェクト型に対して生成されています。これには、many_typesオブジェクトのREFによってのみアクセスされるother_typeオブジェクトも含まれています。

デフォルトの名前のマッピング

オブジェクト型または属性に対するCまたはC++の識別子名を作成する場合、OTTユーティリティは、その名前をデータベース・キャラクタ・セットから有効なCまたはC++の識別子に変換します。最初に、データベース・キャラクタ・セットからOTTユーティリティで使用するキャラクタ・セットに、名前が変換されます。次に、変換した結果の名前がINTYPEファイルに指定されている場合は、その変換内容が使用されます。それ以外の場合、OTTユーティリティは、CASEパラメータに指定されている大/小文字を適用して、名前を文字ごとにコンパイラのキャラクタ・セットに変換します。詳細を次に説明します。

OTTユーティリティがデータベース・エンティティの名前を読み込むと、その名前は、データベース・キャラクタ・セットからOTTユーティリティが使用するキャラクタ・セットに自動的に変換されます。OTTユーティリティがデータベース・エンティティの名前を正常に読み込めるように、名前のすべての文字はOTTのキャラクタ・セットにある必要があります。ただし、文字のコードが2つのキャラクタ・セットで異なっている場合があります。

OTTユーティリティで使用するキャラクタ・セットに必要なすべての文字が含まれていることを保証する最も簡単な方法は、データベース・キャラクタ・セットの内容と同一にすることです。ただし、OTTのキャラクタ・セットは、コンパイラのキャラクタ・セットのスーパーセットである必要があります。つまり、コンパイラのキャラクタ・セットが7ビットASCIIの場合は、OTTのキャラクタ・セットにはサブセットとして7ビットASCIIを含める必要があります。コンパイラのキャラクタ・セットが7ビットEBCDICの場合は、OTTのキャラクタ・セットにはサブセットとして7ビットEBCDICを含める必要があります。ユーザーは、OTTユーティリティで使用するキャラクタ・セットを、環境変数NLS_LANGを設定して指定するか、他のオペレーティング・システム固有のメカニズムによって指定します。

OTTユーティリティは、読み込んだデータベース・エンティティの名前を、OTTユーティリティで使用するキャラクタ・セットからコンパイラのキャラクタ・セットに変換します。名前の変換内容がINTYPEファイルに指定されている場合、OTTユーティリティはその変換内容を使用します。

それ以外の場合、OTTユーティリティは、次のように名前を変換します。

1. OTTのキャラクタ・セットがマルチバイト・キャラクタ・セットの場合、名前の中で等価のシングルバイト文字を持つすべてのマルチバイト文字は、該当するシングルバイト文字に変換されます。

2. 名前は、OTTのキャラクタ・セットからコンパイラのキャラクタ・セットに変換されます。コンパイラのキャラクタ・セットは、US7ASCIIなどのシングルバイト・キャラクタ・セットです。

3. 文字の大/小文字は、CASEパラメータの定義に従って設定されます。CまたはC++識別子で無効な文字またはコンパイラのキャラクタ・セットに変換内容がない文字は、アンダースコア（_）に置換されます。1文字でもアンダースコアに置換された場合、OTTユーティリティは警告メッセージを表示します。名前の中のすべての文字がアンダースコアに置換された場合、OTTユーティリティはエラー・メッセージを表示します。

文字単位の名前の変換では、コンパイラのキャラクタ・セットにあるアンダースコア、数字またはシングルバイト文字は変更されません。したがって、有効なCまたはC++の識別子は変更されません。

名前の変換では、ウムラウト付きのoやアクサングラーブ付きのaなどのアクセント付きシングルバイト文字を、それぞれo、aまたはアクセントなしに変換したり、マルチバイト文字をそれと等価のシングルバイトに変換する場合があります。名前に等価のシングルバイトがないマルチバイト文字がある場合、通常、その名前の変換はエラーとなります。この場合、ユーザーは、INTYPEファイルで名前の変換を指定する必要があります。

C言語の同一の名前に複数のデータベース識別子がマッピングされている場合に生じる名前の競合は、OTTユーティリティでは検出されません。また、データベース識別子がCキーワードにマッピングされるときの名前の問題も検出されません。

OUTTYPEファイルの概要

OUTTYPEファイルは、OTTコマンドラインで名前が指定されます。OTTユーティリティによって、C++ヘッダー・ファイルが生成されると、変換の結果がOUTTYPEファイルに出力されます。このファイルには、変換された各型のエントリが、そのバージョン文字列も含めて格納され、さらに、C++表現で記述されたヘッダー・ファイルが格納されます。

あるOTTユーティリティの実行によるOUTTYPEファイルは、そのOTTユーティリティのその後の起動でINTYPEファイルとして使用できます。

例8-13 OTTユーティリティによって生成されるOUTTYPEファイル

このINTYPEファイルでは、プログラマによって、OTT生成のC++識別子に対して大/小文字の区別が指定され、変換する型のリストが用意されています。これらの型のうちの2つについては、ネーミング規則が指定されています。OTTユーティリティ実行後のOUTTYPEファイルは、次のようになります。

次に例を示します。

CASE = LOWER
TYPE EMPLOYEE AS employee
VERSION = "$8.0"
HFILE = demo.h
TRANSLATE SALARY$ AS salary
DEPTNO AS department
TYPE ADDRESS AS ADDRESS
VERSION = "$8.0"
HFILE = demo.h
TYPE ITEM AS item
VERSION = "$8.0"
HFILE = demo.h
TYPE "Person" AS Person
VERSION = "$8.0"
HFILE = demo.h
TYPE PURCHASE_ORDER AS p_o
VERSION = "$8.0"
HFILE = demo.h

INTYPEファイルで指定しなかった型がOUTTYPEファイルに含まれている場合があります。たとえば、INTYPEファイルにperson型のみの変換を指定した場合を想定します。

CASE = LOWER
TYPE PERSON

person型の定義にaddress型の属性が含まれている場合、OUTTYPEファイルには、PERSONとADDRESSの両方のエントリが含まれます。person型を完全に変換するには、最初にaddressを変換する必要があります。

OTTユーティリティは、変換前にINTYPEファイルにある型の依存性を分析し、必要に応じて他の型を変換します。

INTYPEファイルに指定されていない必要なオブジェクト型を、OTTユーティリティで生成するかどうかを指定できます。必要なオブジェクト型をOTTユーティリティで生成しない場合は、TRANSITIVE=FALSEを設定してください。デフォルトは、TRANSITIVE=TRUEです。

OTTユーティリティとOCCIアプリケーション

OTTユーティリティは、オブジェクトを生成し、SQLデータ型をC++クラスにマッピングします。OTTユーティリティは、オブジェクトをインスタンス化するときにOCCIがコールするいくつかのメソッドと、マッピングを環境に登録するためにOCCIアプリケーションでコールされる関数も実装しています。これらの宣言は、使用しているOCCIアプリケーションにインクルード（#include）するヘッダー・ファイルに格納されます。マッピングを登録する関数のプロトタイプは、OCCIアプリケーションにもインクルードされる独立したヘッダー・ファイルに記述されます。メソッド実装は、OCCIアプリケーションにリンクされているC++ソース・コード・ファイル(拡張子.cpp)に格納されます。マッピングを登録する関数は、アプリケーションにもリンクされている独立したC++（xxx.cpp）ファイルに格納されます。

図8-1は、OTTユーティリティをOCCIで使用する場合のステップを示しています。これらのステップは、次の図の後に説明します。

図8-1 OCCIにおけるOTTユーティリティ

「図8-1 OCCIにおけるOTTユーティリティ」の説明

1. SQL DLLを使用してデータベースに型定義を作成します。

2. OTTユーティリティで変換するデータベース型が含まれたINTYPEファイルを作成します。

3. C++が生成されるように指定し、OTTユーティリティを起動します。
OTTユーティリティは、次のファイルを生成します。

- オブジェクト型のC++クラス表現が含まれたヘッダー・ファイル(拡張子.h)。ファイル名は、HFILEパラメータによって、OTTコマンドラインに指定されます。

- マッピングを登録する関数(MAPFUNC)のプロトタイプが含まれたヘッダー・ファイル。

- オブジェクトをインスタンス化している間にOCCIがコールする静的メソッドが含まれたC++ソース・ファイル(拡張子.cpp)。ファイル名は、CPPFILEパラメータによって、OTTコマンドラインに指定されます。これらのメソッドは、使用しているOCCIアプリケーションから直接コールしないでください。

- マッピングを環境に登録するために使用する関数が含まれたファイル(拡張子.cpp)。ファイル名は、MAPFILEパラメータによって、OTTコマンドラインに指定されます。

- バージョン文字列や変換結果を書き込むファイルなど、変換された各型のエントリが含まれたファイル(OUTTYPEファイル)。ファイル名は、OUTTYPEパラメータによって、OTTコマンドラインに指定されます。

4. OCCIアプリケーションを記述し、OTTユーティリティで作成されたヘッダー・ファイルをOCCIソース・コード・ファイルにインクルードします。
アプリケーションで環境を宣言し、関数MAPFUNCをコールしてマッピングを登録します。

5. OCCIアプリケーションをコンパイルしてOCCIオブジェクト・コードを作成し、そのオブジェクト・コードをOCCIライブラリにリンクしてプログラム実行可能ファイルを作成します。

OTTユーティリティによって生成されるC++クラス

OTTユーティリティによって、データベース・オブジェクト型からC++クラスが生成されると、そのクラスの宣言には、オブジェクト型の各属性に対応する1つの要素が含まれます。属性のデータ型は、表8-2に定義されているように、Oracleオブジェクト・データ型で使用される型にマッピングされます。

各クラスごとに、2つのnew演算子、readSQL()メソッドおよびwriteSQL()メソッドが生成されます。これらは、オブジェクトのマーシャリングおよびアンマーシャリングの際にOCCIによって使用されます。

デフォルトでは、オブジェクト型に対してOTTユーティリティが生成したC++クラスはPObjectクラスから導出されるため、生成されたそのクラス内のコンストラクタもPObjectクラスから導出されます。継承されたデータベース型の場合、クラスは、生成されたコンストラクタのように親の型のクラスから導出され、親のクラスにはない属性に対応する要素のみが含まれます。

データベース型の属性に対応する要素を含むクラス宣言およびメソッド宣言は、OTTユーティリティによって生成されたヘッダー・ファイルに含まれます。メソッド実装は、OTTユーティリティによって生成されたCPPFILEファイルに含まれます。

例8-14 OTTユーティリティを使用してC++クラスを生成する方法

この例は、OTTユーティリティを使用してC++クラスを生成する方法を示しています。

1. 型を定義します。

CREATE TYPE FULL_NAME AS OBJECT (first_name CHAR(20),
last_name CHAR(20));
CREATE TYPE ADDRESS AS OBJECT (state CHAR(20), zip CHAR(20));
CREATE TYPE ADDRESS_TAB AS VARRAY(3) of REF ADDRESS;
CREATE TYPE PERSON AS OBJECT (id NUMBER, name FULL_NAME,
curr_addr REF ADDRESS, prev_addr_l ADDRESS_TAB) NOT FINAL;
CREATE TYPE STUDENT UNDER PERSON (school_name CHAR(20));

2. INTYPEファイルを準備します。

CASE = SAME
MAPFILE = RegisterMappings_3.cpp
TYPE FULL_NAME AS FullName
TRANSLATE first_name as FirstName
last_name as LastName
TYPE ADDRESS
TYPE PERSON
TYPE STUDENT

3. OTTユーティリティを起動します。

ott userid=demousr intype=demoin_3.typ outype=demoout_3.typ
code=cpp hfile=demo_3.h cppfile=demo_3.cpp

マップ・レジストリ関数

マッピングを環境に登録するために、1つの関数がOTTユーティリティによって生成されます。この関数には、OTTユーティリティの起動によって変換されるすべての型に対するマッピングが含まれています。関数名は、MAPFUNCパラメータに指定した名前になります。指定されていない場合は、MAPFILE パラメータから導出されます。この関数に対する引数は、Environmentへのポインタのみです。

この関数は、指定されたEnvironmentを使用してMapを取得し、変換した各タイプのマッピングを登録します。

C++クラスの拡張

OTTユーティリティによって生成されたクラスの機能を拡張するために、新しいクラスを導出できます。メソッドをクラスに追加することもできますが、内在するリスクがあるため、お薦めしません。

関連項目
OTTマーカーを使用して、OTT生成ファイルに追加するコードを保存する方法の詳細は、「ユーザー追加コードの引継ぎ」を参照してください。

CAddressクラスとMyAddressクラスの両方をSQLオブジェクト型ADDRESSから生成するには、MyAddressクラスをCAddressクラスから導出できます。OTTユーティリティは、生成するコードを次の方法で変更する必要があります。

- CAddressクラスのかわりにMyAddressクラスを使用して、データ型がADDRESSの属性を表現します。

- CAddressクラスのかわりにMyAddressクラスを使用して、データ型がADDRESSのベクターおよびREFの要素を表現します。

- ADDRESSから継承されるデータベース・オブジェクト型のベース・クラスとして、CAddressクラスのかわりにMyAddressクラスを使用します。導出クラスがMyAddressのサブタイプである場合でも、コールされたreadSQL()メソッドとwriteSQL()メソッドは、CAddressクラスのメソッドです。

注意:
あるクラスを、生成した別のクラスのベース・クラスとして拡張および使用する場合は、継承する型のクラスと継承される型のクラスを独立したファイルに生成する必要があります。

例8-15 OTTユーティリティを使用してC++クラスを拡張する方法

OTTユーティリティを使用してCAddressクラス（MyAddressクラスから導出）を生成するには、TYPE文に次の句を指定する必要があります。

TYPE ADDRESS GENERATE CAdress AS MyAddress

以前に作成したFULL_NAME、ADDRESS、PERSONおよびPFGRFDENTのデータベース型を指定し、INTYPEファイルを変更してGENERATE...AS句を挿入します。

CASE = SAME
MAPFILE = RegisterMappings_5.cpp

TYPE FULL_NAME GENERATE CFullName AS MyFullName
TRANSLATE first_name as FirstName
last_name as LastName

TYPE ADDRESS GENERATE CAddress AS MyAddress
TYPE PERSON GENERATE CPerson AS MyPerson
TYPE STUDENT GENERATE CStudent AS MyStudent

ユーザー追加コードの引継ぎ

OTT生成コードの機能を拡張するために、プログラマはOTT生成ファイルにコードを追加する場合があります。OTTは、事前定義されたマーカー（タグ）を検索することによって、OTT生成コードとユーザーが追加したコードを区別します。OTTでは、OTT_USERCODE_STARTを「ユーザー・コード・マーカーの開始」、OTT_USERCODE_ENDを「ユーザー・コード・マーカーの終了」と認識します。

OTTマーカーをサポートするため、ユーザー・ブロックは次のように定義されます。

OTT_USERCODE_START + user added code + OTT_USERCODE_END

OTTマーカーのサポートによって、*.hファイルおよび*.cppファイルのユーザーが追加したブロックを引き継ぐことができます。

OTTマーカーのプロパティ

次の各項では、OTTマーカーのサポートのプロパティについて説明します。

1. ユーザーは、ファイルを生成するために最初にOTTを起動するときから、コマンドライン・オプションUSE_MARKER=TRUEを使用する必要があります。

2. ユーザーは、マーカーを他のC++文と同様に処理する必要があります。コマンドライン・オプションUSE_MARKER=TRUEの使用時に、マーカーはOTTによって生成済ファイル内に次のように定義されます。

#ifndef OTT_USERCODE_START
#define OTT_USERCODE_START
#endif
#ifndef OTT_USERCODE_END
#define OTT_USERCODE_END
#endif

3. マーカーのOTT_USERCODE_STARTおよびOTT_USERCODE_ENDの前後には空白が必要です。

4. OTTは、次回のコード生成時に、マーカーに囲まれた指定のテキスト/コードをコピーします。
ユーザーが変更したコード:

1  // --- modified generated code
2  OTT_USERCODE_START
3  // --- including "myfullname.h"
4  #ifndef MYFULLNAME_ORACLE
5  #include "myfullname.h"
6  #endif
7  OTT_USERCODE_END
8  // --- end of code addition

引き継がれるコード:

1  OTT_USERCODE_START
2  // --- including "myfullname.h"
3  #ifndef MYFULLNAME_ORACLE
4  #include "myfullname.h"
5  #endif
6  OTT_USERCODE_END

5. 次の例に示すように、データベースのTYPEファイルまたはINTYPEファイルが変更されると、OTTでは、ユーザーが追加したコードを正しく引き継ぎません。

- ユーザーがタイプ名の大/小文字を変更すると、OTTでは、ユーザーがINTYPEファイル内のクラス名の大/小文字を変更する前にコードが関連付けられていたクラス名の判断に失敗します。

CASE=UPPER                               CASE=LOWER
TYPE employee                            TYPE employee
TRANSLATE SALARY$ AS salary              TRANSLATE SALARY$ AS salary
DEPTNO AS department                     DEPTNO AS department
TYPE ADDRESS                             TYPE ADDRESS
TYPE item                                TYPE item
TYPE "Person"                            TYPE "Person"
TYPE PURCHASE_ORDER AS p_o               TYPE PURCHASE_ORDER AS p_o

- ユーザーが別の名前でクラスを生成するように要求した場合(INTYPEファイルのGENERATE AS 句)、OTTでは、ユーザーがINTYPEファイル内のクラス名を変更する前にコードが関連付けられていたクラス名の判断に失敗します。

CASE=LOWER                           CASE=LOWER
TYPE employee                        TYPE employee
TRANSLATE SALARY$ AS salary          TRANSLATE SALARY$ AS salary
DEPTNO AS department                 DEPTNO AS department
TYPE ADDRESS                         TYPE ADDRESS
TYPE item                            TYPE item
TYPE "Person"                        TYPE "Person"
TYPE PURCHASE_ORDER AS p_o           TYPE PURCHASE_ORDER AS
purchase_order

6. OTTで.hファイルまたは.cppファイルの解析中にエラーが発生した場合、そのエラーはレポートされ、ファイルはエラーが発生した状態のままになります。これによって、ユーザーは、レポートされたエラーを修正し、OTTを再実行できます。

7. OTTでは、次の場合にエラーが発生します。

- OTT_USERCODE_STARTに対応するOTT_USERCODE_ENDが検出されない場合

- マーカーがネストされている場合（OTTで、前のOTT_USERCODE_STARTに対応するOTT_USERCODE_ENDが検出される前に、次のOTT_USERCODE_STARTが検出された場合）

- OTT_USERCODE_STARTの前にOTT_USERCODE_ENDが検出された場合

OTTマーカーの使用

ユーザーは、マーカーのサポートを有効にするために、コマンドライン・オプションUSE_MARKER=TRUEを使用する必要があります。ユーザーが追加したコードをOTTマーカーが引き継ぐには、一般的には2つの方法があります。

1. .hファイルにユーザー・コードを追加する場合。

- グローバル・スコープにユーザー・コードを追加する場合。通常は、ユーザーが別のヘッダー・ファイルを組み込んだり宣言を転送する必要がある場合です。後のコード例を参照してください。

- クラス宣言にユーザー・コードを追加する場合。OTT生成のクラス宣言に、データ・メンバー用のプライベート・スコープとメソッド用のパブリック・スコープがある場合、またはデータ・メンバー用の保護付きスコープとメソッド用のパブリック・スコープがある場合です。ユーザー・ブロックは、OTT生成のすべての宣言の後、いずれかのアクセス指定子内に追加できます。

例8-16 OTTユーティリティを使用してユーザー・コードをヘッダー・ファイルに追加する方法

...
#ifndef OTT_USERCODE_START
#define OTT_USERCODE_START
#endif
#ifndef OTT_USERCODE_END
#define OTT_USERCODE_END
#endif

#ifndef OCCI_ORACLE
#include <occi.h>
#endif

OTT_USERCODE_START     // user added code
...
OTT_USERCODE_END

#ifndef ...            // OTT generated include
#include " ... "
#endif

OTT_USERCODE_START     // user added code
...
OTT_USERCODE_END

class <class_name_1> : public oracle::occi::PObject
{  protected:
...             // OTT generated data members
OTT_USERCODE_START    // user added code  for data member / method
...                   //    declaration / inline method
OTT_USERCODE_END

public:
void *operator new(size_t size);
...
OTT_USERCODE_START   // user added code  for data member / method
...                  // declaration / inline method definition
OTT_USERCODE_END
};

OTT_USERCODE_START     // user added code
...
OTT_USERCODE_END

class <class_name_2> : public oracle::occi::PObject
{
...
};

OTT_USERCODE_START     // user added code
...
OTT_USERCODE_END
...
#endif                 // end of .h file

2. .cppファイルにユーザー・コードを追加する場合。 OTTでは、新規のユーザー定義メソッドをOTTマーカー内に追加できます。ユーザー・ブロックは、ファイルの先頭部分で、インクルード(include)の直後、かつOTT生成メソッドの定義の前に追加する必要があります。OTT生成のインクルード(include)が複数ある場合、ユーザー・コードは、それらのOTT生成のインクルードの間にも追加できます。xxx.cppファイル内のこれ以外の位置に追加されたユーザー・コードは引き継がれません。

例8-17 OTTユーティリティを使用してユーザー・コードをソース・ファイルに追加する方法

#ifndef OTT_USERCODE_START
#define OTT_USERCODE_START
#endif

#ifndef OTT_USERCODE_END
#define OTT_USERCODE_END
#endif
...
OTT_USERCODE_START    // user added code
...
OTT_USERCODE_END
...
OTT_USERCODE_START    // user added code
...
OTT_USERCODE_END

/*************************************************************
/ generated method implementations for the ... object type.
/*************************************************************/

void *<class_name_1>::operator new(size_t size)
{
return oracle::occi::PObject::operator new(size);
}
...
// end of .cpp file

9 グローバリゼーションおよびUnicodeのサポート

この章では、OCCIでのマルチバイト文字およびUnicode文字のサポートについて説明します。

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

- グローバリゼーションおよびUnicodeのサポートの概要

- キャラクタ・セットの指定

- グローバリゼーションおよびUnicodeのサポートのデータ型

- オブジェクトおよびOTTサポート

グローバリゼーションおよびUnicodeのサポートの概要

OCCIでは、Oracleでサポートされるすべてのマルチバイト文字およびUnicode文字でのアプリケーション開発が可能になりました。UnicodeのUTF16エンコーディングは完全にサポートされています。アプリケーション・プログラムでは、OCCI環境の作成時にキャラクタセットを指定できます。文字列引数(SQL文、ユーザー名、エラー・メッセージ、オブジェクト名など)を取るOCCIインタフェースは、すべてのキャラクタセットでデータを処理できるように拡張されています。リレーショナル表またはオブジェクトの文字データには、任意のキャラクタセットを使用できます。OCCIを使用して、多言語、グローバルおよびUnicodeアプリケーションを開発できます。

キャラクタ・セットの指定

OCCI環境を初期化する際に、OCCIアプリケーションで、クライアント・キャラクタセットおよびクライアント各国語キャラクタセットを指定する必要があります。クライアント・キャラクタセットは、すべてのSQL文、オブジェクト名とユーザー名、エラー・メッセージおよびすべてのCHARデータ型(CHAR、VARCHAR2、LONG)の列と属性のデータに対して、キャラクタセットを指定します。クライアント各国語キャラクタセットは、すべてのNCHARデータ型(NCHAR、NVARCHAR2)の列と属性のデータに対して、キャラクタセットを指定します。

クライアント・キャラクタセットおよびクライアント各国語キャラクタセットを利用する、新規のcreateEnvironment()インタフェースが提供されています。これによって、OCCIアプリケーションでは、初期化パラメータNLS_LANGおよびNLS_CHARに関係なく、キャラクタセット情報を動的に設定できます。

アプリケーションでクライアント・キャラクタセット(最初の引数)にOCCIUTF16を指定している場合、このアプリケーションではOCCIのUTF16インタフェースのみが使用されます。これらのインタフェースは、UString型の引数を取ります。

OCCI環境のキャラクタセットはクライアント側のみです。これらのキャラクタセットは、OCCIアプリケーションでOracleとの対話に使用されるキャラクタセットを示します。データベース・キャラクタセットおよびデータベース各国語キャラクタセットは、データベースの作成時に指定します。Oracleでは、サーバーがデータを処理する前に、クライアント・キャラクタセットおよびクライアント各国語キャラクタセットのすべてのデータが、データベース・キャラクタセットおよびデータベース各国語キャラクタセットに変換されます。

例9-1 グローバリゼーションおよびUnicodeのサポートの使用方法

Environment *env = Environment:createEnvironment("JA16SJIS","UTF8");

この文では、クライアント・キャラクタセットをJA16SJIS、クライアント各国語キャラクタセットをUTF8として、OCCI Environmentが作成されます。

有効なすべてのOracleキャラクタセット名(AL16UTF16を除く)を、createEnvironment()に渡すことができます。UTF16をキャラクタセットとして指定するには、OCCI固有の文字列OCCIUTF16 (大文字)を渡すことができます。

Environment *env = Environment::createEnvironment("OCCIUTF16","OCCIUTF16");
Environment *env = Environment::createEnvironment("US7ASCII", "OCCIUTF16");

グローバリゼーションおよびUnicodeのサポートのデータ型

グローバリゼーションのサポートおよびUnicode使用のためのデータ型には、UStringデータ型、マルチバイトおよびUTF16データ、CLOBおよびNCLOBデータ型があります。

UStringデータ型

UStringは、アプリケーションおよびOCCIライブラリで、UTF-16エンコーディングでのUnicodeデータの受渡しを可能にするデータ型です。UStringでは、C++ STL basic_stringおよびOracleのutextデータ型に基づいてテンプレートが作成されています。

typedef basic_string<utext> UString;

Oracleのutextデータ型は、2バイトのshortデータ型であり、Unicode文字をUTF-16エンコーディングで表現します。Unicode文字のコード・ポイントは、1つのutextまたは2つのutext（2または4バイト）で表現できます。欧州および大半のアジアのスクリプトの文字は、1つのutextで表現されます。Unicode 3.1規格で定義された補助文字は、2つのutext要素で表現されます。

Microsoft Windowsプラットフォームでは、UStringは、C++標準wstringデータ型と等価です。これは、wchar_tデータ型が、Microsoft Windowsプラットフォームの2バイトのshort (Oracleのutextと同一)に対して定義された型であり、アプリケーションにおいて、通常はUStringが必要とされる場所でwstring型の変数を使用できるためです。したがって、アプリケーションではOCCI Unicode APIに対し、リテラルの先頭に「L」の文字を付けて作成したワイドキャラクタ文字列リテラルを渡すこともできます。

例9-2 wstringデータ型の使用

//bind Unicode data using wstring data type
//binding the Euro symbol, UTF16 codepoint 0x20AC
wchar_t eurochars[] = {0x20AC,0x00};
wstring eurostr(eurochars);
stmt->setUString(1,eurostr);

//Call the Unicode version of createConnection by
//passing widechar literals
Connection *conn = Connection(L"HR",L"password",L"");

OCCIアプリケーションでは、UTF16キャラクタセットのデータに対してUStringデータ型を使用する必要があります。

マルチバイトおよびUTF16データ

JA16SJISおよびUTF8のようなマルチバイト・キャラクタセットのデータの場合、アプリケーションではC++のstring型を使用する必要があります。string引数を取る既存のOCCI APIでは、すべてのマルチバイト・キャラクタセットのデータを処理できます。string型を使用するため、OCCIではマルチバイト・キャラクタセットstringsに対して、バイト長セマンティクスのみをサポートしています。

例9-3 stringデータ型を使用したUTF8データのバインド

//bind UTF8 data
//binding the Euro symbol, UTF8 codepoint : 0xE282AC
char eurochars[] = {0xE2,0x82,0xAC,0x00};
string eurostr(eurochars)
stmt->setString(1,eurostr);//use the string interface

UTF16キャラクタセットのUnicodeデータについては、OCCI固有のデータ型UStringおよびOCCI UTF16インタフェースを使用する必要があります。

例9-4 UStringデータ型を使用したUTF16データのバインド

//bind Unicode data using UString data type
//binding the Euro symbol, UTF16 codepoint 0x20AC
utext eurochars[] = {0x20AC,0x00};
UString eurostr(eurochars);
stmt->setUString(1,eurostr);//use the UString interface

CLOBおよびNCLOBデータ型

Oracleは、大量の文字データを格納および処理するために、CLOBおよびNCLOBデータ型を提供します。CLOBはデータをデータベース・キャラクタセットで表現し、NCLOBはデータをデータベース各国語キャラクタセットで表現します。CLOBおよびNCLOBは、リレーショナル表で列の型として、またオブジェクト型の属性として使用できます。

CLOBおよびNCLOBデータ型には、どちらもOCCI Clobクラスを使用します。データベース型がNCLOBである場合、LOBの読取り/書込みの前に、ClobのsetCharSetForm()メソッドをOCCI_SQLCS_NCHARとともにコールする必要があります。

OCCI Clobクラスは、マルチバイト・キャラクタ・セットおよびUTF16キャラクタ・セットをサポートしています。デフォルトでは、Clobインタフェースで、CLOBおよびNCLOBのどちらの場合も、データがクライアント側のキャラクタ・セットでエンコーディングされることが想定されています。NCLOBについて、別のキャラクタ・セットまたはクライアント側の各国語キャラクタ・セットを指定するには、適切なキャラクタ・セットを使用してsetCharSetId()メソッドまたはsetCharSetIdUString()メソッドをコールします。UTF16をキャラクタセットとして指定するには、OCCI固有の文字列「OCCIUTF16」を渡すことができます。

例9-5 CLOBおよびNCLOBデータ型の使用

//client characterset - ZHT16BIG5, national characterset - UTF16
Environment *env = Environment::createEnvironment("ZHT16BIG5","OCCIUTF16");...
Clob nclobvar;
//for NCLOBs, must call setCharSetForm method.
nclobvar.setCharSetForm(OCCI_SQLCS_NCHAR);...
//if reading/writing data in UTF16 for this NCLOB, still must
//explicitly call setCharSetId
nclobvar.setCharSetId("OCCIUTF16")

マルチバイト・キャラクタセットのデータを読み書きするには、文字バッファを利用する既存の読み書き用インタフェースを使用します。UTF16データに対してutextバッファを利用する、オーバーロードされた新規のインタフェースが、read()メソッド、write()メソッドおよびwriteChunk()メソッドとしてClobクラスに追加されています。これらのメソッドの引数および戻り値は、LOBのキャラクタセットに応じて、バイトまたは文字のいずれかになります。

オブジェクトおよびOTTサポート

オブジェクト属性の文字データを処理するため、マルチバイト・キャラクタセットおよびUTF16キャラクタセットがサポートされています。すべてのCHARデータ型(CHARまたはVARCHAR2)属性では、データがクライアント側のキャラクタセットで保持されますが、すべてのNCHARデータ型(NCHARまたはNVARCHAR2)属性では、データがクライアント側の各国語キャラクタセットで保持されます。UStringデータ型のメンバー変数では、属性がUTF16キャラクタセットで表現されます。

関連項目

- 第13章「OCCI Application Program Interface（API）」: オブジェクト・サポートのためのPObjectクラスに、2つの新規バージョンのoperator new()が追加されました。

- 第8章「オブジェクト型トランスレータ・ユーティリティ」: OTTユーティリティのサポートのために、新規UNICODEパラメータが追加されました。

10 Oracle Streams Advanced Queuing

この章では、メッセージに対応するOracle Streams Advanced Queuing（AQ）のOCCI実装について説明します。

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

- Oracle Streams Advanced Queuingの概要

- OCCIでのAQ実装

- メッセージの作成

- メッセージのエンキュー

- メッセージのデキュー

- メッセージのリスニング

- 通知を受けるための登録

- メッセージ形式の変換

関連項目

- アドバンスト・キューイングの基本的な概念については、『Oracle Streamsアドバンスト・キューイング・ユーザーズ・ガイド』を参照してください。

- 第13章「OCCI Application Program Interface（API）」

Oracle Streams Advanced Queuingの概要

Oracle Streamsは、レプリケーション、メッセージ・キューイング、データ・ウェアハウスへのロード、およびイベント通知を提供する、新規の情報共有機能です。また、Oracle StreamsはOracle Streams Advanced Queuing（AQ）の基盤です。

Advanced Queuingは、Oracle Streamsのメッセージ・キューイング機能を公開する、統合されたメッセージ・キューイング機能です。AQにより、アプリケーションでは次のことが可能になります。

- Oracleデータベースから、SQL操作に類似したメッセージ・キューイング操作を実行

- AQキューのメッセージを介して非同期に通信

- データベースとの統合により、メッセージ・キューイングに対してこれまでにない操作上の簡潔性、信頼性およびセキュリティを提供

- メッセージの監査および追跡

- 同期モードおよび非同期モードの通信をサポート

関連項目
アドバンスト・キューイング機能の詳細は、http://www.oracle.com/technology/products/dataint/を参照してください。

OCCIアプリケーションでAQを使用する利点は、次のとおりです。

- 一貫性と信頼性を保ちながらセキュアな自律型の方法で相互に通信するアプリケーションを作成できます。

- メッセージをデータベース表に格納することで、メッセージ交換インフラストラクチャにデータベースの信頼性とリカバリ可能性を取り込みます。

- メッセージが自動的にデータベースに保存されることで、監査およびビジネス・インテリジェンスに使用可能です。

- 異なるセキュリティ、データ型または操作モードを使用することなくメッセージを送受信するアプリケーションを作成できます。

- データベースのトランザクションに関する特性を活用できます。

従来のメッセージ・ソリューションでは単一のサブスクライバ・キューを使用するため、キューは相互に通信するアプリケーションのペアごとに1つずつ作成する必要があります。AQのパブリッシュ/サブスクライブ・プロトコルにより、複数のアプリケーション間の対話にアプリケーション（サブスクライバ）を簡単に追加できます。

OCCIでのAQ実装

OCCI AQは、企業のメッセージ・アプリケーションにおいて、メッセージ・クライアントがOracleのアドバンスト・キューイング機能にアクセスできるようにする一連のインタフェースです。現在、OCCI AQでは管理インタフェースではなく操作インタフェースのみがサポートされていますが、埋込みのPL/SQLコールによって管理操作にもアクセスできます。

関連項目
AQサポートでのPL/SQLによる管理操作については、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』のDBMS_AQADMパッケージに関する項を参照してください。

AQ機能は、OCCIで使用可能な他のインタフェースと組み合せて、メッセージ対応データベースでの送信、受信、パブリッシュおよびサブスクライブに使用できます。メッセージ選択ルールに基づいた同期および非同期メッセージの受入れが可能です。

エンキューとはキューへのメッセージ送信を指し、デキューとはメッセージを受け取ることを指します。クライアント・アプリケーションでは、メッセージを作成して必要なプロパティを設定し、キュー（データベース内の表）に格納することでメッセージをエンキューできます。メッセージをデキューする場合、アプリケーションでは、キューに対して受取りメソッドをコールしてメッセージを同期的にデキューするか、データベースからの通知を待機して非同期的にデキューできます。

AQ機能は、Message、Agent、Producer、Consumer、ListenerおよびSubscriptionの抽象化によって実装されます。

Message

メッセージは情報の基本単位で、キューに挿入されたりキューから取得されたりします。メッセージは、制御情報およびペイロード・データで構成されます。制御情報とは、AQでメッセージの管理に使用されるメッセージ・プロパティを指します。ペイロード・データは、キューに格納される情報で、AQに対して透過的です。

関連項目
第13章「OCCI Application Program Interface（API）」の「Messageクラス」の説明

Agent

Agentは、キューのユーザーである、メッセージのプロデューサまたはコンシューマ、あるいはエンド・ユーザーまたはアプリケーションを指し、識別します。Agentは、名前、アドレスおよびプロトコルによって識別されます。名前は、アプリケーションによって割り当てられるか、またはアプリケーション自体です。アドレスは、通信プロトコルとして判別されます。プロトコルが0（デフォルト）である場合、アドレスの書式は[schema.]queuename[@dblink]（データベース・リンク）となります。

同一キュー上のAgentには、名前、アドレスおよびプロトコルの一意の組合せが必要です。例10-1は、クライアント・プログラムにおける新規Agentオブジェクトのインスタンス化を示しています。

例10-1 Agentの作成

Agent agt(env, "Billing_app", "billqueue", 0);

関連項目
第13章「OCCI Application Program Interface（API）」の「Agentクラス」の説明

Producer

クライアントは、Producerオブジェクトを使用してMessageをキューにエンキューします。また、各種エンキュー・オプションの指定にも使用されます。

関連項目
第13章「OCCI Application Program Interface（API）」の「Producerクラス」の説明

Consumer

クライアントは、Consumerオブジェクトを使用して、キューに配信されたMessageをデキューします。また、各種デキュー・オプションを指定します。

Consumerがメッセージを受信するには、ConsumerでAgentを設定します。

例10-2 ConsumerでのAgentの設定

Consumer cons(conn);
...
cons.setAgent(ag);
cons.receive();

関連項目
第13章「OCCI Application Program Interface（API）」の「Consumerクラス」の説明

Listener

Listenerは、指定されたキューで、登録されたAgentのMessageをリスニングします。

関連項目
第13章「OCCI Application Program Interface（API）」の「Listenerクラス」の説明

Subscription

Subscriptionは、通知用のサブスクライバの登録に必要な情報および操作をカプセル化します。

メッセージの作成

前述のように、Messageは、メッセージのプロパティとその内容（ペイロード）の両方を含む情報の基本単位です。各メッセージはProducerによってエンキューされ、Consumerオブジェクトによってデキューされます。

メッセージ・ペイロード

OCCIでは、RAW、AnyDataおよびユーザー定義の3種類のメッセージ・ペイロードをサポートしています。

RAW

RAWペイロードは、OCCIでBytesクラスのオブジェクトとしてマッピングされます。

AnyData

AnyData型は、自己記述データのカプセル化をモデル化します。つまり、型情報および実際のデータ値の両方が含まれます。大部分のSQL型のデータ値は、AnyDataに変換でき、その後元のデータ型に変換できます。また、AnyDataでは、ユーザー定義のデータ型がサポートされています。AnyDataペイロードを使用する利点は、エンキューおよびデキュー・プロセスの後も必ず型が保持され、ユーザーはアプリケーションで使用されるすべての型に対して単一のキューを使用できる点です。例10-3は、AnyDataメッセージの作成方法を示しています。例10-4は、メッセージから元のデータ型を取得する方法を示しています。

例10-3 文字列ペイロードを含むAnyDataメッセージの作成

AnyData any(conn);
any.setFromString("item1");
Message mes(env);
mes.setAnyData(any);

例10-4 AnyDataメッセージにおけるペイロードの型の判別

TypeCode tc = any.getType();

ユーザー定義

OCCIでは、ユーザー定義型のペイロードのエンキューおよびデキューをサポートしています。例10-5は、ユーザー定義のEmployeeオブジェクトによるペイロードの作成方法を示しています。

例10-5 ユーザー定義ペイロードの作成

// Assuming type Employee ( name varchar2(25),
//                          deptid number(10),
//                          manager varchar2(25) )
Employee *emp = new Employee();
emp.setName("Scott");
emp.setDeptid(10);
emp.setManager("James");
Message mes(env);
mes.setObject(emp);

メッセージ・プロパティ

ペイロードの他に、相関、送信者、遅延および有効期限、受信者、および優先順位および順序付けなど、ユーザーは複数の追加メッセージ・プロパティを指定できます。

相関

例10-6に示すように、アプリケーションでは、エンキュー・プロセスでメッセージの相関識別子を指定できます。この識別子は、後で、デキューするアプリケーションで使用できます。

例10-6 相関識別子の指定

mes.setCorrelationId("enq_corr_di");

送信者

例10-7に示すように、アプリケーションではメッセージの送信者を指定できます。送信者識別子は、後でメッセージの受信者が使用できます。

例10-7 送信者識別子の指定

mes.setSenderId(agt);

遅延および有効期限

例10-8に示すように、時間設定では、メッセージの遅延時間および有効期間が秒数で制御されます。

例10-8 メッセージの遅延時間および有効期間の指定

mes.setDelay(10);
mes.setExpirationTime(60);

受信者

例10-9に示すように、メッセージ・エンコーディングの際に、メッセージの宛先となるエージェントを指定できます。これによって、指定された受信者のみがメッセージにアクセスできるようになります。

例10-9 メッセージ受信者の指定

vector<Agent> agt_list;
for (i=0; i<num_recipients; i++)
agt_list.push_back(Agent(name, address, protocol));
mes.setRecipientList(agt_list);

優先順位および順序付け

優先順位レベルをメッセージに割り当てることで、送信者はメッセージが受信者によってデキューされる順序を制御できます。例10-10は、メッセージの優先順位の設定方法を示しています。

例10-10 メッセージの優先順位の指定

mes.setPriority(3);

メッセージのエンキュー

メッセージはProducerによってエンキューされます。また、Producerクラスはエンキュー・オプションの指定にも使用されます。例10-11に示すように、エンキューが実行される有効な接続においてProducerオブジェクトを作成できます。

エンキュー操作のトランザクションの動作は、アプリケーションの要件に基づいて定義できます。アプリケーションでは、エンキュー操作の結果を、例10-11のように操作の完了後すぐに、またはエンクロージング・トランザクションのコミット後にのみ外部に表示するにようにできます。

メッセージをエンキューするには、例10-11に示すようにsend()メソッドを使用します。クライアントは、Messageオブジェクトが送信された後もこれを保持し、変更して再度送信できます。

例10-11 Producerの作成、可視性の設定およびメッセージのエンキュー

Producer prod(conn);
...
prod.setVisibility(Producer::ENQ_IMMEDIATE);
...
Message mes(env);
...
mes.setBytes(obj);            // obj represents the content of the message
prod.send(mes, queueName);    // queueName is the name of the queue

メッセージのデキュー

キューに配信されたメッセージは、Consumerによってデキューされます。また、Consumerクラスはデキュー・オプションの指定にも使用されます。例10-12に示すように、キューが存在するデータベースへの有効な接続上で、Consumerオブジェクトを作成できます。

同一のキューで複数のコンシューマをサポートするアプリケーションでは、例10-12に示すように、コンシューマの名前をキューの登録済サブスクライバとして指定する必要があります。

メッセージをデキューするには、例10-12に示すようにreceive()メソッドを使用します。receive()メソッドのtypeNameパラメータおよびschemaNameパラメータは、ペイロードの型およびペイロード型のスキーマを指定します。

例10-12 Consumerの作成、Consumerのネーミングおよびメッセージの受信

Consumer cons(conn);
...
// Name must be registered with the queue through administrative interface
cons.setConsumerName("BillApp");
cons.setQueueName(queueName);
...
Message mes = cons.receive(Message::OBJECT, "BILL_TYPE", "BILL_PROCESSOR");
...
// obj is is assigned the content of the message
obj = mes.getObject();

キューのペイロード型がRAWまたはAnyDataの場合、schemaNameおよびtypeNameはオプションですが、ユーザー定義ペイロードを使用する場合、これらのパラメータを明示的に指定する必要があります。これについては例10-13に示しています。

例10-13 メッセージの受信

//receiving a RAW message
Message mes = cons.receive(Message::RAW);
...
//receiving an ANYDATA message
Message mes = cons.receive(Message::ANYDATA);
...

デキュー・オプション

デキューするアプリケーションでは、メッセージの受信を開始する前に、複数のデキュー・オプションを指定できます。指定できるオプションは、相関、モードおよびナビゲーションです。

相関

例10-14に示すように、setCorrelationId()メソッドを使用して、相関識別子の値に基づいてメッセージをデキューできます。

モード

ユーザーはアプリケーションの要件に基づいて、例10-14に示すように、setDequeueMode()メソッドを使用して、キューのメッセージの単なる閲覧、キューからのメッセージの削除、またはメッセージのロックを選択できます。

ナビゲーション

単一トランザクションでエンキューされたメッセージは、例10-14に示すように、setPositionOfMessage()メソッドを実装することで単一グループとして表示できます。

例10-14 デキュー・オプションの指定

cons.setCorrelationId(corrId);
...
cons.setDequeueMode(deqMode);
...
cons.setPositionOfMessage(Consumer::DEQ_NEXT_TRANSACTION);

メッセージのリスニング

Listenerは、登録されたクライアントのかわりにキューのメッセージをリスニングします。Listenerクラスはlisten()メソッドを実装しています。これはブロック化コールで、登録されたエージェントのメッセージがキューに格納された場合には戻され、またタイムアウト間隔が過ぎた場合にはエラーが発生します。例10-15は、リスニング・プロトコルを示しています。

例10-15 メッセージのリスニング

Listener listener(conn);

vector<Agent> agtList;
for( int i=0; i<num_agents; i++)
agtList.push_back( Agent( name, address, protocol);

listener.setAgentList(agtList);
listener.setTimeOutForListen(10);

Agent agt(env);

try{
agt = listener.listen();
}
catch{
cout<<e.getMessage()<<endl;
}

通知を受けるための登録

Subscriptionクラスは、パブリッシュ・サブスクライブ通知機能を実装しています。この機能により、OCCI AQアプリケーションでは、クライアント通知の直接受信、通知の送信先の電子メール・アドレスの登録、通知をポストするHTTP URLの登録、あるいは通知に対してコールされるPL/SQLプロシージャの登録を行うことができます。登録されたクライアントは、イベントがトリガーされたとき、またはイベントが明示的なAQエンキューにあるとき、非同期に通知を受け取ります。クライアントは、データベースに接続する必要はありません。

OCCIアプリケーションでは、次のすべての処理を実行できます。

- AQネームスペースに通知の実行を登録し、エンキューが発生したときに通知を受け取ります。

- データベース・イベントのサブスクリプションの実行を登録し、これらのイベントがトリガーされたときに通知を受け取ります。

- 一時的な登録の解除またはすべての登録の削除など、登録を管理します。

- 登録されたクライアントに通知を送信します。

パブリッシュ・サブスクライブ通知

通知は複数の方法で機能します。次の処理が可能です。

- OCCIアプリケーションでの直接受信

- 事前に指定された電子メール・アドレスへの送信

- 事前に定義されたHTTP URLへの送信

- 事前に指定したデータベースPL/SQLプロシージャのコール

登録されたクライアントは、イベントがトリガーされたとき、またはイベントが明示的なAQエンキューにあるとき、非同期に通知を受け取ります。クライアントは、通知を機能させるためにデータベースに接続する必要はありません。登録するには、直接登録とオープン登録の2つの方法があります。

直接登録

直接データベースに登録できます。これは比較的単純な方法で、登録は即時に有効になります。例10-16は、直接イベント通知に正常に登録するための必要なステップについて、概要を示しています。適切なイベント・トリガーまたはキューが存在し、初期化パラメータCOMPATIBLEが8.1以上に設定されていることを前提としています。

例10-16 通知への登録方法（直接登録）

1. Environment::EVENTSモードで環境を作成します。

2. Subscriptionオブジェクトを作成します。

3. 次のSubscription属性を設定します。
namespaceは次のオプションに設定できます。

- AQキューから通知を受信するには、namespaceをSubscription::NS_AQに設定する必要があります。サブスクリプション名は、シングル・コンシューマ・キューで登録する場合はSCHEMA.QUEUE、またはマルチ・コンシューマ・キューで登録する場合はSCHEMA.QUEUE:CONSUMER_NAMEという書式になります。

- conn->postToSubscription()メソッドを使用する他のアプリケーションから通知を受信するには、namespaceをSubscription::NS_ANONYMOUSに設定する必要があります。

protocolは次のオプションに設定できます。

- OCCIクライアントがイベント通知を受信する必要がある場合、この属性をSubscription::PROTO_CBKに設定します。また、Subscriptionを登録する前に、通知コールバックおよびサブスクリプション・コンテキストを設定する必要があります。通知コールバックは、イベントが発生したときにコールされます。

- 電子メール通知の場合、プロトコルをSubscription::PROTO_MAILに設定します。アプリケーション・エラーを避けるために、サブスクライブの前に受信者名を設定する必要があります。

- HTTP URL通知の場合、プロトコルをSubscription::HTTPに設定します。アプリケーション・エラーを避けるために、サブスクライブの前に受信者名を設定する必要があります。

- イベント通知に基づいてデータベースのPL/SQLプロシージャをコールするには、プロトコルをSubscription::PROTO_SERVERに設定します。アプリケーション・エラーを避けるために、サブスクライブの前に受信者名を設定する必要があります。

4. connection->registerSubscriptions()を使用してサブスクリプションを登録します。

オープン登録

データベースに登録要求を送信する中間LDAPを使用して登録することもできます。この方法は、データベースの停止中にクライアントがオープン・イベントに登録する場合など、クライアントがデータベースに直接接続できない場合に役立ちます。この方法は、クライアントが複数のデータベース内の同じイベントまたは複数のイベントに同時に登録する場合にも使用されます。

例10-17は、Oracle Enterprise Security Manager（OESM）を使用したLDAPオープン登録について、概要を示しています。オープン登録の前提条件は、次のとおりです。

- クライアントがエンタープライズ・ユーザーであることが必要です。

- 各エンタープライズ・ドメインで、エンタープライズ・ロールENTERPRISE_AQ_USER_ROLEを作成します。

- エンタープライズ・ドメイン内の各データベースについて、グローバル・ロールGLOBAL_AQ_USER_ROLEをエンタープライズ・ロールENTERPRISE_AQ_USER_ROLEに追加します。

- 各エンタープライズ・ドメインについて、エンタープライズ・ロールENTERPRISE_AQ_USER_ROLEを、管理コンテキスト内のcn=oraclecontextの下にある権限グループcn=OracleDBAQUsersに追加します。

- データベース内のイベントへの登録が承認された各エンタープライズ・ユーザーに対して、エンタープライズ・ロールENTERPRISE_AQ_USER_ROLEを付与します。

- データベースの互換性は、9.0以上であることが必要です。

- LDAP_REGISTRATION_ENABLEDをTRUEに設定する必要があります（デフォルトはFALSE）。

ALTER SYSTEM SET LDAP_REGISTRATION_ENABLED=TRUE

- LDAP_REG_SYNC_INTERVALを、LDAPからの登録をリフレッシュするためにtime_interval (秒単位)に設定する必要があります(デフォルトは0 (ゼロ)で、この場合リフレッシュは行われません)。

ALTER SYSTEM SET LDAP_REG_SYNC_INTERVAL = time_interval

データベースでLDAPの登録情報を即時にリフレッシュするには、次のコマンドを発行します。

ALTER SYSTEM REFRESH LDAP_REGISTRATION

例10-17 LDAPを介したオープン登録の使用方法

1. Environment::EVENTS|Environment::USE_LDAPモードで環境を作成します。

2. LDAPにアクセスするためのEnvironmentオブジェクトを設定します。

- LDAPサーバーが常駐し、リスニングしているホストおよびポート

- 認証方式（現在は、ユーザー名とパスワードの単純な認証のみがサポートされています）

- LDAPサーバーで認証するためのユーザー名（識別名）およびパスワード

- LDAPサーバー内のOracleに関する管理コンテキスト

3. Subscriptionオブジェクトを作成します。

4. クライアントがSubscriptionオブジェクトに関する通知を受信する、各データベースの識別名を設定します。

5. 次のSubscription属性を設定します。
namespaceは次のオプションに設定できます。

- AQキューから通知を受信するには、namespaceをSubscription::NS_AQに設定する必要があります。サブスクリプション名は、シングル・コンシューマ・キューで登録する場合はSCHEMA.QUEUE、またはマルチ・コンシューマ・キューで登録する場合はSCHEMA.QUEUE:CONSUMER_NAMEという書式になります。

- conn->postToSubscription()メソッドを使用する他のアプリケーションから通知を受信するには、namespaceをSubscription::NS_ANONYMOUSに設定する必要があります。

protocolは次のオプションに設定できます。

- OCCIクライアントがイベント通知を受信する必要がある場合、この属性をSubscription::PROTO_CBKに設定します。また、Subscriptionを登録する前に、通知コールバックおよびサブスクリプション・コンテキストを設定する必要があります。通知コールバックは、イベントが発生したときにコールされます。

- 電子メール通知の場合、プロトコルをSubscription::PROTO_MAILに設定します。その後、通知を送信する必要のある電子メール・アドレスに対して受信者名を設定する必要があります。

- HTTP URL通知の場合、プロトコルをSubscription::HTTPに設定します。通知がポストされるURLに対して受信者名を設定する必要があります。

- イベント通知に基づいてデータベースのPL/SQLプロシージャをコールするには、プロトコルをSubscription::PROTO_SERVERに設定します。通知に対してコールされるデータベース・プロシージャに対して、受信者名を設定する必要があります。

6. サブスクリプションenvironment->registerSubscriptions()を登録します。

データベースが新規登録を取り出すためにLDAPにアクセスすると、オープン登録された登録が有効になります。取り出す頻度は、REG_SYNC_INTERVALの値によって決定されます。

クライアントは、サブスクリプションを一時的に無効にしたり、再度有効にしたり、あるいは将来の通知から永続的に登録解除できます。

通知コールバック

クライアントは通知コールバックを登録する必要があります。通知コールバックは、登録したサブスクリプションに対してアクティビティが発生したときにのみコールされます。Streams AQネームスペースでは、対象となるメッセージがエンキューされたときに通知コールバックが発生します。

通知コールバックからは、0が戻される必要があります。また、次の指定が含まれる必要があります。

typedef unsigned int (*callbackfn) (Subscription &sub, NotifyResult *nr);

意味は次のとおりです。

- subパラメータは、コールバックの登録時に使用されたSubscriptionオブジェクトです。

- nrパラメータは、通知情報を保持するNotifyResultオブジェクトです。

通知への登録に使用したSubscriptionオブジェクトは、明示的にサブスクリプションを登録解除するまで破棄しないようにしてください。

ユーザーは、通知のソースに応じて、NotifyResultオブジェクトからペイロード、メッセージ、メッセージID、キュー名およびコンシューマ名を取得できます。表10-1にこれらの結果を示します。現在はBytesペイロードのみがサポートされており、AQネームスペースで永続キューからメッセージを明示的にデキューする必要があります。非永続キューからの通知である場合、メッセージはコールバックで直接使用できます。これには、RAWペイロードのみがサポートされています。永続キューからの通知である場合、メッセージは明示的にデキューする必要があります。これには、すべてのペイロード型がサポートされています。

表10-1 通知結果属性（ANONYMOUSおよびAQネームスペース）

通知結果属性

ANONYMOUSネームスペース

AQネームスペース、永続キュー

AQネームスペース、非永続キュー

ペイロード

有効

無効

無効

メッセージ

無効

無効

有効

メッセージID

無効

有効

有効

コンシューマ名

無効

有効

有効

キュー名

無効

有効

有効

メッセージ形式の変換

アプリケーションでは異なる形式のデータを使用することが多く、型の変換が必要となります。変換は、ソース・データ型を入力として使用し、ターゲット・データ型のオブジェクトを戻すSQL関数として実装されています。変換を適用できるのは、メッセージがエンキュー/デキューされるとき、またはメッセージがリモート・サブスクライバに伝播されるときです。

関連項目
形式変換の詳細は、『Oracle Streamsアドバンスト・キューイング・ユーザーズ・ガイド』の次の各章を参照してください。

- 「Oracle Streams AQ管理インタフェース」

- 「Oracle Streams AQ管理インタフェース: ビュー」

- 「Oracle Streams AQ操作インタフェース: 基本操作」

11 Oracle XAライブラリ

Oracle XAライブラリは、Oracleサーバー以外のトランザクション・マネージャでグローバル・トランザクションを調整できるようにする外部インタフェースです。Oracle XAライブラリでは、分散トランザクションにおいてOracle以外のリソース・マネージャがサポートされます。これは、複数のデータベースおよびリソース間のトランザクションで特に有効です。

Oracle XAライブラリの実装は、X/Open Distributed Transaction Processing（DTP）ソフトウェア・アーキテクチャのXAインタフェース仕様に準拠しています。Oracle XAライブラリは、Oracle Database Enterprise Editionの一部としてインストールされます。

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

- XAおよびOCCIによるアプリケーション開発

- XAサポートのためのAPI

関連項目

- http://www.opengroup.org

- Oracle XAライブラリおよびアーキテクチャの詳細は、『Oracle Databaseアドバンスト・アプリケーション開発者ガイド』を参照してください。

- 第13章「OCCI Application Program Interface（API）」

XAおよびOCCIによるアプリケーション開発

Oracleデータベースで接続、切断およびトランザクションを制御するには、アプリケーションとトランザクション・マネージャが連係している必要があります。OCCIには、XA内でEnvironmentオブジェクトおよびConnectionオブジェクトと対話し、これらをSELECT問合せ、DML文、オブジェクト・アクセスなどのOracleデータベース・アクセスに使用できるようにするためのAPIがあります。

例11-1 XAによるトランザクション・マネージャの使用方法

/* Transaction manager opens connection to the Oracle server*/
tpopen("oracle_xa+acc=p/HR/password+sestm=10", 1, TMNOFLAGS);
/* Transaction manager issues XA commands to start a global transaction*/
tpbegin();

/* Access the underlying Oracle database using OCCI */
Environment *xaenv = Environment::getXAEnvironment(
"oracle_xa+acc=p/HR/password+sestm=10");
Connection *xaconn = xaenv->getXAConnection(
"oracle_xa+acc=p/HR/password+sestm=10");

/* Use the Environment & Connection objects */
Statement *stmt = xaconn->createStatement(
"Update Emp set sal = sal * 0.2");

...

/* Release the Environment & Connection objects */
xaenv->releaseXAConnection(xaconn);
Environment::releaseXAEnvironment(xaenv);

XAサポートのためのAPI

Environmentクラスの次のメソッドは、XAライブラリの使用をサポートしています。

- getXAConnection()

- releaseXAEnvironment()

- releaseXAConnection()

- releaseXAEnvironment()

さらに、SQLエラー(XA_OK)またはXAエラー(XAエラー・コード)のどちらが原因で例外が発生したのかを判断するには、XA対応アプリケーションにSQLExceptionクラスのgetXAErrorCode()メソッドが必要です。

12 OCCIアプリケーションのパフォーマンスの最適化

この章では、OCCIカスタム・アプリケーションのパフォーマンスの向上にお薦めする方法を説明します。

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

- 透過的アプリケーション・フェイルオーバー

- 接続の共有

- アプリケーションによるデータ・バッファの管理

- next()メソッドを使用した配列フェッチ

- 行変更の反復

- ステートレスな接続プールのランタイム・ロード・バランシング

- 障害診断

- クライアントの結果キャッシュ

関連項目

- 第13章「OCCI Application Program Interface（API）」

透過的アプリケーション・フェイルオーバー

OCCIの透過的アプリケーション・フェイルオーバー(TAF)により、分散アプリケーションの実行時のデータベース・インスタンス障害の処理におけるOCCIの堅牢性が向上します。サーバー・ノードが使用できなくなると、アプリケーションは他の使用可能なノードに自動的に再接続します。

TAFは、ラウンドトリップ操作中にデータベース・インスタンスがダウンしていることをクライアント・アプリケーションが検出した場合に発生します。これにより、TAFに対して構成されたバックアップ・データベースへの接続が確立されます。このバックアップは、Oracle RAC構成の別のノード、ホスト・スタンバイ・データベースまたは同じデータベース・インスタンス自体にすることができます。

失敗した接続上のラウンドトリップに責任を持つOCCI/OCI APIは、通常、次のいずれかのエラーを返します。

- ORA-25401: フェッチを続行できません。

- ORA-25402: トランザクションをロールバックしてください。

- ORA-25408: 安全にコールを再実行することはできません。

後続のアプリケーション要求、および再起動が必要な進行中の作業には、新規接続を使用できます。アプリケーションのアイドル接続は影響を受けません。

アプリケーションで透過的アプリケーション・フェイルオーバーを使用する場合、いくつかの設計オプションを検討する必要があります。

- フェイルオーバー処理に内在する遅延ため、フェイルオーバーが進行中で通常の操作がまもなく再開されることをユーザーに通知するようにアプリケーションを設計できます。

- フェイルオーバーの開始前に、最初のインスタンスのセッションがALTER SESSIONコマンドを受信した場合、このコマンドは2番目のインスタンスでは自動再実行されません。
したがって、開発者としては、2番目のインスタンスでALTER SESSIONコマンドの再実行を要求する場合もあります。

SESSIONパラメータの変更の追跡は、ユーザーの責任で行ってください。

これらの問題に対応するため、このアプリケーションではフェイルオーバー・コールバック関数を登録できます。フェイルオーバーが発生した後、コールバック関数が、ユーザー・セッションの再確立中に数回呼び出されます。

- コールバック関数が最初にコールされるのは、Oracleがインスタンスの接続中断を最初に検出したときです。このコールバックは、アプリケーションがユーザーに対して遅延の発生を通知することを目的にしています。

- フェイルオーバーが正常終了すると、コールバック関数の2番目のコールは、接続が再確立して使用可能になったときに実行されます。このとき、クライアントでALTER SESSIONコマンドを再実行し、ユーザーにフェイルオーバーが発生したことを通知できます。SESSIONパラメータへの変更を追跡し、フェイルオーバー完了後に再実行する必要があることに留意してください。
フェイルオーバーが異常終了した場合、コールバック関数がコールされ、フェイルオーバーを実行できなかったことをアプリケーションに通知します。

- フェイルオーバーの最初の試行が正常に終了しないことがあります。フェイルオーバー・コールバックは、フェイルオーバーの再試行が必要なことを示すため、FO_RETRYを戻します。

関連項目

- 第13章「OCCI Application Program Interface（API）」、表13-11「Connectionクラスで使用される列挙値」のFailOverTypeおよびFailOverEventTypeの定義

- アプリケーション・フェイルオーバーの詳細は、『Oracle Database Net Services管理者ガイド』を参照してください。

透過的アプリケーション・フェイルオーバーの使用方法

TAFを有効にするため、フェイルオーバーのための接続文字列を構成し、Connection（Environment、ConnectionPoolおよびStatelessConnectionPoolから作成）に登録する必要があります。コールバック関数を登録するには、ConnectionクラスのインタフェースsetTAFNotify()を使用します。

void Connection::setTAFNotify(
int (*notifyFn)(
Environment *env,
Connection *conn,
void *ctx,
FailOverType foType,
FailOverEventType foEvent),
void *ctxTAF);

TAFでのConnectionPoolのサポートにはBACKUPおよびPRECONNECT句は含まれないため、接続文字列ではこれらを使用することはできません。

オブジェクトと透過的アプリケーション・フェイルオーバー

透過的アプリケーション・フェイルオーバーは、OCCIのナビゲーション・モデルと連想アクセス・モデル、およびオブジェクト・キャッシュと連携しています。非Oracle RAC設定では、プライマリ・インスタンスとバックアップ・インスタンスで、オブジェクト型定義とオブジェクトOIDが同一であることを確認する必要があります。

フェイルオーバーの後にアプリケーションが「ORA-25402: トランザクションをロールバックしてください。」のエラーを受信すると、アプリケーションはロールバックを開始し、そのクライアントのオブジェクト・キャッシュを正しくリセットします。フェイルオーバー前にトランザクションが開始されていない場合、アプリケーションはフェイルオーバー後にロールバックを開始し、そのクライアントのオブジェクト・キャッシュのオブジェクトを新しいインスタンスでリフレッシュします。

接続プーリングと透過的アプリケーション・フェイルオーバー

透過的アプリケーション・フェイルオーバー機能が有効である場合、接続プールで作成された接続もフェイルオーバーされます。接続プールから取得された各接続に対し、アプリケーション・フェイルオーバー・コールバックを指定する必要があります。これらの接続は、プライマリ・インスタンスの障害後に使用されるとフェイルオーバーされます。

カスタム接続プール内の接続は、明示的にクリーンアップおよび修復する必要があります。プールに500個の接続があるアプリケーションについて考えます。接続のうち10個はビジー(ラウンドトリップを実行中)で、490個は空きまたはアイドルです。データベース・インスタンスが失敗した場合、TAFは10個のアクティブ接続に対して動作し、これらの接続上のクライアント要求を再開する必要があります。他の490個の接続がそれぞれアプリケーションによって選択されると、TAFが実行され、OCCIはエラー・コードORA-25401、ORA-24502、ORA-25408のいずれかを返して、ユーザー要求を強制的に再開します。アプリケーションは、TAFが接続プールの10個の接続に対して以前にアクティブになったという知識を使用して、これらの接続を修復またはパージすることにより、490個のアイドル接続でこれらのエラーを回避できます。

OCCIで接続を修復するには、軽量でデータに依存しないデータベース・コールであるConnectionクラスのインタフェースgetServerVersion()を使用して、失敗したインスタンスへの接続上でTAFを開始します。

string getServerVersion() const;

OCCI TAFコールバックで、アプリケーションはカスタム・プール内のアイドル接続に対してgetServerVersion()を呼び出して、これらの接続のフェイルオーバーを開始および完了できます。

例12-1に、TAFコールバックおよび不良接続の修復にOCCIを使用する方法を示します。例では、カスタム・プールのデータ構造やmutexおよび同時実行性制御は示していません。

TAFの動作は、スタンドアロン接続とカスタム接続プールの接続とで同じです。

例12-1 接続プーリングに対してTAFを有効にする方法

#include <occi.h>
#include <iostream>
#include <time.h>

using namespace std;
using namespace oracle::occi;

//Application custom pool of 3 connections
Environment *env;
Connection *conn1,*conn2,*conn3;
bool conn1free,conn2free,conn3free;
bool repairing = false;

int taf_callback(Environment *env, Connection *conn, void *ctx,
Connection::FailOverType foType, Connection::FailOverEventType foEvent)
{
cout << "TAF callback for connection " << conn << endl;

if(foEvent == Connection::FO_ERROR)
{
cout << "Retrying" << endl;
return FO_RETRY;
}

if (foEvent ==  Connection::FO_END)
{
cout << "TAF complete for connnection " << conn << endl;
if (repairing == false)
{
repairing = true;
cout << "repairing other idle connections" << endl;

//ignore errors during TAF
try
{
if (conn1free) conn1->getServerVersion();
}
catch (...)
{
}
try
{
if (conn2free) conn2->getServerVersion();
}
catch (...)
{
}
try
{
if (conn3free) conn3->getServerVersion();
}
catch (...)
{
}
repairing = false;
}//if
}//if

return 0; //continue failover
}

main()
{
try
{
env = Environment::createEnvironment(Environment::THREADED_MUTEXED);
//open 3 connections;
conn1 = env->createConnection("hr","password","inst1_failback");
conn2 = env->createConnection("hr","password","inst1_failback");
conn3 = env->createConnection("hr","password","inst1_failback");

//all connections are 'free'
conn1free = conn2free = conn3free = true;

//set TAF callbacks on all connection
conn1->setTAFNotify(taf_callback,NULL);
conn2->setTAFNotify(taf_callback,NULL);
conn3->setTAFNotify(taf_callback,NULL);

//use 1 connection
conn1free=false;
cout << "Using conn1" << endl;
Statement *stmt = conn1->createStatement ("select * from employees");
ResultSet *rs  = stmt->executeQuery();
while (rs->next())
{
cout << (rs->getString(2)) << endl;
}
stmt->closeResultSet(rs);
conn1->terminateStatement(stmt);

cout << "Shutdown and restart the database" << endl;
string buf;
cin >> buf;

Statement *stmt2;
try
{
cout << "Trying a update on EMP table" << endl;
stmt2 = conn1->createStatement("delete from employees");
stmt2->executeUpdate();
}
catch (SQLException &ex)
{
cout << "Update EMPLOYEES returned error : " << ex.getMessage() << endl;
cin >> buf;
}

cout << "Done" << endl;
env->terminateConnection(conn1);
env->terminateConnection(conn2);
env->terminateConnection(conn3);
Environment::terminateEnvironment(env);
}
catch(SQLException &ex)
{
cout << ex.getMessage() << endl;
}
}

接続の共有

この項は、次の項目で構成されています。

- スレッド・セーフティの概要

- スレッド・セーフティの実装

- シリアライズ

- オペレーティング・システムの考慮事項

スレッド・セーフティの概要

スレッドは、大規模なプロセス内に存在する軽量プロセスです。複数のスレッドで同一コードおよび同一データ・セグメントを共有しますが、プログラム・カウンタ、システム・レジスタおよびスタックは、スレッドごとにあります。グローバル変数および静的変数は、すべてのスレッドに共通です。そのため、1つのアプリケーション内で、複数のスレッドによるこれらの変数へのアクセスを管理する相互排他メカニズムが必要です。

スレッドは、1度作成されると他のスレッドとは非同期的に動作します。このため、順序を気にせずに共通のデータ要素にアクセスし、OCCIコールを実行します。このようにデータ要素に共有アクセスを行うため、複数のスレッドによってアクセスされるデータの整合性を維持するメカニズムが必要です。データ・アクセスを管理するメカニズムでは、mutex（相互排他ロック）の形式を使用し、アプリケーション内の共有リソースにアクセスする複数のスレッド間で、競合が発生しないようにします。OCCIでは、mutexはOCCI環境単位で付与されます。

Oracleデータベース・サーバーおよびOCCIライブラリのスレッド・セーフティ機能により、開発者はOCCIをマルチスレッド・アプリケーションで使用でき、次の利点を得ることもできます。

- 複数のスレッドでOCCIコールを実行した場合も、単一のスレッドで連続するコールを実行した場合と同じ結果になります。

- 複数のスレッドでOCCIコールを実行した場合、スレッド間で副作用がありません。

- マルチスレッド・プログラムを作成しない場合にスレッド・セーフのOCCIコールを実行しても、パフォーマンスは低下しません。

- 複数のスレッドを使用すると、プログラムのパフォーマンスが向上します。パフォーマンスが向上するのは、別々のプロセッサでスレッドを同時実行するマルチプロセッサ・システム、および低速操作と高速操作の間でオーバーラップが発生するシングル・プロセッサ・システムの場合です。

クライアント/サーバー・アプリケーションでは、クライアントをマルチスレッド・プログラムにできますが、それに加え、スレッド・セーフティは3層アーキテクチャまたはクライアント/エージェント/サーバー・アーキテクチャで典型的に使用されます。このアーキテクチャでは、クライアントが関係するのはプレゼンテーション層のサービスのみです。エージェント（つまり、アプリケーション・サーバー）は、クライアント・アプリケーションのアプリケーション・ロジックを処理します。一般的には、この関係は多対1の関係で、複数のクライアントが同一のアプリケーション・サーバーを共有します。

この3層アーキテクチャのサーバー層は、Oracleデータベース・サーバーです。アプリケーション・サーバー（エージェント）はマルチスレッドをサポートし、各スレッドが別のクライアント・アプリケーションの要求を処理します。Oracle環境では、この中間層アプリケーション・サーバーはOCCIプログラムまたはプリコンパイラ・プログラムです。

スレッド・セーフティの実装

OCCIでスレッド・セーフティを使用するには、最初にアプリケーションをスレッド・セーフなオペレーティング・システム上で実行する必要があります。次に、createEnvironment()メソッドのモード・パラメータにTHREADED_MUTEXEDまたはTHREADED_UNMUTEXEDを指定することで、アプリケーションがマルチスレッド・モードで稼働していることをOCCIに通知する必要があります。たとえば、相互排他ロックをオンにするには、次の文を発行します。

Environment *env = Environment::createEnvironment(
Environment::THREADED_MUTEXED);

createEnvironmentにTHREADED_MUTEXEDまたはTHREADED_UNMUTEXEDを指定してコールする場合は、createEnvironmentメソッドの後続のコールもすべてTHREADED_MUTEXEDまたはTHREADED_UNMUTEXEDのモードを指定して実行する必要があります。

マルチスレッド・アプリケーションがスレッド・セーフなオペレーティング・システム上で稼働している場合、OCCIライブラリでは、アプリケーションのmutexがOCCI環境単位で管理されます。ただし、この機能を上書きし、アプリケーションで独自のmutexスキームを維持することもできます。これを行うには、createEnvironment()メソッドにTHREADED_UNMUTEXEDのモード値を指定します。

スレッド・セーフでないプラットフォームで稼働するアプリケーションの場合は、createEnvironment()メソッドにTHREADED_MUTEXEDまたはTHREADED_UNMUTEXEDの値を渡さないでください。

シングル・スレッド・アプリケーションの場合は、プラットフォームがスレッド・セーフであるかどうかにかかわらず、createEnvironmentメソッドにEnvironment::DEFAULTの値を渡す必要があります。これは、モード・パラメータのデフォルト値でもあります。シングル・スレッド・アプリケーションをTHREADED_MUTEXEDモードで稼働すると、パフォーマンスが低下する可能性があります。

OCCIでは非ブロック化モードがサポートされません。

シリアライズ

アプリケーション・プログラマは、マルチスレッド・アプリケーションでの同時実行性に関して、次の2つの基本的なオプションから選択できます。

- 自動シリアライズ。OTISの透過的メカニズムを使用します。

- アプリケーション対応のシリアライズ。複数スレッドのメンテナンスに付随して発生する問題をプログラマが管理します。

自動シリアライズ

複数スレッドが、OCCI環境から導出されたオブジェクト（接続および接続プール）を操作している場合は、OCCIでこれらのオブジェクトへのアクセスをシリアライズするように選択できます。最初のステップとして、createEnvironmentメソッドにTHREADED_MUTEXEDの値を渡します。この時点で、OCCIライブラリは、環境内のスレッド・セーフ・オブジェクトに関するmutexを自動的に取得します。

OCCI環境がTHREADED_MUTEXEDモードで作成されている場合は、Environment、Map、ConnectionPool、StatelessConnectionPoolおよびConnectionオブジェクトのみがスレッド・セーフになります。たとえば、2つのスレッドがこれらのオブジェクトの1つに対して同時コールを行うと、OCCIによってそれらのコールが内部的にシリアライズされます。ただし、Statement、ResultSet、SQLException、Streamなど、その他のOCCIオブジェクトはスレッド・セーフではないため、アプリケーションでこれらのオブジェクトを複数スレッドから同時に操作することはできません。

OCCIコールの処理のほとんどはサーバー上で行われます。そのため、OCCIコールを使用する2つのスレッドの接続先が同じ場合、サーバーで一方のスレッドの処理が終了するまでは、もう一方がブロックされる場合があるので注意してください。

アプリケーション対応のシリアライズ

複数スレッドが、OCCI環境から導出されたオブジェクトを操作している場合は、シリアライズを管理するように選択できます。最初のステップとして、createEnvironmentモードにTHREADED_UNMUTEXEDの値を渡します。この場合、アプリケーションでは、同一のOCCI環境から導出されたオブジェクトに対して相互排他ロックのOCCIコールを行う必要があります。この方法には、アプリケーションの設計に基づいてmutexスキームを最適化し、同時実行性を向上できるという利点があります。

OCCI環境をこのモードで作成した場合、OCCIでは、アプリケーションはマルチスレッド・アプリケーションで稼働しているが、その内部mutexの取得は不要であると認識されます。つまり、OCCIは、OCCI環境から導出されたオブジェクトのメソッドのコールはすべて、アプリケーションによってシリアライズされるとみなします。次の2つの方法を実行できます。

- 各スレッドには、それぞれ専用の環境があります。つまり、専用の環境とその環境から導出されたすべてのオブジェクト（接続、接続プール、文、結果セットなど）は、スレッド間で共有されません。この場合、アプリケーションでmutexを適用する必要はありません。

- OCCI環境またはその環境から導出されたオブジェクトをスレッド間で共有する場合は、1つのスレッドのみが任意のオブジェクトに対してOCCIメソッドをコールするように、オブジェクトへのアクセスをシリアライズする必要があります。

いずれの場合も、OCCIによってmutexは取得されません。THREADED_UNMUTEXEDを使用する場合は、OCCI環境から導出された任意のオブジェクトに対するプロセスに、1つのOCCIコールのみが存在していることを常に確認する必要があります。

OCCIは、オブジェクトを最大限に再利用できるよう最適化されています。各環境にそれぞれ専用のヒープがあるため、複数環境の場合は、メモリー使用量の増加につながります。複数環境の存在は、接続、接続プール、文および結果セット・オブジェクトに関する作業が重複していることを意味します。これにより、メモリー使用量がさらに増加します。

サーバーに対して複数の接続を行うと、サーバーとネットワーク両方のリソース使用量が増加します。複数環境の場合は、さらに多くの接続数を伴うことになります。

オペレーティング・システムの考慮事項

一部のオペレーティング・システムには、親プロセスによって作成された状態を子プロセスが再利用できるプロセス生成の機能があります。

親プロセスが子プロセスを生成した後、子プロセスは親が作成したデータベース接続を使用できません。SQL*Netでは1つのユーザー・プロセスのみがデータベースへの特定の接続を使用することが期待されるため、子プロセスが親と同じデータベース接続を使用しようとすると、意図しない接続干渉が発生し、断続的なORA-03137エラーが発生することがあります。

アプリケーションで複数の同時接続が必要な場合は、スレッドをサポートするプラットフォームでスレッドを使用することをお薦めします。Oracleでは、シングルスレッド・アプリケーションとマルチスレッド・アプリケーションの両方で同時接続をサポートします。

スレッドの詳細は、「スレッド・セーフティの概要」および「スレッド・セーフティの実装」を参照してください。

同時に開かれた多くの接続でパフォーマンスを向上させるには、「接続プーリング」を参照してください。

アプリケーションによるデータ・バッファの管理

パラメータ化された文でsetxxxメソッドを使用してバインド・パラメータにデータを提供すると、その値は内部データ・バッファにコピーされた後、データベース・サーバーに渡されて挿入されます。ユーザー・バッファ内のstring型データをコピーするオーバーヘッドを削減するには、ResultSetクラスのsetDataBuffer()およびnext()メソッド、およびStatementクラスのexecute()メソッドを使用します。

setDataBuffer()メソッド

高パフォーマンスのアプリケーションの場合は、setDataBufferメソッドによって、データ・バッファをアプリケーションで管理できます。次に、setDataBuffer()メソッドの例を示します。

void setDataBuffer(int paramIndex,
void *buffer,
Type type,
sb4 size,
ub2 *length,
sb2 *ind = NULL,
ub2 *rc = NULL);

前述のメソッド例では、次のパラメータが使用されています。

- paramIndex: パラメータ番号。

- buffer: データを格納するデータ・バッファ。

- type: データ・バッファ内のデータの型。

- size: データ・バッファのサイズ。

- length: データ・バッファ内のデータの現在の長さ。

- ind: インジケータ情報。この情報は、データがNULLかどうかを示します。パラメータ化された文の場合、値-1はNULL値が挿入されることを意味します。コール可能文から戻されたデータの場合、値-1はNULLデータが取り出されたことを意味します。

- rc: リターン・コード。この変数は、Statementメソッドに提供されたデータには適用できません。ただし、コール可能文から戻されたデータの場合、このリターン・コードにパラメータ固有のエラー番号が指定されます。

setDataBuffer()メソッドによって、すべてのデータ型を提供したり取得できるわけではありません。たとえば、C++標準ライブラリの文字列はsetDataBuffer()インタフェースでは提供されません。

関連項目
具体的な内容は、第5章「データ型」、表5-2「外部データ型と対応するC++型およびOCCI型」を参照してください。

setxxx()メソッドで提供されたデータとsetDataBuffer()メソッドで提供されたデータには、重要な違いがあります。setxxx()メソッドでデータをコピーした場合は、データのコピー後に元のデータを変更できます。たとえば、setString(str1)メソッドを使用すると、実行前に値str1を変更できます。使用される値str1は、setString(str1)のコール時の値です。これに対し、setDataBuffer()メソッドで提供されたデータの場合は、実行が完了するまで、バッファは有効のままです。

反復実行またはexecuteArrayUpdate()メソッドを使用する場合、複数行のデータおよび反復のデータは単一のバッファに格納できます。この場合、i番目の反復に対するデータはbuffer + (i-1) * sizeのアドレスにあり、長さ、インジケータおよびリターン・コードはそれぞれ、*(length + i)、*(ind + i)、*(rc + i)にあります。

またこのインタフェースは、配列実行や配列、またはOUTバインド・パラメータを持つコール可能文にも使用できます。

このメソッドをResultSetクラスで使用すると、各フェッチに対してバッファを再割当てせずにデータを取り出すことができます。

executeArrayUpdate()メソッド

すべてのデータをsetDataBuffer()メソッドまたは出力ストリームで提供する場合（つまり、setDataBuffer()またはgetStream()以外のsetxxx()をコールしない場合）、反復実行を行う簡潔な方法があります。

この場合、setMaxIterations()およびsetMaxParamSize()はコールしないでください。かわりに、setDataBuffer()またはgetStream()メソッドを、各反復にデータを提供する適切なサイズの配列をそれぞれのパラメータに指定してコールし、続いてexecuteArrayUpdate(int arrayLength)メソッドをコールします。arrayLengthパラメータには、各バッファに格納する要素数を指定します。これは、実質的にarrayLengthに反復回数を設定して文を実行するのと同じです。

ストリーム・パラメータは1度のみ指定されるため、配列実行でも使用できます。ただし、setxxx()メソッドを使用する場合は、addIteration()メソッドをコールして複数行にデータを提供します。この2つの方法を比較するために、例12-2で、2人の従業員をemployees表に挿入する例を示しています。

例12-2 addIteration()メソッドを使用したレコードの挿入方法

Statement *stmt = conn->createStatement(
"insert into departments (department_id, department_name) values(:1, :2)");
char dnames[][100] = {"Community Outreach", "University Recruiting"};
ub2 dnameLen[2];

for (int i = 0; i < 2; i++)
dnameLen[i] = strlen(dnames[i] + 1);

stmt->setMaxIterations(2);    // set maximum number of iterations

stmt->setInt(1, 7369);        // specify data for the first row
stmt->setDataBuffer(2, dnames, OCCI_SQLT_STR, sizeof(dnames[0]), dnameLen);
stmt->addIteration();

stmt->setInt(1, 7654);        // specify data for the second row
// a setDatBuffer is unnecessary for the second
// bind parameter as data provided through
// setDataBuffer is specified only once.
stmt->executeUpdate();

ただし、setDataBuffer()インタフェースを使用して最初のパラメータも指定できる場合は、例12-3で示すように、addIteration()メソッドのかわりにexecuteArrayUpdate()メソッドを使用できます。

例12-3 executeArrayUpdate()メソッドを使用したレコードの挿入方法

Statement *stmt = conn->createStatement(
"insert into departments (department_id, department_name) values(:1, :2)");
char dnames[][100] = {"Community Outreach", "University Recruiting"};
ub2 dnameLen[2];

for (int i = 0; i < 2; i++)
dnameLen[i] = strlen(dnames[i] + 1);

int ids[2] = {7369, 7654};
ub2 idLen[2] = {sizeof(ids[0]), sizeof(ids[1])};
stmt->setDataBuffer(1, ids, OCCIINT, sizeof(ids[0]), idLen);
stmt->setDataBuffer(2, dnames, OCCI_SQLT_STR, sizeof(dnames[0]), dnameLen);

stmt->executeArrayUpdate(2);      // data for two rows is inserted.

next()メソッドを使用した配列フェッチ

アプリケーションでsetDataBuffer()インタフェースまたはストリーム・インタフェースのみを使用してデータをフェッチする場合は、配列フェッチを実行できます。配列フェッチは、ResultSetクラスのnext()メソッドを通して実装します。再度コールする場合は、その前にnext()で取得した結果を処理する必要があります。

例12-4 ResultSetによる配列フェッチの使用方法

ResultSet *resultSet = stmt->executeQuery(...);
resultSet->setDataBuffer(...);
while (resultSet->next(numRows) == DATA_AVAILABLE)
process(resultSet->getNumArrayRows() );

これにより、各列についてnumRowsの数のデータがフェッチされます。setDataBuffer()インタフェースで指定するバッファ・サイズは、少なくともデータのnumRowsを保持するのに十分なサイズである必要があります。

行変更の反復

バッチ・エラーを処理するには、setBatchErrorMode()メソッドを使用して、StatementオブジェクトをbatchModeで実行することを指定する必要があります。batchModeを設定し、バッチ更新が実行されると、発生するすべてのエラーがBatchSQLExceptionクラスによりレポートされます。

BatchSQLExceptionクラスにより、バッチ・エラーを処理するメソッドが提供されます。例12-5は、OCCIアプリケーションでバッチ処理を実装する方法を示しています。

例12-5 行変更の反復とエラー処理の方法

1. Statementオブジェクトを作成し、バッチ・エラー・モードをTRUEに設定します。

Statement *stmt = conn->createStatement ("...");
stmt->setBatchErrorMode (true);

2. アプリケーションに必要なプログラム上の変更を行います。

3. 文を更新します。

try {
updateCount = stmt->executeUpdate ();
}

4. バッチ挿入または更新で生成されたエラーを捕捉し、処理します。

catch (BatchSQLException &batchEx)
{
cout<<"Batch Exception: "<<batchEx.what()<<endl;
int errCount = batchEx.getFailedRowCount();
cout << "Number of rows failed " << errCount <endl;
for (int i = 0; i < errCount; i++ )
{
SQLException err = batchEx.getException(i);
unsigned int rowIndex = batchEx.getRowNum(i);
cout<<"Row " << rowIndex << " failed because of "
<< err.getErrorCode() << endl;
}
// take recovery action on the failed rows
}

5. 文の更新で生成されたその他のエラーを捕捉し、処理します。文レベルのエラーは、引き続きSQLExceptionのインスタンスとして発生します。

catch( SQLException &ex) // to catch other SQLExceptions.
{
cout << "SQLException: " << e.what() << endl;
}

ステートレスな接続プールのランタイム・ロード・バランシング

ステートレスな接続プールのランタイム・ロード・バランシングでは、データベースの負荷が最も少ないインスタンスへ接続要求が動的にルーティングされます。これには、Oracle RACロード・バランシング・アドバイザによって配布されるサービス・メトリックが使用されます。

この機能では、ステートレスな接続プールが次の方法で変更されます。

- プールは、インスタンスのロードに関して定期的な通知を受け取ります。

- 接続要求を受け取ると、プールはインスタンスのロードに基づいて要求の型に最適な接続を選択します。

- ステートレスな接続プールは、インスタンスのロードに対応する接続トポロジを保持しながら、オーバーロードされたインスタンスの接続を定期的に終了します。

- オーバーロードされたインスタンスへの接続は終了となる場合があるため、プールは同時実行性の要件を保持するため新規接続を作成します。これらの新規接続は、Oracle RACリスナーの接続時ロード・バランシングを使用して作成されます。

OCCI環境がTHREADED_MUTEXEDモードおよびEVENTSモードで作成され、サーバーがイベント通知を発行するよう構成されている場合、ランタイム・ロード・バランシングはデフォルトでオンになります。

関連項目
『Oracle Call Interfaceプログラマーズ・ガイド』

APIのサポート

StatelessConnectionPoolクラスのPoolType属性の新規オプションNO_RLBでは、ランタイム・ロード・バランシングが無効化されます。

障害診断

障害診断では、問題インシデントが発生した場合、OCCIクライアントでダンプ・ファイルまたはコア・ダンプ・ファイルなどの診断データが取得されます。障害診断機能により、各インシデントについて、この診断データを格納するための自動診断リポジトリ(ADR)サブディレクトリが作成されます。たとえば、LinuxまたはUNIXアプリケーションのいずれかでNULLのポインタ参照により障害が発生した場合、コア・ファイルが、オペレーティング・システム・ディレクトリではなくADRホーム・ディレクトリ（存在する場合）に格納されます。この項では、ADRサブディレクトリ構造とその出力を管理するユーティリティ、ADRコマンド・インタプリタ(ADRCI)について説明します。

ADRホームは、OCCIなどの製品のインスタンスに対するすべての診断データ、および特定のオペレーティング・システム・ユーザーのルート・ディレクトリです。ADRホームはすべて、同じルート・ディレクトリ、ADRベースの下に表示されます。

関連項目
『Oracle Database管理者ガイド』

ADRベースの位置

ADRベースの位置は、次の順序で決定されます。

1. sqlnet.oraファイル(Windowsでは%TNS_ADMIN%ディレクトリ内、LinuxまたはUNIXでは$TNS_ADMINディレクトリ内)。
TNS_ADMINディレクトリがない場合、sqlnet.oraは現行ディレクトリに格納されています。

ADRベースがsqlnet.oraファイルにリストされている場合、次の型の文となります。

ADR_BASE=/directory/adr

意味は次のとおりです。

- adr引数は存在している必要があるディレクトリであり、OCCIアプリケーションを実行し、同じADRベースを共有する必要があるすべてのオペレーティング・システム・ユーザーが書込み可能である必要があります。

- directory引数はパス名です。

ADR_BASEが設定されており、すべてのユーザーが1つのsqlnet.oraファイルを共有する場合、adrディレクトリが存在しない、または書込みができないと、OCCIは検索を停止します。ADR_BASEが設定されていない場合、OCCIは検索を続行し、他の特定のディレクトリの有無をテストします。

たとえば、sqlnet.oraにエントリADR_BASE=/home/chuck/testが含まれる場合、次のようになります。

- ADRベース:

/home/chuck/test/oradiag_chuck

- ADRホーム:

/home/chuck/test/oradiag_chuck/diag/clients/user_chuck/host_4144260688_11

2. Oracleベースが存在する場合(Windows: %ORACLE_BASE%、LinuxおよびUNIX: $ORACLE_BASE)、クライアント・サブディレクトリがデータベースのインストール時にOracle Universal Installerによって作成されるため、クライアント・サブディレクトリも存在します。
たとえば、$ORACLE_BASEが/home/chuck/obaseである場合、次のようになります。

- ADRベース:

/home/chuck/obase

- ADRホーム:

/home/chuck/obase/diag/clients/user_chuck/host_4144260688_11

3. Oracleホームが存在する場合(Windows: %ORACLE_HOME%、LinuxおよびUNIX: $ORACLE_HOME)、クライアント・サブディレクトリがデータベースのインストール時にOracle Universal Installerによって作成されるため、クライアント・サブディレクトリも存在します。
たとえば、$ORACLE_HOMEが/ade/chuck_l1/oracleである場合、次のようになります。

- ADRベース:

/ade/chuck_l1/oracle/log

- ADRホーム:

/ade/chuck_l1/oracle/log/diag/clients/user_chuck/host_4144260688_11

4. オペレーティング・システムのホーム・ディレクトリ上。

- Windowsでは、オペレーティング・システムのホーム・ディレクトリは%USERPROFILE%です。
Oracleフォルダの位置は次のとおりです。

C:\Documents and Settings\chuck

アプリケーションがサービスとして実行される場合、ホーム・ディレクトリ・オプションはスキップされます。

- LinuxおよびUNIXでは、オペレーティング・システムのホーム・ディレクトリは$HOMEです。
位置は次のとおりです。

/home/chuck/oradiag_chuck

たとえば、Instant Clientでは、$HOMEが/home/chuckである場合、次のようになります。

- ADRベース:

/home/chuck/oradiag_chuck

- ADRホーム:

/home/chuck/oradiag_chuck/diag/clients/user_chuck/host_4144260688_11

関連項目
「Instant Client」

5. 一時ディレクトリ内。

- Windowsでは、一時ディレクトリは次の順序で検索されます。

- %TMP%

- %TEMP%

- %USERPROFILE%

- Windowsシステム・ディレクトリ

- LinuxおよびUNIXでは、一時ディレクトリは/var/tmpにあります。

たとえば、Instant Clientでは、$HOMEが書込み不可である場合、次のようになります。

- ADRベース:

/var/tmp/oradiag_chuck

- ADRホーム:

/var/tmp/oradiag_chuck/diag/clients/user_chuck/host_4144260688_11

これらのディレクトリ選択肢のどれも使用不可で書込み不可の場合、ADRは作成されず、診断は格納されません。

関連項目
『Oracle Database Net Servicesリファレンス』

ADRCIの使用

ADRCIは、ADR内の診断データを表示し、インシデントおよび問題の情報をOracleサポートと共有できるZIPファイルにパッケージングできるコマンドライン・ツールです。ADRCIは、対話式にもスクリプトによっても使用できます。

問題とは、OCIまたはクライアント内のクリティカル・エラーです。各問題に問題キーが割り当てられます。インシデントとは、問題の1回の発生を指し、数値を使用した一意のインシデントIDで識別されます。各インシデントには、属性セット（ORAエラー番号、エラー・パラメータ値および類似情報）を含む問題キーが割り当てられます。2つのインシデントの問題キーが一致する場合、これらのインシデントの根本的原因は同じです。

次の各例では、Linuxオペレーティング・システムでのADRCIの使用方法を示しています。ARDCIコマンドでは大/小文字が区別されない点に注意してください。ユーザー入力はすべて太字体です。

例12-6 OCCIアプリケーション・インシデントに関するADRCIの使用方法

LinuxシステムでADRCIを起動するには、adrciコマンドを使用します。ADRCIの起動後、helpでshow baseコマンドの詳細を確認してから、-product clientオプションを使用して特定のクライアントのベースを決定します（OCCIアプリケーションに必要）。ADRCIベースを設定するには、set baseコマンドを使用します。ADRCIの起動後、デフォルトのADRベースはrdbmsサーバー用です。$ORACLE_HOMEは/ade/chuck_l3/oracleに設定されます。インシデントを表示するには、show incidentsコマンドを使用します。ADRCIを終了するには、quitコマンドを使用します。

% adrci

ADRCI: Release 11.2. - on Wed November 25 16:16:55 2008

Copyright (c) 1982, 2008, Oracle.  All rights reserved.

adrci> help show base

Usage: SHOW BASE [-product <product_name>]

Purpose: Show the current ADR base setting.

Options:
[-product <product_name>]: This option allows users to show the
given product's ADR Base location. The current registered products are
"CLIENT" and "ADRCI".

Examples:
show base -product client
show base

adrci> show base -product client
ADR base is "/ade/chuck_l3/oracle/log"

adrci> help set base

Usage:  SET BASE <base_str>

Purpose: Set the ADR base to use in the current ADRCI session.
If there are valid ADR homes under the base, all homes
are added to the current ADRCI session.

Arguments:
<base_str>: It is the ADR base directory, which is a system-dependent
directory path string.

Notes:
On platforms that use "." to signify current working directory,
it can be used as base_str.

Example:
set base /net/sttttd1/scratch/someone/view_storage/someone_v1/log
set base .

adrci> set base /ade/chuck_l3/oracle/log

adrci> show incidents
...
adrci> quit

例12-7 Instant ClientにおけるADRCIの使用方法

Instant Clientでは$ORACLE_HOMEを使用しないため、デフォルトのADRベースはユーザーのホーム・ディレクトリとなります。

adrci> show base -product client
ADR base is "/home/chuck/oradiag_chuck"
adrci> set base /home/chuck/oradiag_chuck
adrci> show incidents

ADR Home = /home/chuck/oradiag_chuck/diag/clients/user_chuck/host_4144260688_11:
*************************************************************************
INCIDENT_ID    PROBLEM_KEY           CREATE_TIME
-------------------------------------------------------------------------
1                     oci 24550 [6]              2007-05-01 17:20:02.803697 -07:00
1 rows fetched

adrci> quit

関連項目

- ADRCIの概要については、『Oracle Databaseユーティリティ』を参照してください。

- 「Instant Client」

ADR作成の制御および障害診断の無効化

障害診断機能を無効化するには、診断の取得をオフにする必要があります。sqlnet.oraファイルの編集により、DIAG_ADR_ENABLEDパラメータおよびDIAG_DDE_ENABLEDパラメータの値をFALSEまたはOFFに変更します。デフォルト値はTRUEまたはONです。

OCCIシグナル・ハンドラをオフにし、標準オペレーティング・システム障害処理を再度有効化するには、sqlnet.oraファイルの編集により、対応するパラメータDIAG_SIGHANDLER_ENABLED=FALSEを追加します。

関連項目
『Oracle Database Net Servicesリファレンス』

クライアントの結果キャッシュ

クライアントの結果キャッシュは、繰り返し実行される問合せのレスポンス時間を向上させます。この機能では、クライアント・メモリーを使用して、データベースから実行およびフェッチされるSQL問合せの結果をキャッシュします。同じ問合せの後続の実行で、クライアント・キャッシュから結果をフェッチし、サーバーCPUの使用量を削減します。データベースのラウンドトリップが排除されるため、アプリケーションのレスポンス時間が向上します。

OCCIアプリケーションは、OCCI文キャッシュを有効にすることでクライアントの結果キャッシュ機能を透過的に使用します。キャッシュする必要のあるSELECT問合せは、/*+ result_cache */ヒントで注釈が付けられます。例12-8に、このようなSELECT問合せを使用するOCCI文オブジェクトの作成方法を示します。

例12-8 クライアントの結果キャッシュの有効化および使用の方法

Connection *conn;
Statement *stmt;
ResultSet *rs;

...
//enable OCCI Statement Caching
conn->setStmtCacheSize(20);

//Specify the hint in the SELECT query
stmt = conn->createStatement("select /*+ result_cache */ * from products \
where product_id = :1");

//the following execute fetches rows from the client cache if
//the query results are cached. If this is the first execute
//of the query, the results fetched from the server are
//cached on the client side.
rs = stmt->executeQuery();

使用方法のガイドライン、キャッシュの一貫性および制限は、『Oracle Call Interfaceプログラマーズ・ガイド』を参照してください。

13 OCCI Application Program Interface (API)

この章では、C++用のOCCIのクラスとメソッドについて説明します。

関連項目

- 『Oracle Database SQL言語リファレンス』に記載された書式モデル

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

OCCIのクラスとメソッド

表13-1は、すべてのOCCIクラスに関する簡単な説明です。この項の後で、各クラスとそのメソッドの詳細を説明します。

表13-1 OCCIクラスの概要

クラス

説明

Agentクラス

アドバンスト・キューイングのコンテキストでエージェントを表します。

AnyDataクラス

オブジェクト型トランスレータ(OTT)ユーティリティ用のメソッド、オブジェクトのシリアライズ用のSQL読込みおよび書込みメソッド、および他のデータ型間での変換を提供します。

BatchSQLExceptionクラス

バッチ処理エラーを処理するメソッドを提供します。SQLExceptionクラスの機能拡張版です。

Bfileクラス

SQL BFILE値にアクセスできます。

Blobクラス

SQL BLOB値にアクセスできます。

Bytesクラス

バイトの比較、バイトの検索およびバイトの抽出について、一連のバイトを個別に検査します。

Clobクラス

SQL CLOB値にアクセスできます。

Connectionクラス

特定のデータベースへの接続を示します。

ConnectionPoolクラス

特定のデータベースへの接続プールを示します。

Consumerクラス

Messageのデキューをサポートし、デキュー・オプションを制御します。

Dateクラス

SQL DATEデータ項目の抽象化を指定します。また、日付値のOCCIエスケープ構文をサポートするための書式操作と解析操作も提供します。

Environmentクラス

OCCIオブジェクトのメモリーや他のリソースを管理するためのOCCI環境を提供します。OCCIドライバ・マネージャはOCCI環境ハンドルにマップされます。

IntervalDSクラス

期間を日、時、分および秒で示します。

IntervalYMクラス

期間を年と月で示します。

Listenerクラス

1つ以上のキューで1つ以上のエージェントとしてリスニングします。

Mapクラス

SQL構造型のマッピングをC++クラスに格納するために使用します。

Messageクラス

エンキューまたはデキューの単位です。

MetaDataクラス

データベースの既存のスキーマ・オブジェクトまたはデータベース全体で、ResultSetの列の型とプロパティを決定するために使用します。

NotifyResultクラス

StreamsのAQコールバック機能からの通知情報を保持するために使用します。

Numberクラス

数値型をモデル化します。

PObjectクラス

型を定義するときに、永続インスタンスまたは一時インスタンスを指定できます。PObjectから導出されたクラス・インスタンスは、永続または一時のいずれかにできます。永続の場合、PObjectから導出したクラス・インスタンスは、PObjectクラスを継承します。一時の場合、継承はありません。

Producerクラス

エンキュー・オプションをサポートし、Messageをエンキューします。

Refクラス

SQL REF値のC++でのマッピング。このマッピングは、データベースにあるSQL構造型の値への参照です。

RefAnyクラス

SQL REF値のC++でのマッピング。このマッピングは、データベースにあるSQL構造型の値への参照です。

ResultSetクラス

OCCI のStatementの実行で生成されたデータの表にアクセスできます。

SQLExceptionクラス

データベース・アクセス・エラーの情報を提供します。

StatelessConnectionPoolクラス

データベースに対して、認証済でステートレスな接続プールを表します。

Statementクラス

SQL文を実行するために使用します。SQL文には、問合せ文およびINSERT/UPDATE/DELETE文が含まれます。

Streamクラス

プリコンパイルされたDML文またはストアド・プロシージャ・コールにストリーム・データ(通常は、LONGデータ型)を渡すために使用します。

Subscriptionクラス

通知に対するサブスクライバの登録に必要な情報と操作をカプセル化します。

Timestampクラス

SQL TIMESTAMPデータ項目の抽象化を指定します。また、タイム・スタンプ値のOCCIエスケープ構文をサポートするための書式操作と解析操作も提供します。

OCCIクラスの使用

OCCIクラスは、oracle::occiネームスペースに定義されています。oracle::occiネームスペース内のOCCIクラス名は、次の3つの方法のいずれかを使用して参照できます。

- 各OCCIクラス名に対してスコープ解決演算子（::）を使用します。

- 各OCCIクラス名に対してusing宣言を使用します。

- すべてのOCCIクラス名に対してusingディレクティブを使用します。

OCCIでのスコープ解決演算子の使用

スコープ解決演算子（::）は、oracle::occiネームスペースとOCCIクラス名を明示的に指定するために使用されます。ConnectionオブジェクトであるmyConnectionを宣言するには、スコープ解決演算子を使用して、次の構文で宣言します。

oracle::occi::Connection myConnection;

OCCIでの宣言の使用

using宣言は、OCCIクラス名をコンパイル・ユニットで競合せずに使用できる場合に使用されます。oracle::occiネームスペースでOCCIクラス名を宣言するには、次の構文を使用します。

using oracle::occi::Connection;

この宣言により、Connectionはoracle::occi::Connectionを参照し、myConnectionをConnection myConnection;として宣言できます。

OCCIでのディレクティブの使用

usingディレクティブは、すべてのOCCIクラス名をコンパイル・ユニットで競合せずに使用できる場合に使用されます。oracle::occiネームスペースですべてのOCCIクラス名を宣言するには、次の構文を使用します。

using oracle::occi;

次に、using宣言と同じように、次の宣言によってOCCIクラスConnectionをConnection myConnection;として参照できます。

OCCIでのアドバンスト・キューイングの使用

アドバンスト・キューイングのクラスであるProducer、Consumer、Message、Agent、Listener、SubscriptionおよびNotifyResultは、oracle::occi::aqネームスペースに定義されています。

OCCIでのWindows NTおよびz/OSのサポート

WindowsでOCCIアプリケーションを構築する際に、WIN32COMMONのプリプロセッサ定義を追加する必要があります。

次のグローバル・メソッドは、Windows NTおよびz/OSでResultSetクラスおよびStatementクラスのRefのコレクションにアクセスできるように設計されています。メソッド名は変更されていますが、パラメータの数と値は同じままです。

- Windows NTおよびz/OSでは、getVector()のかわりにgetVectorOfRefs()を使用します。

- Windows NTおよびz/OSでは、setVector()のかわりにsetVectorOfRefs()を使用します。

Windows NTおよびz/OS上のアプリケーションでは、参照のコレクションの取得および挿入時にのみ、これらの新規メソッドをコールする必要があります。Windows NTおよびz/OS上で動作しないアプリケーションでは、どちらのアクセッサを使用してもかまいません。ただし、Refでのベクター操作には新規メソッドを使用することをお薦めします。

Refのコレクションの操作

Refのコレクションは、次のクラスのメソッドを使用してフェッチおよび挿入できます。

ResultSetクラス

Refのコレクションのフェッチ 次のバージョンのgetVectorOfRefs()を使用し、参照の列を戻します。

void getVectorOfRefs(
ResultSet  *rs,
unsigned int index,
vector<Ref<T> > &vect);

Statementクラス

Refのコレクションのフェッチ getVectorOfRefs()を使用し、列からの参照のコレクションを戻します。

void getVectorOfRefs(
Statement  *stmt,
unsigned int index,
vector<Ref<T> > &vect);

Refのコレクションの挿入 setVectorOfRefs()を使用し、参照のコレクションを列に挿入します。

template  <class T>
void setVectorOfRefs(
Statement *stmt,
unsigned int paramIndex,
const vector<Ref<T> > &vect,
const string &sqltype);

Refのコレクションの挿入: マルチバイトのサポート マルチバイトをサポートするには、次のメソッドが必要です。

void setVectorOfRefs(
Statement *stmt,
unsigned int paramIndex,
const vector<Ref<T> > &vect,
const string &schemaName,
const string &typeName);

Refのコレクションの挿入: UString (UTF16)のサポート UStringをサポートするには、次のソッドが必要です。

template <class T>
void setVectorOfRefs(
Statement *stmt,
unsigned int paramIndex,
const vector<Ref<T> > &vect,
const UString &schemaName,
const UString &typeName);

OCCIの共通定数

表13-2は、すべてのOCCIクラスで使用される共通の定数の定義です。特定のクラス内で使用するように定義された定数を、クラス固有のセクションの始めに示します。

表13-2 すべてのOCCIクラスで使用される列挙値

属性

オプション

LockOptions

- OCCI_LOCK_NONEは、Refオブジェクトに対するロック設定を消去します。

- OCCI_LOCK_Xは、オブジェクトがロックされていて、オブジェクトが別のセッションによってロックされる場合はロックが利用できるようになるまで待機する必要があることを示します。

- OCCI_LOCK_X_NOWAITは、オブジェクトがロックされていて、オブジェクトが別のセッションによってロックされる場合にはエラーが戻されることを示します。

CharSetForm

- OCCI_SQLCS_IMPLICITは、ローカル・データベースのキャラクタ・セットを使用する必要があることを示します。

- OCCI_SQLCS_NCHARは、ローカル・データベースのNCHARセットを使用する必要があることを示します。

- OCCI_SQLCS_EXPLICITは、キャラクタ・セットを明示的に指定する必要があることを示します。

- OCCI_SQLCS_FLEXIBLEは、キャラクタ・セットがPL/SQLのフレキシブル・パラメータであることを示します。

ReturnStatus

- OCCI_SUCCESSは、正常にコールが行われたことを示します（トランザクション・フェイルオーバー・モード）。

- FO_RETRYは、コールを再試行する必要があることを示します（トランザクション・フェイルオーバー・モード）。

Agentクラス

Agentクラスは、アドバンスト・キューイングのコンテキストでエージェントを表します。

表13-3 Agentメソッドの概要

メソッド

概要

Agent()

Agentクラスのコンストラクタです。

getAddress()

Agentのアドレスを戻します。

getName()

Agentの名前を戻します。

getProtocol()

Agentのプロトコルを戻します。

isNull()

AgentオブジェクトがNULLかどうかをテストします。

operator=()

Agentの代入演算子です。

setAddress()

Agentオブジェクトのアドレスを設定します。

setName()

Agentオブジェクトの名前を設定します。

setNull()

AgentオブジェクトをNULLに設定します。

setProtocol()

Agentオブジェクトのプロトコルを設定します。

Agent()

Agentクラスのコンストラクタです。

構文

説明

Agent(
const Environment *env);

デフォルト値に初期化されるAgentオブジェクトを作成します。

Agent(
const Agent& agent);

コピー・コンストラクタです。

Agent(
const Environment *env,
const string& name,
const string& address,
unsigned int protocol = 0);

指定したAgentの名前、アドレスおよびプロトコルを使用してAgentオブジェクトを作成します。

パラメータ

説明

env

環境を指定します。

name

名前を指定します。

agent

オリジナルのAgentを指定します。

address

アドレスを指定します。

protocol

プロトコルを指定します。

getAddress()

Agentのアドレスを含む文字列を戻します。

構文

string getAddress() const;

getName()

Agentの名前を含む文字列を戻します。

構文

string getName() const;

getProtocol()

Agentのプロトコルを表す数値コードを戻します。

構文

unsigned int getProtocol() const;

isNull()

AgentオブジェクトがNULLかどうかをテストします。AgentオブジェクトがNULLの場合はTRUEを、それ以外の場合はFALSEを戻します。

構文

bool isNull() const;

operator=()

Agentクラスの代入演算子です。

構文

void operator=(
const Agent& agent);

パラメータ

説明

agent

オリジナルのAgentオブジェクトを指定します。

setAddress()

Agentオブジェクトのアドレスを設定します。

構文

void setAddress(
const string& addr);

パラメータ

説明

addr

Agentオブジェクトのアドレスを指定します。

setName()

Agentオブジェクトの名前を設定します。

構文

void setName(
const string& name);

パラメータ

説明

name

Agentオブジェクトの名前を指定します。

setNull()

AgentオブジェクトをNULLに設定します。インナー・スコープで操作しない場合は、このAgentの作成に使用したConnectionが終了する前に、このメソッドをコールする必要があります。

構文

void setNull();

setProtocol()

Agentオブジェクトのプロトコルを設定します。

構文

void setProtocol(
unsigned int protocol = 0);

パラメータ

説明

protocol

Agentオブジェクトのプロトコルを指定します。

AnyDataクラス

AnyDataクラスは、型情報と実際のデータをカプセル化して自己記述データをモデル化します。AnyDataは、主にOCCIアドバンスト・キューイング機能とともに使用されデータを表示およびエンキューして、キューからのメッセージをAnyDataインスタンスとして受け取ります。

ほとんどのSQL型とユーザー定義型は、setFromxxx()メソッドを使用してAnyData型に変換できます。AnyDataオブジェクトは、getAsxxx()メソッドを使用してほとんどのSQL型およびユーザー定義型に変換できます。SYS.ANYDATA型により、AnyDataはSQLとPL/SQLの両方でモデル化されます。サポートされているデータ型については、表13-4「AnyDataクラスでサポートされているOCCIデータ型」を参照してください。

getType()のコールではAnyDataオブジェクトが表すTypeCodeが戻されますが、isNull()のコールではAnyDataにNULL値が含まれているかどうかが判別されます。setNull()メソッドは、AnyDataの値をNULLに設定します。

OCCI AnyData型を使用するには、環境をOBJECTモードで開始する必要があります。

例13-1 事前定義済のSQL型からAnyData型への変換

この例は、string型からAnyData型に変換する方法を示しています。

Connection *conn;
...
AnyData any(conn);
string str("Hello World");
any.setFromString(str);
...

例13-2 AnyData型からの事前定義済のSQL型の作成

この例は、AnyDataオブジェクトをstringオブジェクトに変換する方法を示しています。変換前にAnyData型を検証するために、getType()およびisNull()メソッドが使用されていることに注意してください。

Connection *conn;
string str;
...
if(!any.isNULL())
{   if(any.getType()==OCCI_TYPECODE_VARCHAR2)
{
str = any.getAsString();
cout<<str;
}
}
...

例13-3 ユーザー定義型からAnyData型への変換

この例は、ユーザー定義型からAnyData型に変換する方法を示しています。

Connection *conn;
...
// Assume an OBJECT of type Person with the following defined fields
// CREATE TYPE person as OBJECT (
//    FRIST_NAME VARCHAR2(20),
//    LAST_NAME VARCHAR2(25),
//    EMAIL VARCHAR2(25),
//    SALARY NUMBER(8,2)
//   );
// Assume relevant classes have been generated by OTT.
...
Person *pers new Person( "Steve", "Addams",
"steve.addams@anycompany.com", 50000.00);
AnyData anyObj(conn);
anyObj.setFromObject(pers);
...

例13-4 ユーザー定義型からAnyData型への変換

この例は、AnyDataオブジェクトをユーザー定義型に変換する方法を示しています。変換前にAnyData型を検証するために、getType()およびisNull()メソッドが使用されていることに注意してください。

Connection *conn;
// Assume an OBJECT of type Person with the following defined fields
// CREATE TYPE person as OBJECT (
//    FRIST_NAME VARCHAR2(20),
//    LAST_NAME VARCHAR2(25),
//    EMAIL VARCHAR2(25),
//    SALARY NUMBER(8,2)
//   );
// Assume relevant classes have been generated by OTT.
Person *pers = new Person();
...
If(!anyObj.isNull())
{   if(anyObj.getType()==OCCI_TYPECODE_OBJECT)
pers = anyObj.getAsObject();
}
...

表13-4 AnyDataクラスでサポートされているOCCIデータ型

データ型

TypeCode

BDouble

OCCI_TYPECODE_BDOUBLE

BFile

OCCI_TYPECODE_BFILE

BFloat

OCCI_TYPECODE_BFLOAT

Bytes

OCCI_TYPECODE_RAW

Date

OCCI_TYPECODE_DATE

IntervalDS

OCCI_TYPECODE_INTERVAL_DS

IntervalYM

OCCI_TYPECODE_INTERVAL_YM

Number

OCCI_TYPECODE_NUMBERB

PObject

OCCI_TYPECODE_OBJECT

Ref

OCCI_TYPECODE_REF

string

OCCI_TYPECODE_VARCHAR2

TimeStamp

OCCI_TYPECODE_TIMESTAMP

表13-5 AnyDataメソッドの概要

メソッド

概要

AnyData()

AnyDataクラスのコンストラクタです。

getAsBDouble()

AnyDataオブジェクトをBDoubleに変換します。

getAsBfile()

AnyDataオブジェクトをBfileに変換します。

getAsBFloat()

AnyDataオブジェクトをBFloatに変換します。

getAsBytes()

AnyDataオブジェクトをBytesに変換します。

getAsDate()

AnyDataオブジェクトをDateに変換します。

getAsIntervalDS()

AnyDataオブジェクトをIntervalDSに変換します。

getAsIntervalYM()

AnyDataオブジェクトをIntervalYMに変換します。

getAsNumber()

AnyDataオブジェクトをNumberに変換します。

getAsObject()

AnyDataオブジェクトをPObjectに変換します。

getAsRef()

AnyDataオブジェクトをRefAnyに変換します。

getAsString()

AnyDataオブジェクトをネームスペースstringに変換します。

getAsTimestamp()

AnyDataオブジェクトをTimestampに変換します。

getType()

AnyDataオブジェクトに保持されているDataTypeを取得します。表13-4を参照してください。

isNull()

AnyDataオブジェクトがNULLかどうかをテストします。

setFromBDouble()

BDoubleをAnyDataに変換します。

setFromBfile()

BfileをAnyDataに変換します。

setFromBFloat()

BFloatをAnyDataに変換します。

setFromBytes()

BytesをAnyDataに変換します。

setFromDate()

DateをAnyDataに変換します。

setFromIntervalDS()

IntervalDSをAnyDataに変換します。

setFromIntervalYM()

IntervalYMをAnyDataに変換します。

setFromNumber()

NumberをAnyDataに変換します。

setFromObject()

PObjectをAnyDataに変換します。

setFromRef()

RefAnyをAnyDataに変換します。

setFromString()

ネームスペースstringをAnyDataに変換します。

setFromTimestamp()

TimestampをAnyDataに変換します。

setNull()

AnyDataオブジェクトをNULLに設定します。

AnyData()

AnyDataのコンストラクタです。

構文

AnyData(
const Connection *conn);

パラメータ

説明

conn

接続を指定します。

getAsBDouble()

AnyDataオブジェクトをBDoubleに変換します。

構文

BDouble getAsBDouble() const;

getAsBfile()

AnyDataオブジェクトをBfileに変換します。

構文

Bfile getAsBfile() const;

getAsBFloat()

AnyDataオブジェクトをBFloatに変換します。

構文

BFloat getAsBFloat() const;

getAsBytes()

AnyDataオブジェクトをBytesに変換します。

構文

Bytes getAsBytes() const;

getAsDate()

AnyDataオブジェクトをDateに変換します。

構文

Date getAsDate() const;

getAsIntervalDS()

AnyDataオブジェクトをIntervalDSに変換します。

構文

IntervalDS getAsIntervalDS() const;

getAsIntervalYM()

AnyDataオブジェクトをIntervalYMに変換します。

構文

IntervalYS getAsIntervalYM() const;

getAsNumber()

AnyDataオブジェクトをNumberに変換します。

構文

Number getAsNumber() const;

getAsObject()

AnyDataオブジェクトをPObjectに変換します。

構文

PObject* getAsObject() const;

getAsRef()

AnyDataオブジェクトをRefAnyに変換します。

構文

RefAny getAsRef() const;

getAsString()

AnyDataオブジェクトをネームスペースstringに変換します。

構文

string getAsString() const;

getAsTimestamp()

AnyDataオブジェクトをTimestampに変換します。

構文

Timestamp getAsTimestamp() const;

getType()

AnyDataオブジェクトに保持されているデータ型を取得します。TypeCodeの有効な値については、表13-4を参照してください。

構文

TypeCode getType();

isNull()

AnyDataオブジェクトがNULLかどうかをテストします。AnyDataオブジェクトがNULLの場合はTRUEを、それ以外の場合はFALSEを戻します。

構文

bool isNull() const;

setFromBDouble()

BDoubleをAnyDataに変換します。

構文

void setFromBDouble(
const BDouble& bdouble);

パラメータ

説明

bdouble

AnyDataに変換するBDoubleを指定します。

setFromBfile()

BfileをAnyDataに変換します。

構文

void setFromBfile(
const Bfile& bfile);

パラメータ

説明

bfile

AnyDataに変換するBfileを指定します。

setFromBFloat()

BFloatをAnyDataに変換します。

構文

void setFromBFloat(
const BFloat& bfloat);

パラメータ

説明

bfloat

AnyDataに変換するBFloatを指定します。

setFromBytes()

BytesをAnyDataに変換します。

構文

void setFromBytes(
const Bytes& bytes);

パラメータ

説明

bytes

AnyDataに変換するBytesを指定します。

setFromDate()

DateをAnyDataに変換します。

構文

void setFromDate(
const Date& date);

パラメータ

説明

date

AnyDataに変換するDateを指定します。

setFromIntervalDS()

IntervalDSをAnyDataに変換します。

構文

void setFromIntervalDS(
const IntervalDS& intervalds);

パラメータ

説明

invtervalds

AnyDataに変換するIntervalDSを指定します。

setFromIntervalYM()

IntervalYMをAnyDataに変換します。

構文

void setFromIntervalYM(
const IntervalYM& intervalym);

パラメータ

説明

invalym

AnyDataに変換するIntervalYMを指定します。

setFromNumber()

NumberをAnyDataに変換します。

構文

void setFromNumber(
const Number& num);

パラメータ

説明

num

AnyDataに変換するNumberを指定します。

setFromObject()

PObjectをAnyDataに変換します。

構文

void setFromObject(
const PObject* objptr);

パラメータ

説明

objptr

AnyDataに変換するPObjectを指定します。

setFromRef()

PObjectをAnyDataに変換します。

構文

void setFromRef(
const RefAny& ref
const string &typeName,
const string &schema);

パラメータ

説明

ref

AnyDataに変換するRefAnyを指定します。

typeName

型の名前を指定します。

schema

型が定義されているスキーマの名前を指定します。

setFromString()

ネームスペースstringをAnyDataに変換します。

構文

void setFromString(
string& str);

パラメータ

説明

str

AnyDataに変換するネームスペースstringを指定します。

setFromTimestamp()

TimestampをAnyDataに変換します。

構文

void setFromTimestamp(
const Timestamp& timestamp);

パラメータ

説明

timestamp

AnyDataに変換するTimestampを指定します。

setNull()

AnyDataオブジェクトをNULLに設定します。

構文

void setNull();

BatchSQLExceptionクラス

BatchSQLExceptionクラスは、バッチ処理エラーを処理するメソッドを提供します。BatchSQLExceptionクラスはSQLExceptionクラスから導出されるため、すべてのBatchSQLExceptionインスタンスは、表13-6に示したメソッド以外に、SQLExceptionのすべてのメソッドをサポートします。

関連項目
例12-0「OCCIアプリケーションのパフォーマンスの最適化」の「行変更の反復」の項

表13-6 BatchSQLExceptionメソッドの概要

メソッド

概要

getException()

例外を戻します。

getFailedRowCount()

挿入または更新が失敗した行数を戻します。

getRowNum()

挿入または更新エラーのある行番号を戻します。

getException()

指定されたindexに一致する例外を戻します。

構文

SQLException getSQLException (
unsigned int index) const;

パラメータ

説明

index

バッチ・プロセスによって戻されたエラー・リストに対する索引を指定します。

getFailedRowCount()

INSERT文またはUPDATE文が失敗した行の数を戻します。

構文

unsigned int getFailedRowCount( ) const;

getRowNum()

指定されたindexに一致したエラーのある行の番号を戻します。

構文

unsigned int getRowNum(
unsigned int index) const;

パラメータ

説明

index

バッチ・プロセスによって戻されたエラー・リストに対する索引を指定します。

Bfileクラス

Bfileクラスは、BFILE型オブジェクトの共通プロパティを定義します。BFILEとは、Oracleデータベースの外のオペレーティング・システム・ファイルに格納されているラージ・バイナリ・ファイルです。Bfileオブジェクトには、BFILEへの論理ポインタが含まれていますが、BFILE自体は含まれていません。

Bfileクラスのメソッドを使用すると、Bfileオブジェクトに関連する特定のタスクを実行できます。

getBfile()やsetBfile()など、ResultSetクラスとStatementクラスのメソッドによって、SQL BFILEの値にアクセスできます。

NULLのBfileオブジェクトに対する有効なメソッドは、setName()、isNull()およびoperator=()のみです。

Bfileオブジェクトは、次の方法で初期化できます。

- setName()メソッドを実行します。次に、このBFILEを表に挿入してBFILEを変更すると、SELECT...FOR UPDATEを使用してその内容を取り出すことができます。write()メソッドによってBFILEは変更されますが、変更されたデータは、トランザクションがコミットされたときにのみ表にフラッシュされます。INSERT操作は必要ありません。

- 初期化したBfileオブジェクトを割り当てます。

関連項目
LOBの詳細は、『Oracle Database SecureFilesおよびラージ・オブジェクト開発者ガイド』の該当する章を参照してください。

表13-7 Bfileメソッドの概要

メソッド

概要

Bfile()

Bfileクラスのコンストラクタです。

close()

前にオープンしたBFILEをクローズします。

closeStream()

BFILEから取得したストリームをクローズします。

fileExists()

BFILEがあるかどうかを確認します。

getDirAlias()

BFILEのディレクトリ・オブジェクトを戻します。

getFileName()

BFILEの名前を戻します。

getStream()

StreamオブジェクトとしてBFILEからデータを戻します。

getUStringDirAlias()

BFILEに関連付けられているディレクトリ・オブジェクトを含むUStringを戻します。

getUStringFileName()

BFILEに関連付けられているファイル名を含むUStringを戻します。

isInitialized()

Bfileオブジェクトが初期化されているかどうかを確認します。

isNull()

BfileオブジェクトがアトミックNULLかどうかをテストします。

isOpen()

BFILEがオープンしているかどうかを確認します。

length()

BFILEのバイト数を戻します。

open()

BFILEを読込み専用アクセスでオープンします。

operator=()

BFILEロケータをBfileオブジェクトに割り当てます。

operator==()

2つのBfileオブジェクトが等しいかどうかを確認します。

operator!=()

2つのBfileオブジェクトが等しくないかどうかを確認します。

operator==()

BFILEの特定部分をバッファに読み込みます。

setName()

BFILEのディレクトリ・オブジェクトとファイル名を設定します。

setNull()

BfileオブジェクトをアトミックNULLに設定します。

Bfile()

Bfileクラスのコンストラクタです。

構文

説明

Bfile();

NULLのBfileオブジェクトを作成します。

Bfile(
const Connection *connectionp);

未初期化のBfile オブジェクトを構築します。

Bfile(
const Bfile &srcBfile);

Bfileオブジェクトのコピーを作成します。

パラメータ

説明

connectionp

接続ポインタを指定します。

srcBfile

コピー元のBfileオブジェクトを指定します。

close()

以前にオープンしたBfileをクローズします。

構文

void close();

closeStream()

Bfileから取得したストリームをクローズします。

構文

void closeStream(
Stream *stream);

パラメータ

説明

stream

クローズするストリームを指定します。

fileExists()

BFILEがあるかどうかを確認します。BFILEがある場合はTRUEを、それ以外の場合はFALSEを戻します。

構文

bool fileExists() const;

getDirAlias()

BFILEに関連付けられているディレクトリ・オブジェクトを含む文字列を戻します。

構文

string getDirAlias() const;

getFileName()

BFILEに関連付けられているファイル名を含む文字列を戻します。

構文

string getFileName() const;

getStream()

BFILEから読み取られたStreamオブジェクトを戻します。ストリームがオープンしている場合、そのBfileオブジェクトで別のストリームをオープンすることはできません。ストリームは、Bfileオブジェクト操作を実行する前にクローズする必要があります。

構文

Stream* getStream(
unsigned int offset = 1,
unsigned int amount = 0);

パラメータ

説明

offset

BFILEから読み取るデータの開始位置を指定します。offsetが未指定の場合、データはBLOBの最初から書き込まれます。有効な値は、1以上の数値です。

amount

BFILEから読み取るバイトの合計数を指定します。amountが0 (ゼロ)の場合は、入力offsetの位置からBFILEの終わりまでのデータがストリーム・モードで読み取られます。

getUStringDirAlias()

BFILEに関連付けられているディレクトリ・オブジェクトを含むUStringを戻します。UStringオブジェクトにはUTF16キャラクタ・セットが使用されます。BFILEに関連付けられている環境を、UTF16キャラクタセットに関連付ける必要があります。

構文

UString getUStringDirAlias() const;

getUStringFileName()

BFILEに関連付けられているファイル名を含むUStringを戻します。UStringオブジェクトにはUTF16キャラクタセットが使用されます。BFILEに関連付けられている環境を、UTF16キャラクタセットに関連付ける必要があります。

構文

UString getUStringFileName() const;

isInitialized()

Bfileオブジェクトが初期化されているかどうかを確認します。Bfileオブジェクトが初期化されている場合はTRUEを、それ以外の場合はFALSEを戻します。

構文

bool isInitialized() const;

isNull()

BfileオブジェクトがアトミックNULLかどうかをテストします。BfileオブジェクトがアトミックNULLの場合はTRUEを、それ以外の場合はFALSEを戻します。

構文

bool isNull() const;

isOpen()

BFILEがオープンしているかどうかを確認します。BFILEは、このBfileオブジェクトでのコールによってオープンされた場合にのみ、オープンしているとみなされます。(別のBfileオブジェクトがこのファイルをオープンしている場合があります。これは、このファイルを異なる複数のBfileオブジェクトに関連付けることで、同一のファイルに対して複数のopen()コールを実行できるためです)。BFILEがオープンしている場合はTRUEを、それ以外の場合はFALSEを戻します。

構文

bool isOpen() const;

length()

BFILEのバイト数を（ファイル・マーカーの終了も含めて）戻します。

構文

unsigned int length() const;

open()

既存のBFILEを読込み専用アクセスでオープンします。この関数は、1つのBfileオブジェクトに対して初めてコールされたときに有効となります。

構文

void open();

operator=()

Bfileオブジェクトを現行のBfileオブジェクトに割り当てます。ソースのBfileオブジェクトは、このBfileオブジェクトがデータベースに格納されている場合にのみ、このBfileオブジェクトに割り当てられます。

構文

Bfile& operator=(
const Bfile &srcBfile);

パラメータ

説明

srcBfile

現行のBfileオブジェクトに割り当てるBfileオブジェクトを指定します。

operator==()

2つのBfileオブジェクトを比較して、等しいかどうかを調べます。2つのBfileオブジェクトが同じBFILEを参照している場合、それらのオブジェクトは等しいと判断されます。2つのBfileオブジェクトがNULLの場合は、FALSEを戻します。2つのBfileオブジェクトが等しい場合はTRUEを、それ以外の場合はFALSEを戻します。

構文

bool operator==(
const Bfile &srcBfile) const;

パラメータ

説明

srcBfile

現行のBfileオブジェクトと比較するBfileオブジェクトを指定します。

operator!=()

2つのBfileオブジェクトを比較して、等しくないかどうかを調べます。2つのBfileオブジェクトが同じBFILEを参照している場合、それらのオブジェクトは等しいと判断されます。2つのBfileオブジェクトが等しくない場合はTRUEを、それ以外の場合はFALSEを戻します。

構文

bool operator!=(
const Bfile &srcBfile) const;

パラメータ

説明

srcBfile

現行のBfileオブジェクトと比較するBfileオブジェクトを指定します。

read()

BFILEの一部またはすべてを指定されたバッファに読み込み、読み取られたバイト数を戻します。

構文

unsigned int read(
unsigned int amt,
unsigned char *buffer,
unsigned int bufsize,
unsigned int offset = 1) const;

パラメータ

説明

amt

読み込むバイト数を指定します。有効な値は、1以上の数値です。

buffer

BFILEデータを読み取るバッファを指定します。有効な値は、amt以上の数値です。

buffsize

BFILEデータを読み取るバッファのサイズを指定します。有効な値は、amt以上の数値です。

offset

BFILEから読み取るデータの開始位置を指定します。offsetが未指定の場合、データはBFILEの最初から書き込まれます。

setName()

BFILEのディレクトリ・オブジェクトとファイル名を設定します。

構文

説明

void setName(
const string &dirAlias,
const string &fileName);

BFILEのディレクトリ・オブジェクトとファイル名を設定します。

void setName(
const UString &dirAlias,
const UString &fileName);

BFILEのディレクトリ・オブジェクトとファイル名を設定します（Unicodeサポート）。クライアントのEnvironmentをOCCIUTIF16モードで初期化する必要があります。

パラメータ

説明

dirAlias

BFILEに関連付けるディレクトリ・オブジェクトを指定します。

fileName

BFILEに関連付けるファイル名を指定します。

setNull()

BfileオブジェクトをアトミックNULLに設定します。

構文

void setNull();

Blobクラス

Blobクラスは、BLOB型オブジェクトの共通プロパティを定義します。BLOBは、データベース表の行の列値として格納されるラージ・バイナリ・オブジェクトです。Blobオブジェクトには、BLOBへの論理ポインタが含まれていますが、BLOB自体は含まれていません。

Blobクラスのメソッドを使用すると、Blobオブジェクトに関連する特定のタスクを実行できます。

getBlob()やsetBlob()など、ResultSetクラスとStatementクラスのメソッドによって、SQL BLOBの値にアクセスできます。

NULLのBlobオブジェクトに対する有効なメソッドは、setName()、isNull()およびoperator=()のみです。

未初期化のBlobオブジェクトは、次の方法で初期化できます。

- setEmpty()メソッドを実行します。次に、このBLOBを表に挿入してBLOBを変更すると、SELECT...FOR UPDATEを使用してその内容を取り出すことができます。write()メソッドによってBLOBは変更されますが、変更されたデータは、トランザクションがコミットされたときにのみ表にフラッシュされます。UPDATEは必要ありません。

- 初期化したBlobオブジェクトを割り当てます。

関連項目

- LOBの詳細は、『Oracle Database SecureFilesおよびラージ・オブジェクト開発者ガイド』を参照してください。

表13-8 Blobメソッドの概要

メソッド

概要

Blob()

Blobクラスのコンストラクタです。

append()

指定したBLOBを現行のBLOBの最後に追加します。

close()

前にオープンしたBLOBをクローズします。

closeStream()

BLOBから取得したStreamオブジェクトをクローズします。

copy()

BFILEまたはBLOBの指定部分を現行のBLOBにコピーします。

getChunkSize()

BLOBへの効率的な書込みを実行するための最小データ・サイズを戻します。

getContentType()

Blobのコンテンツ・タイプを戻します。

getOptions()

指定したLobOptionTypeに対するBLOBのLobOptionValueを戻します。

getStream()

StreamオブジェクトとしてBLOBからデータを戻します。

isInitialized()

Blobオブジェクトが初期化されているかどうかを確認します。

isNull()

BlobオブジェクトがアトミックNULLかどうかをテストします。

isOpen()

BLOBがオープンしているかどうかを確認します。

length()

BLOBのバイト数を戻します。

open()

BLOBを読込み専用または読込み/書込みアクセスでオープンします。

operator=()

BLOBロケータをBlobオブジェクトに割り当てます。

operator==()

2つのBlobオブジェクトが等しいかどうかを確認します。

operator!=()

2つのBlobオブジェクトが等しくないかどうかを確認します。

read()

BLOBの一部をバッファに読み込みます。

setContentType()

Blobのコンテンツ・タイプを設定します。

setEmpty()

Blobオブジェクトを空に設定します。

setNull()

BlobオブジェクトをアトミックNULLに設定します。

setOptions()

特定のLobOptionTypeに対してLobOptionValueを指定します。BLOBの高度な圧縮、暗号化および重複除外を有効化します。

trim()

BLOBを指定した長さに切り捨てます。

write()

バッファをオープンしていないBLOBに書き込みます。

writeChunk()

バッファをオープンしているBLOBに書き込みます。

Blob()

Blobクラスのコンストラクタです。

構文

説明

Blob();

NULLのBlobオブジェクトを作成します。

Blob(
const Connection *connectionp);

未初期化のBlobオブジェクトを構築します。

Blob(
const Blob &srcBlob);

Blobオブジェクトのコピーを作成します。

パラメータ

説明

connectionp

接続ポインタを指定します。

srcBlob

コピー元のBlobオブジェクトを指定します。

append()

BLOBを現行のBLOBの最後に追加します。

構文

void append(
const Blob &srcBlob);

パラメータ

説明

srcBlob

現行のBLOBオブジェクトに追加するBLOBオブジェクトを指定します。

close()

BLOBをクローズします。

構文

void close();

closeStream()

BLOBから取得したStreamオブジェクトをクローズします。

構文

void closeStream(
Stream *stream);

パラメータ

説明

stream

クローズするStreamを指定します。

copy()

BFILEまたはBLOBの一部またはすべてを現行のBLOBにコピーします。

構文

説明

void copy(
const Bfile &srcBfile,
unsigned int numBytes,
unsigned int dstOffset = 1,
unsigned int srcOffset = 1);

BFILEの一部を現行のBLOBにコピーします。

void copy(
const Blob &srcBlob,
unsigned int numBytes,
unsigned int dstOffset = 1,
unsigned int srcOffset = 1);

BLOBの一部を現行のBLOBにコピーします。
コピー先のBLOBが重複除外に対応しており、コピー元およびコピー先のBLOBが同じ列内にある場合、新規BLOBがコピー・オン・ライトとして作成されます。コピー元のBLOBから他のすべての設定が継承されます。コピー先のBLOBが重複除外に対応していない場合、BLOBの完全に新しいコピーとなります。

パラメータ

説明

srcBfile

データのコピー元のBFILEを指定します。

srcBlob

データのコピー元のBLOBを指定します。

numBytes

ソースBFILEまたはソースBLOBからコピーするバイト数を指定します。有効な値は0（ゼロ）以上の数値です。

dstOffset

現行のBLOBに書き込むデータの開始位置を指定します。有効な値は、1以上の数値です。

srcOffset

ソースBFILEまたはソースBLOBから読み取るデータの開始位置を指定します。有効な値は、1以上の数値です。

getChunkSize()

BLOBへの効率的な書込みを実行するための最小データ・サイズを戻します。

構文

unsigned int getChunkSize() const;

getContentType()

Blobのコンテンツ・タイプを戻します。コンテンツ・タイプが割り当てられていない場合は、NULL文字列を戻します。

構文

string getContentType();

getOptions()

指定したLobOptionTypeに対するBLOBのLobOptionValueを戻します。

BLOBが格納されたデータベース列またはパーティションに対して設定されていないオプションの値を取得しようとすると、例外が発生します。

構文

LobOptionValue getOptions(
LobOptionType optType);

パラメータ

説明

optType

要求されるLobOptionTypeの設定です。これらの設定は、サーバーのラウンドトリップを避けるために、ビット単位のor (|)を使用して結合できます。表7-1「LobOptionType型の値」および表7-2「LobOptionValue型の値」を参照してください。

getStream()

BLOBからStreamオブジェクトを戻します。ストリームがオープンしている場合、別のストリームをBlobオブジェクトでオープンすることはできません。したがって、ユーザーは、Blobオブジェクト操作を実行する前に、ストリームを常にクローズする必要があります。

構文

Stream* getStream(
unsigned int offset = 1,
unsigned int amount = 0);

パラメータ

説明

offset

BLOBから読み取るデータの開始位置を指定します。offsetが未指定の場合、データはBLOBの最初から書き込まれます。有効な値は、1以上の数値です。

amount

BLOBから読み取るバイトの合計数を指定します。amountが0 (ゼロ)の場合は、入力offsetの位置からBLOBの終わりまでのデータがストリーム・モードで読み取られます。

isInitialized()

Blobオブジェクトが初期化されているかどうかを確認します。Blobオブジェクトが初期化されている場合はTRUEを、それ以外の場合はFALSEを戻します。

構文

bool isInitialized() const;

isNull()

BlobオブジェクトがアトミックNULLかどうかをテストします。BlobオブジェクトがアトミックNULLの場合はTRUEを、それ以外の場合はFALSEを戻します。

構文

bool isNull() const;

isOpen()

BLOBがオープンしているかどうかを確認します。BLOBがオープンしている場合はTRUEを、それ以外の場合はFALSEを戻します。

構文

bool isOpen() const;

length()

BLOBのバイト数を戻します。

構文

unsigned int length() const;

open()

BLOBを読込み/書込みまたは読込み専用モードでオープンします。

構文

void open(
LobOpenMode mode = OCCI_LOB_READWRITE);

パラメータ

説明

mode

BLOBをオープンするモードを指定します。有効な値は、次のとおりです。

- OCCI_LOB_READWRITE

- OCCI_LOB_READONLY

operator=()

現行のBLOBにBLOBを割り当てます。割当て元BLOBは、割当て先BLOBが表に格納されているときにのみ、その割当て先BLOBにコピーされます。

構文

Blob& operator=(
const Blob &srcBlob);

パラメータ

説明

srcBlob

データのコピー元のBLOBを指定します。

operator==()

2つのBlobオブジェクトを比較して、等しいかどうかを調べます。2つのBlobオブジェクトが同じBLOBを参照している場合、それらのオブジェクトは等しいと判断されます。2つのBlobオブジェクトがNULLの場合は、等しいとは判断されません。2つのBlobオブジェクトが等しい場合はTRUEを、それ以外の場合はFALSEを戻します。

構文

bool operator==(
const Blob &srcBlob) const;

パラメータ

説明

srcBlob

現行のBLOBと比較するソースBLOBを指定します。

operator!=()

2つのBlobオブジェクトを比較して、等しくないかどうかを調べます。2つのBlobオブジェクトが同じBLOBを参照している場合、それらのオブジェクトは等しいと判断されます。2つのBlobオブジェクトがNULLの場合は、等しいとは判断されません。2つのBlobオブジェクトが等しくない場合はTRUEを、それ以外の場合はFALSEを戻します。

構文

bool operator!=(
const Blob &srcBlob) const;

パラメータ

説明

srcBlob

現行のBLOBと比較するソースBLOBを指定します。

read()

BLOBの一部またはすべてをバッファに読み込みます。実際に読み込まれたバイト数が戻ります。

構文

unsigned int read(
unsigned int amt,
unsigned char *buffer,
unsigned int bufsize,
unsigned int offset = 1) const;

パラメータ

説明

amt

読み込むバイト数を指定します。有効な値は、1以上の数値です。

buffer

BLOBデータを読み取るバッファを指定します。有効な値は、amt以上の数値です。

buffsize

BLOBデータを読み取るバッファのサイズを指定します。有効な値は、amt以上の数値です。

offset

BLOBから読み取るデータの開始位置を指定します。offsetが未指定の場合、データはBLOBの最初から書き込まれます。

setContentType()

Blobのコンテンツ・タイプを設定します。BlobがSecureFileでない場合は、例外が発生します。

構文

void setContentType(
const string contenttype);

パラメータ

説明

contenttype

Blobのコンテンツ・タイプを指定します。ASCII Mime対応の文字列です。

setEmpty()

Blobオブジェクトを空に設定します。

構文

説明

void setEmpty();

Blobオブジェクトを空に設定します。

void setEmpty(
const Connection* connectionp);

Blobオブジェクトを空に設定し、渡されたパラメータへの接続ポインタを初期化します。

パラメータ

説明

connectionp

BLOBオブジェクトの新しい接続ポインタを指定します。

setNull()

BlobオブジェクトをアトミックNULLに設定します。

構文

void setNull();

setOptions()

特定のLobOptionTypeに対してLobOptionValueを指定します。BLOBの高度な圧縮、暗号化および重複除外を有効化します。表7-1「LobOptionType型の値」および表7-2「LobOptionValue型の値」を参照してください。

BLOBが格納されたデータベース列またはパーティションに対して設定されていないオプションを設定または設定解除しようとすると、例外が発生します。

暗号化されたBLOB列で暗号化をオフにしようとすると、例外が発生します。

構文

void setOptions(
LobOptionType optType,
LobOptionValue optValue);

パラメータ

説明

optType

指定されているLobOptionTypeの設定です。これらの設定は、サーバーのラウンドトリップを避けるために、ビット単位のor (|)を使用して結合できます。

optValue

optTypeパラメータで指定されたLobOptionTypeのLobOptionValue設定です。

trim()

BLOBを新しく指定した長さに切り捨てます。

構文

void trim(
unsigned int newlen);

パラメータ

説明

newlen

BLOBの新しい長さを指定します。有効な値は、BLOBの現在の長さ以下の数値です。

write()

バッファのデータをBLOBに書き込みます。このメソッドは、BLOBを暗黙的にオープンしてバッファのデータをBLOBにコピーし、BLOBを暗黙的にクローズします。BLOBがオープンしている場合は、かわりにwriteChunk()を使用します。実際に書き込まれたバイト数が戻ります。

構文

unsigned int write(
unsigned int amt,
unsigned char *buffer,
unsigned int bufsize,
unsigned int offset = 1);

パラメータ

説明

amt

BLOBに書き込むバイト数を指定します。

buffer

BLOBに書き込むデータが含まれているバッファを指定します。

buffsize

BLOBに書き込むデータが含まれているバッファのサイズを指定します。有効な値は、amt以上の数値です。

offset

BLOBに書き込むデータの開始位置を指定します。offsetが未指定の場合、データはBLOBの最初から書き込まれます。有効な値は、1以上の数値です。

writeChunk()

バッファのデータを前にオープンしたBLOBに書き込みます。実際に書き込まれたバイト数が戻ります。

構文

unsigned int writeChunk(
unsigned int amount,
unsigned char *buffer,
unsigned int bufsize,
unsigned int offset = 1);

パラメータ

説明

amt

BLOBに書き込むバイト数を指定します。

buffer

BLOBに書き込むデータが含まれているバッファを指定します。

buffsize

BLOBに書き込むデータが含まれているバッファのサイズを指定します。有効な値は、amt以上の数値です。

offset

BLOBに書き込むデータの開始位置を指定します。offsetが未指定の場合、データはBLOBの最初から書き込まれます。有効な値は、1以上の数値です。

Bytesクラス

Bytesクラスのメソッドを使用すると、Bytesオブジェクトに関連する特定のタスクを実行できます。

表13-9 Bytesメソッドの概要

メソッド

概要

Bytes()

Bytesクラスのコンストラクタです。

byteAt()

Bytesオブジェクトの指定位置のバイトを戻します。

getBytes()

Bytesオブジェクトからバイト配列を戻します。

isNull()

BytesオブジェクトがNULLかどうかをテストします。

length()

Bytesオブジェクトのバイト数を戻します。

operator=()

Bytesクラスの代入演算子です。

setNull()

BytesオブジェクトをNULLに設定します。

Bytes()

Bytesクラスのコンストラクタです。

構文

説明

Bytes(
Environment *env = NULL);

Bytesオブジェクトを作成します。

Bytes(
unsigned char *value,
unsigned int count
unsigned int offset = 0,
const Environment *env = NULL);

文字配列から、バイトのサブ配列が含まれるBytesオブジェクトを作成します。

Bytes(
const Bytes &e);

Bytesオブジェクトのコピーを作成します。

パラメータ

説明

env

環境を指定します。

value

新規オブジェクトの初期値を指定します。

count

新規のBytesオブジェクトにコピーする文字配列のサブセットのサイズを指定します。

offset

文字配列のコピー開始位置を指定します。

e

コピー元のBytesオブジェクトを指定します。

byteAt()

Bytesオブジェクトの指定した位置のバイトを戻します。

構文

unsigned char byteAt(
unsigned int index) const;

パラメータ

説明

index

Bytesオブジェクトから戻されるバイトの位置を指定します。Bytesオブジェクトの最初のバイトには、0（ゼロ）を指定します。

getBytes()

Bytesオブジェクトから指定したバイト配列にバイトをコピーします。

構文

void getBytes(
unsigned char *dst,
unsigned int count,
unsigned int srcBegin = 0,
unsigned int dstBegin = 0) const;

パラメータ

説明

dst

Bytesオブジェクトのデータを書き込む宛先バッファを指定します。

count

コピーするバイト数を指定します。

srcBegin

Bytesオブジェクトから読み込むデータの開始位置を指定します。Bytesオブジェクトの最初のバイト位置は、0（ゼロ）です。

dstBegin

宛先バッファに書き込むデータの開始位置を指定します。dstの最初のバイト位置は、0（ゼロ）です。

isNull()

BytesオブジェクトがアトミックNULLかどうかをテストします。BytesオブジェクトがアトミックNULLの場合はTRUEを、それ以外の場合はFALSEを戻します。

構文

bool isNull() const;

length()

このメソッドは、Bytesオブジェクトの長さを戻します。

構文

unsigned int length() const;

operator=()

Bytesクラスの代入演算子です。

構文

void operator=(
const Bytes& bytes);

パラメータ

説明

bytes

オリジナルのBytesオブジェクトです。

setNull()

BytesオブジェクトをアトミックNULLに設定します。

構文

void setNull();

Clobクラス

Clobクラスは、CLOB型オブジェクトの共通プロパティを定義します。Clobは、データベース表の行の列値として格納されるラージ・キャラクタ・オブジェクトです。Clobオブジェクトには、CLOBへの論理ポインタが含まれていますが、CLOB自体は含まれていません。

Clobクラスのメソッドを使用すると、Clobオブジェクトに関連する特定のタスクを実行できます。これには、SQL CLOBの長さを取得するためのメソッド、クライアント上のCLOBをマテリアライズするためのメソッドおよびCLOBの一部を抽出するためのメソッドも含まれます。

NULLのCLOBオブジェクトに対して有効なメソッドは、setName()、isNull()およびoperator=()のみです。

getClob()やsetClob()など、ResultSetクラスとStatementクラスのメソッドによって、SQL CLOBの値にアクセスできます。

未初期化のCLOBオブジェクトは、次の方法で初期化できます。

- setEmpty()メソッドを実行します。次に、このCLOBを表に挿入してCLOBを変更すると、SELECT...FOR UPDATEを使用してその内容を取り出すことができます。write()メソッドによってCLOBは変更されますが、変更されたデータは、トランザクションがコミットされたときにのみ表にフラッシュされます。INSERTは必要ありません。

- 初期化したClobオブジェクトを割り当てます。

関連項目

- LOBの詳細は、『Oracle Database SecureFilesおよびラージ・オブジェクト開発者ガイド』の該当する章を参照してください。

表13-10 Clobメソッドの概要

メソッド

概要

Clob()

Clobクラスのコンストラクタです。

append()

Clobを現行のClobの最後に追加します。

close()

前にオープンしたClobをクローズします。

closeStream()

現行のClobから取得したStreamオブジェクトをクローズします。

copy()

ClobまたはBFILEのすべてまたは一部を現行のClobにコピーします。

getCharSetForm()

Clobのキャラクタ・セット・フォームを戻します。

getCharSetId()

Clobのキャラクタ・セットIDを戻します。

getCharSetIdUString()

Clobで使用されるキャラクタ・セットの名前のUStringバージョンを取得します。

getChunkSize()

CLOBへの効率的な書込みを実行するための最小データ・サイズを戻します。

getContentType()

Clobのコンテンツ・タイプを戻します。

getOptions()

指定したLobOptionTypeに対するCLOBのLobOptionValueを戻します。

getStream()

StreamオブジェクトとしてCLOBからデータを戻します。

isInitialized()

Clobオブジェクトが初期化されているかどうかを確認します。

isNull()

ClobオブジェクトがアトミックNULLかどうかをテストします。

isOpen()

Clobがオープンしているかどうかを確認します。

length()

現行のCLOBの文字数を戻します。

open()

CLOBを読込み専用または読込み/書込みアクセスでオープンします。

operator=()

CLOBロケータを現行のClobオブジェクトに割り当てます。

operator==()

2つのClobオブジェクトが等しいかどうかを確認します。

operator!=()

2つのClobオブジェクトが等しくないかどうかを確認します。

read()

CLOBの一部をバッファに読み込みます。

setCharSetId()

Clobに関連付けられたキャラクタ・セットIDを設定します。

setCharSetIdUString()

Clobに関連付けられたキャラクタ・セットIDを設定します。このIDは、環境のキャラクタ・セットがUTF16の場合に使用されます。

setCharSetForm()

Clobに関連付けられたキャラクタ・セット・フォームを設定します。

setContentType()

Clobのコンテンツ・タイプを設定します。

setEmpty()

Clobオブジェクトを空に設定します。

setNull()

ClobオブジェクトをアトミックNULLに設定します。

setOptions()

特定のLobOptionTypeに対してLobOptionValueを指定します。CLOBの高度な圧縮、暗号化および重複除外を有効化します。

trim()

Clobを指定した長さに切り捨てます。

write()

バッファをオープンしていないCLOBに書き込みます。

writeChunk()

バッファをオープンしているCLOBに書き込みます。

Clob()

Clobクラスのコンストラクタです。

構文

説明

Clob();

NULLのClobオブジェクトを作成します。

Clob(
const Connection *connectionp);

未初期化のClobオブジェクトを構築します。

Clob(
const Clob *srcClob);

Clobオブジェクトのコピーを作成します。

パラメータ

説明

connectionp

接続ポインタを指定します。

srcClob

コピー元のClobオブジェクトを指定します。

append()

CLOBを現行のCLOBの最後に追加します。

構文

void append(
const Clob &srcClob);

パラメータ

説明

srcClob

現行のCLOBに追加するCLOBを指定します。

close()

CLOBをクローズします。

構文

void close();

closeStream()

CLOBから取得したStreamオブジェクトをクローズします。

構文

void closeStream(
Stream *stream);

パラメータ

説明

stream

クローズするStreamオブジェクトを指定します。

copy()

BFILEまたはCLOBの一部またはすべてを現行のCLOBにコピーします。

OCCIは、BfileからClobにデータをロードする際にキャラクタセット変換を実行しません。そのため、Bfileの内容がサーバーのClob記憶域キャラクタセット内の文字データであることを確認してください。

構文

説明

void copy(
const Bfile &srcBfile,
unsigned int numBytes,
unsigned int dstOffset = 1,
unsigned int srcOffset = 1);

BFILEを現行のCLOBにコピーします。

void copy(
const Clob &srcClob,
unsigned int numBytes,
unsigned int dstOffset = 1,
unsigned int srcOffset = 1);

CLOBを現行のCLOBにコピーします。
コピー先のCLOBが重複除外に対応しており、コピー元およびコピー先のCLOBが同じ列内にある場合、新規CLOBがコピー・オン・ライトとして作成されます。コピー元のCLOBから他のすべての設定が継承されます。コピー先のCLOBが重複除外に対応していない場合、CLOBの完全に新しいコピーとなります。

パラメータ

説明

srcBfile

データのコピー元のBFILEを指定します。

srcClob

データのコピー元のCLOBを指定します。

numBytes

コピー元のBFILEまたはコピー元のCLOBからコピーするバイト数を指定します。有効な値は0（ゼロ）以上の数値です。

dstOffset

データの開始位置は0（ゼロ）です。
現行のCLOBに書き込むデータの開始位置を指定します。有効な値はコピー先バッファに書き込む最初のバイト位置を示す1以上の数値です。

srcOffset

ソースBFILEまたはソースCLOBから読み取るデータの開始位置を指定します。有効な値は、1以上の数値です。

getCharSetForm()

CLOBのキャラクタ・セット・フォームを戻します。

構文

CharSetForm getCharSetForm() const;

getCharSetId()

CLOBのキャラクタ・セットIDを文字列形式で戻します。

構文

string getCharSetId() const;

getCharSetIdUString()

Clobで使用されるキャラクタ・セットの名前のUStringバージョンを取得します。

構文

UString getCharSetIdUString() const;

getChunkSize()

CLOBへの効率的な書込みを実行するための最小データ・サイズを戻します。

構文

unsigned int getChunkSize() const;

getContentType()

Clobのコンテンツ・タイプを戻します。コンテンツ・タイプが割り当てられていない場合は、NULL文字列を戻します。

構文

string getContentType();

getOptions()

指定したLobOptionTypeに対するCLOBのLobOptionValueを戻します。

CLOBが格納されたデータベース列またはパーティションに対して設定されていないオプションの値を取得しようとすると、例外が発生します。

構文

LobOptionValue getOptions(
LobOptionType optType);

パラメータ

説明

optType

要求されるLobOptionTypeの設定です。これらの設定は、サーバーのラウンドトリップを避けるために、ビット単位のor (|)を使用して結合できます。表7-1「LobOptionType型の値」および表7-2「LobOptionValue型の値」を参照してください。

getStream()

CLOBからStreamオブジェクトを戻します。ストリームがオープンしている場合は、別のストリームをCLOBオブジェクトでオープンすることはできません。したがって、ユーザーはClobオブジェクト操作を実行する前に、ストリームを常にクローズする必要があります。キャラクタ・セットIDとフォームは、setCharSetId()およびsetEmpty()のコールで明示的に設定されていない場合、デフォルトでクライアントのキャラクタ・セットIDとフォームが使用されます。

構文

Stream* getStream(
unsigned int offset = 1,
unsigned int amount = 0);

パラメータ

説明

offset

CLOBから読み取るデータの開始位置を指定します。offsetが未指定の場合、データはCLOBの最初から書き込まれます。有効な値は、1以上の数値です。

amount

連続して読み込む文字数の合計を指定します。amountが0 (ゼロ)の場合は、offset値からCLOBの最後までのデータが読み取られます。

isInitialized()

Clobオブジェクトが初期化されているかどうかを確認します。Clobオブジェクトが初期化されている場合はTRUEを、それ以外の場合はFALSEを戻します。

構文

bool isInitialized() const;

isNull()

ClobオブジェクトがアトミックNULLかどうかをテストします。ClobオブジェクトがアトミックNULLの場合はTRUEを、それ以外の場合はFALSEを戻します。

構文

bool isNull() const;

isOpen()

CLOBがオープンしているかどうかを確認します。CLOBがオープンしている場合はTRUEを、それ以外の場合はFALSEを戻します。

構文

bool isOpen() const;

length()

CLOBの文字数を戻します。

構文

unsigned int length() const;

open()

CLOBを読込み/書込みモードまたは読込み専用モードでオープンします。

構文

void open(
LObOpenMode mode = OCCI_LOB_READWRITE);

パラメータ

説明

mode

CLOBをオープンするモードを指定します。有効な値は、次のとおりです。

- OCCI_LOB_READWRITE

- OCCI_LOB_READONLY

operator=()

現行のCLOBにCLOBを割り当てます。割当て元CLOBは、割当て先CLOBが表に格納されているときにのみ、その割当て先CLOBにコピーされます。

構文

Clob& operator=(
const Clob &srcClob);

パラメータ

説明

srcClob

データのコピー元のClobを指定します。

operator==()

2つのClobオブジェクトを比較して、等しいかどうかを調べます。2つのClobオブジェクトが同じCLOBを参照している場合、それらのオブジェクトは等しいと判断されます。2つのClobオブジェクトがNULLの場合は、等しいとは判断されません。Blobオブジェクトが等しい場合はTRUEを、それ以外の場合はFALSEを戻します。

構文

bool operator==(
const Clob &srcClob) const;

パラメータ

説明

srcClob

現行のClobオブジェクトと比較するClobオブジェクトを指定します。

operator!=()

2つのClobオブジェクトを比較して、等しくないかどうかを調べます。2つのClobオブジェクトが同じCLOBを参照している場合、それらのオブジェクトは等しいと判断されます。2つのClobオブジェクトがNULLの場合は、等しいとは判断されません。2つのClobオブジェクトが等しくない場合はTRUEを、それ以外の場合はFALSEを戻します。

構文

bool operator!=(
const Clob &srcClob) const;

パラメータ

説明

srcClob

現行のClobオブジェクトと比較するClobオブジェクトを指定します。

read()

CLOBの一部またはすべてをバッファに読み込みます。

UTF16などの固定幅キャラクタ・セットの場合は実際の文字数、UTF8などのマルチバイト・キャラクタ・セットの場合は読み取られたバイト数が戻されます。

キャラクタ・セットIDとフォームは、setCharSetId()、setCharSetIdUString()およびsetCharSetForm()のコールで明示的に設定されていない場合、デフォルトでクライアントのキャラクタ・セットIDとフォームが使用されます。

このメソッドの2番目のバージョンでの戻り値は、固定幅キャラクタ・セット(UTF16)の場合は読み取られた文字数を表し、マルチバイト・キャラクタ・セット(UTF8など)の場合は読み取られたバイト数を表します。

構文

説明

unsigned int read(
unsigned int amt,
unsigned char *buffer,
unsigned int bufsize,
unsigned int offset=1) const;

CLOBの一部またはすべてをバッファに読み込みます。

unsigned int read(
unsigned int amt,
unsigned utext *buffer,
unsigned int bufsize,
unsigned int offset=1) const;

グローバリゼーションが有効化された状態で、CLOBの一部またはすべてをバッファに読み込みます。このメソッドは、setCharSetId()メソッドを使用してキャラクタ・セットをOCCIUTF16に設定した後にコールする必要があります。

パラメータ

説明

amt

CLOBから読み取るバイト数を指定します。

buffer

CLOBデータを読み取るバッファを指定します。

buffsize

バッファのサイズを指定します。有効な値は、amt以上の数値です。

offset

CLOBから読み取るデータの開始位置を指定します。offsetが未指定の場合、データはCLOBの最初から書き込まれます。有効な値は、1以上の数値です。

setCharSetId()

Clobに関連付けられたキャラクタ・セットIDを設定します。設定したキャラクタセットIDは、読込み/書込みおよびgetStream()操作で使用されます。値が明示的に設定されていない場合は、デフォルトのクライアントのキャラクタ・セットIDが使用されます。サポートされているキャラクタ・セットのリストは、『Oracle Databaseグローバリゼーション・サポート・ガイド』の付録Aを参照してください。

構文

void setCharSetId(
const string &charset);

パラメータ

説明

charset

Oracleは、E8DEC、ZHT16BIG5またはOCCIUTF16などのキャラクタ・セット名をサポートしています。

setCharSetIdUString()

Clobに関連付けられたキャラクタセットIDを設定します。このIDは、環境のキャラクタセットがUTF16の場合に使用されます。設定したcharset IDは、読込み/書込みおよびgetStream()操作で使用されます。

構文

void setCharSetIdUSString(
const string &charset);

パラメータ

説明

charset

Oracleは、WE8DEC、ZHT16BIG5またはOCCIUTF16など、UString（UTF16キャラクタ・セット）のキャラクタ・セット名をサポートしています。

setCharSetForm()

CLOBに関連付けられたキャラクタ・セット・フォームを設定します。設定したキャラクタ・セット・フォームは、読込み/書込みおよびgetStream()操作で使用されます。値が明示的に設定されていない場合、デフォルトではOCCI_SQLCS_IMPLICITが使用されます。

構文

void setCharSetForm(
CharSetForm csfrm );

パラメータ

説明

csfrm

Clobのキャラクタ・セット・フォームを指定します。

setContentType()

Clobのコンテンツ・タイプを設定します。ClobがSecureFileでない場合は、例外が発生します。

構文

void setContentType(
const string contenttype);

パラメータ

説明

contenttype

Clobのコンテンツ・タイプを指定します。ASCII Mime対応の文字列です。

setEmpty()

Clobオブジェクトを空に設定します。

構文

説明

void setEmpty();

Clobオブジェクトを空に設定します。

void setEmpty(
const Connection* connectionp);

Clobオブジェクトを空に設定し、渡されたパラメータへの接続ポインタを初期化します。

パラメータ

説明

connectionp

Clobオブジェクトの新しい接続ポインタを指定します。

setNull()

ClobオブジェクトをアトミックNULLに設定します。

構文

void setNull();

setOptions()

特定のLobOptionTypeに対してLobOptionValueを指定します。CLOBの高度な圧縮、暗号化および重複除外を有効化します。表7-1「LobOptionType型の値」および表7-2「LobOptionValue型の値」を参照してください。

CLOBが格納されたデータベース列またはパーティションに対して設定されていないオプションを設定または設定解除しようとすると、例外が発生します。

暗号化されたCLOB列で暗号化をオフにしようとすると、例外が発生します。

構文

void setOptions(
LobOptionType optType,
LobOptionValue optValue);

パラメータ

説明

optType

指定されているLobOptionTypeの設定です。これらの設定は、サーバーのラウンドトリップを避けるために、ビット単位のor (|)を使用して結合できます。

optValue

optTypeパラメータで指定されたLobOptionTypeのLobOptionValue設定です。

trim()

CLOBを新しく指定した長さに切り捨てます。

構文

void trim(
unsigned int newlen);

パラメータ

説明

newlen

CLOBの新しい長さを指定します。有効な値は、CLOBの現在の長さ以下の数値です。

write()

バッファのデータをCLOBに書き込みます。

このメソッドは、CLOBを暗黙的にオープンしてバッファのデータをCLOBにコピーし、CLOBを暗黙的にクローズします。CLOBがオープンしている場合は、かわりにwriteChunk()を使用します。実際に書き込まれた文字数が戻ります。キャラクタ・セットIDとフォームは、setCharSetId()およびsetCharSetForm()のコールで明示的に設定されていない場合、デフォルトでクライアントのキャラクタ・セットIDとフォームが使用されます。

構文

説明

unsigned int write(
unsigned int amt,
unsigned char *buffer,
unsigned int bufsize,
unsigned int offset=1);

バッファのデータをCLOBに書き込みます。

unsigned int write(
unsigned int amt,
utext *buffer,
unsigned int bufsize,
unsigned int offset=1);

グローバリゼーションが有効化されている状態で、UTF16バッファのデータをCLOBに書き込みます。このメソッドは、setCharSetIdUString()メソッドを使用してキャラクタ・セットをOCCIUTF16に設定した後にコールする必要があります。

パラメータ

説明

amt

amountパラメータは次の数を表します。

- 固定幅キャラクタ・セット（UTF16）の場合は書き込む文字数

- マルチバイト・キャラクタ・セット（UTF8など）の場合は書き込むバイト数

buffer

CLOBに書き込むデータが含まれているバッファを指定します。

buffsize

CLOBに書き込むデータが含まれているバッファのサイズを指定します。有効な値は、amt以上の数値です。

offset

CLOBに書き込むデータの開始位置を指定します。offsetが未指定の場合、データはCLOBの最初から書き込まれます。有効な値は、1以上の数値です。

writeChunk()

バッファのデータを前にオープンしたCLOBに書き込みます。実際の文字数を戻します。キャラクタ・セットIDとフォームは、setCharSetId()およびsetCharSetForm()のコールで明示的に設定されていない場合、デフォルトでクライアントのキャラクタ・セットIDとフォームが使用されます。

構文

説明

unsigned int writeChunk(
unsigned int amt,
unsigned char *buffer,
unsigned int bufsize,
unsigned int offset=1);

バッファのデータを前にオープンしたCLOBに書き込みます。

unsigned int writeChunk(
unsigned int amt,
utext *buffer,
unsigned int bufsize,
unsigned int offset=1);

グローバリゼーションが有効化されている状態で、UTF16バッファのデータをCLOBに書き込みます。このメソッドは、setCharSetIdUString()メソッドを使用してキャラクタ・セットをOCCIUTF16に設定した後にコールする必要があります。

パラメータ

説明

amt

amtパラメータは、固定幅キャラクタセット(UTF16)の場合は書き込まれた文字数、マルチバイト・キャラクタセット(UTF8など)の場合は書き込まれたバイト数を表します。

buffer

CLOBに書き込むデータが含まれているバッファを指定します。

buffsize

CLOBに書き込むデータが含まれているバッファのサイズを指定します。有効な値は、amt以上の数値です。

offset

CLOBに書き込むデータの開始位置を指定します。offsetが未指定の場合、データはCLOBの最初から書き込まれます。有効な値は、1以上の数値です。

Connectionクラス

Connectionクラスは、特定のデータベースとの接続を示します。接続の内部で、SQL文が実行され、結果が戻ります。

表13-11 Connectionクラスで使用される列挙値

属性

オプション

FailOverEventType

- FO_BEGINは、接続の切断が検出され、フェイルオーバーが開始されることを示します。

- FO_ENDは、フェイルオーバーが正常に終了し、Connectionが使用できるようになったことを示します。

- FO_ABORTは、フェイルオーバーが成功せず再試行されないことを示します。

- FO_REAUTHは、ユーザー・セッションが再認証されたことを示します。

- FO_ERRORは、フェイルオーバーが成功しなかったが、アプリケーションがエラーを処理してフェイルオーバーを再試行できることを示します。

FailOverType

- FO_NONEは、フェイルオーバーに対する保護をユーザーが要求しなかったことを示します。

- FO_SESSIONは、セッションのフェイルオーバーのみをユーザーが要求したことを示します。

- FO_SELECTは、選択のフェイルオーバーをユーザーが要求したことを示します。

ProxyType

- PROXY_DEFAULTはデータベース・ユーザー名を示します。

表13-12 Connectionメソッドの概要

メソッド

概要

changePassword()

現行ユーザーのパスワードを変更します。

commit()

前回のコミットまたはロールバック以降の変更をコミットし、セッションが保持するデータベース・ロックを解放します。

createStatement()

SQL文を実行するStatementオブジェクトを作成します。

flushCache()

接続に関連付けられているオブジェクト・キャッシュをフラッシュします。

getClientCharSet()

デフォルトのクライアント・キャラクタ・セットを戻します。

getClientCharSetUString()

UStringのうちグローバリゼーション対応のクライアント・キャラクタ・セットを戻します。

getClientNCHARCharSet()

デフォルトのクライアントNCHARキャラクタ・セットを戻します。

getClientNCHARCharSetUString()

UStringのうちグローバリゼーション対応のクライアントのNCHARキャラクタ・セットを戻します。

getClientVersion()

使用されたクライアントのバージョンを戻します。

getMetaData()

接続からアクセス可能なオブジェクトのメタデータを戻します。

getOCIServer()

接続に関連付けられているOCIサーバー・コンテキストを戻します。

getOCIServiceContext()

接続に関連付けられているOCIサービス・コンテキストを戻します。

getOCISession()

接続に関連付けられているOCIセッション・コンテキストを戻します。

getServerVersion()

使用されたOracleサーバーのバージョンをstringとして戻します。

getServerVersionUString()

使用されたOracleサーバーのバージョンをUStringとして戻します。

getStmtCacheSize()

文キャッシュのサイズを取得します。

getTag()

接続に関連付けられているタグを戻します。

isCached()

指定の文がキャッシュされるかどうかを決定します。

pinVectorOfRefs()

Refオブジェクトのベクター全体を1回のラウンドトリップでオブジェクト・キャッシュに確保します。確保されたオブジェクトは、OUTパラメータのベクターを介して使用できます。

postToSubscriptions()

通知をサブスクリプションにポストします。

readVectorOfBfiles()

サーバーへの1回のラウンドトリップで複数のBfileを読み取ります。

readVectorOfBlobs()

サーバーへの1回のラウンドトリップで複数のBlobを読み取ります。

readVectorOfClobs()

サーバーへの1回のラウンドトリップで複数のClobを読み取ります。

registerSubscriptions()

通知に関して複数のSubscriptionを登録します。

rollback()

前回のコミットまたはロールバック以降の変更をすべてロールバックし、セッションが保持するデータベース・ロックを解放します。

setStmtCacheSize()

文キャッシュを有効化または無効化します。

setTAFNotify()

Connectionオブジェクトに対するフェイルオーバー・コールバック関数を登録します。

terminateStatement()

Statementオブジェクトをクローズし、そのオブジェクトに関連付けられているすべてのリソースを解放します。

unregisterSubscription()

Subscriptionの登録を解除し、通知をオフにします。

writeVectorOfBlobs()

サーバーへの1回のラウンドトリップで複数のBlobを書き込みます。

writeVectorOfClobs()

サーバーへの1回のラウンドトリップで複数のClobを書き込みます。

changePassword()

データベースに現在接続しているユーザーのパスワードを変更します。

構文

説明

void changePassword(
const string &user,
const string &oldPassword,
const string &newPassword)=0;

ユーザーのパスワードを変更します。

void changePassword(
const UString &user,
const UString &oldPassword,
const UString &newPassword)=0;

ユーザーのパスワードを変更します（Unicodeサポート）。クライアントのEnvironmentをOCCIUTIF16モードで初期化する必要があります。

パラメータ

説明

user

データベースに現在接続しているユーザーを指定します。

oldPassword

ユーザーの現行のパスワードを指定します。

newPassword

ユーザーの新規パスワードを指定します。

commit()

前回のコミットまたはロールバック以降の変更をすべてコミットし、セッションが現在保持しているデータベース・ロックを解放します。

構文

void commit()=0;

createStatement()

指定されたSQL文でStatementオブジェクトを作成します。

このメソッドのキャッシュ対応バージョンでは、一致するtagを持つ文がキャッシュ内で最初に検索され、その文が戻されます。このような文が見つからない場合は、sqlパラメータと一致する文がキャッシュ内で検索され、その文が戻されます。一致する文が見つからない場合は、NULLのtagを持つ新規の文が作成され、戻されます。sqlパラメータが空でtagの検索に失敗すると、このコールではERRORが生成されます。

このメソッドのキャッシュなしバージョンでは、常に新規の文が作成され、戻されます。

構文

説明

Statement* createStatement(
const string &sql="")=0;

指定されたSQL文をキャッシュ内で検索して戻します。見つからない場合は、新規の文を作成します。

Statement* createStatement(
const string &sql,
const string &tag)=0;

一致するタグを持つ文をキャッシュ内で検索します。見つからない場合は、指定されたSQLの内容を持つ新規の文を作成します。

Statement* createStatement(
const UString &sql)=0;

指定されたSQL文をキャッシュ内で検索して戻します。見つからない場合は、新規の文を作成します。グローバリゼーション対応の場合です。

Statement* createStatement(
const Ustring &sql,
const Ustring &tag)=0;

一致するタグを持つ文をキャッシュ内で検索して戻します。見つからない場合は、指定されたSQLの内容を持つ新規の文を作成します。グローバリゼーション対応の場合です。

パラメータ

説明

sql

Statementオブジェクトに関連付けるSQL文字列を指定します。

tag

キャッシュから取り出す必要のある文に関連付けられているタグを指定します。文キャッシュが無効化されている場合は無視されます。

flushCache()

接続に関連付けられているオブジェクト・キャッシュをフラッシュします。

構文

void flushCache()=0;

getClientCharSet()

セッションのキャラクタ・セットを戻します。

構文

string getClientCharSet() const=0;

getClientCharSetUString()

UStringのうちグローバリゼーション対応のクライアント・キャラクタ・セットを戻します。

構文

UString getClientCharSetUString() const=0;

getClientNCHARCharSet()

セッションのNCHARキャラクタ・セットを戻します。

構文

string getClientNCHARCharSet() const=0;

getClientNCHARCharSetUString()

UStringのうちグローバリゼーション対応のクライアントのNCHARキャラクタ・セットを戻します。

構文

UString getClientNCHARCharSetUString() const=0;

getClientVersion()

アプリケーションが実行時に使用するクライアント・ライブラリのバージョンを戻します。

このメソッドは、アプリケーションの実行時にOCCIクライアントのバージョンを確認し、アプリケーションで使用しているコード・パスが、複数の異なるクライアント・パッチ・セットを使用する別々のコード・パスかどうかを判断するために使用されます。

パラメータmajorVersionおよびminorVersionの値には、マクロOCCI_MAJOR_VERSIONおよびOCCI_MINOR_VERSIONがそれぞれ使用されます。これらのマクロは、OCCIクライアント・ライブラリのメジャー・バージョンとマイナー・バージョンを定義します。戻されたバージョンを比較します。

構文

void getClientVersion(
int &majorVersion,
int &minorVersion,
int &updateNum,
int &patchNumber,
int &portUpdateNum)

パラメータ

説明

majorVersion

クライアント・ライブラリのメジャー・バージョンです。

minorVersion

クライアント・ライブラリのマイナー・バージョンです。

updateNum

更新番号です。

patchNumber

ライブラリに適用されているパッチ番号です。

portUpdateNumber

ライブラリに適用されているポート固有のポート更新番号です。

getMetaData()

データベース内のオブジェクトのメタデータを戻します。

構文

説明

MetaData getMetaData(
const string &object,
MetaData::ParamType prmtyp=MetaData::PTYPE_UNK) const=0;

データベース内のオブジェクトのメタデータを戻します。

MetaData getMetaData(
const UString &object,
MetaData::ParamType prmtyp=MetaData::PTYPE_UNK) const=0;

データベース内のグローバリゼーション対応オブジェクトのメタデータを戻します。

MetaData getMetaData(
const RefAny &ref) const=0;

参照を介してデータベース内のオブジェクトのメタデータを戻します。

パラメータ

説明

object

Statementオブジェクトに関連付けるSQL文字列を指定します。

prmtyp

表13-27のMetaDataクラスの列挙されたParamTypeの定義に従って、記述するスキーマ・オブジェクトの型を指定します。

ref

記述する型の型記述子オブジェクト（TDO）へのREFを指定します。

getOCIServer()

接続に関連付けられているOCIサーバー・コンテキストを戻します。

構文

OCIServer* getOCIServer() const=0;

getOCIServiceContext()

接続に関連付けられているOCIサービス・コンテキストを戻します。

構文

OCISvcCtx* getOCIServiceContext() const=0;

getOCISession()

接続に関連付けられているOCIセッション・コンテキストを戻します。

構文

OCISession* getOCISession() const=0;

getServerVersion()

現行のConnectionオブジェクトによって使用されているデータベース・サーバーのバージョンを、stringとして戻します。これは、アプリケーションが異なるいくつかのコード・パスを使用し、複数の様々なサーバー・バージョンに接続するときに使用できます。

構文

string getServerVersion() const;

getServerVersionUString()

現行のConnectionオブジェクトによって使用されているデータベース・サーバーのバージョンを、UStringとして戻します。これは、アプリケーションが異なるいくつかのコード・パスを使用し、複数の様々なサーバー・バージョンに接続するときに使用できます。

構文

UString getServerVersionUString() const;

getStmtCacheSize()

文キャッシュのサイズを取得します。

構文

unsigned int getStmtCacheSize() const=0;

getTag()

接続に関連付けられているタグを戻します。ステートレスな接続プールからの接続にのみ有効です。

構文

string getTag() const=0;

isCached()

指定の文がキャッシュされるかどうかを決定します。

構文

説明

bool isCached(
const string &sql,
const string &tag="")=0;

一致するタグを持つ文をキャッシュ内で検索します。タグを指定しなければ、一致するSQL文がキャッシュ内で検索されます。

bool isCached(
const Ustring &sql,
const Ustring &tag)=0;

一致するタグを持つ文をキャッシュ内で検索します。タグを指定しなければ、一致するSQL文がキャッシュ内で検索されます。グローバリゼーション対応の場合です。

パラメータ

説明

sql

Statementオブジェクトに関連付けるSQL文字列を指定します。

tag

キャッシュから取り出す必要のある文に関連付けられているタグを指定します。文キャッシュが無効化されている場合は無視されます。

pinVectorOfRefs()

Refオブジェクトのベクター全体を1回のラウンドトリップでオブジェクト・キャッシュに確保します。確保されたオブジェクトは、OUTパラメータのベクターを介して使用できます。

構文

説明

template <class T> void pinVectorOfRefs(
const Connection *conn,
vector <Ref<T>> & vect,
vector <T*> &vectObj,
LockOptions lockOpt=OCCI_LOCK_NONE);

オブジェクトを戻します。

template <class T> void pinVectorOfRefs(
const Connection *conn,
vector <Ref<T>> & vect,
LockOptions lockOpt=OCCI_LOCK_NONE);

オブジェクトを明示的に戻しません。アプリケーションでは、前に確保されたオブジェクトを戻すptr()のコールにより特定のRefオブジェクトを間接参照する必要があります。

パラメータ

説明

conn

接続を指定します。

vect

確保されるRefオブジェクトのベクターを指定します。

vectObj

確保操作の完了後にオブジェクトを含むベクターを指定します。これはOUTパラメータです。

lockOpt

表13-2のLockOptionsの定義に従って、配列の確保時に使用するロック・オプションを指定します。サポートされている値はOCCI_LOCK_NONEのみです。

postToSubscriptions()

通知をサブスクリプションにポストします。

Subscriptionオブジェクトには有効なサブスクリプション名が必要であり、ネームスペースはNS_ANONYMOUSに設定する必要があります。このメソッドをコールする前に、ペイロードを設定する必要があります。それ以外の場合、ペイロードはNULLとみなされ、送信されません。

コール元は、ポスト・コールが完了するまでペイロードを維持する必要があります。このコールはベストエフォート型です。通知が登録済クライアントに送信されるのは、1度のみです。このコールは主として軽量の通知に使用され、複数のシステム・イベントの処理に役立ちます。アプリケーションでより確実な保証が必要な場合は、Oracle Streams Advanced Queuingの機能を使用できます。

構文

void postToSubscriptions(
const vector<aq::Subscription>& sub)=0;

パラメータ

説明

sub

ポスティングを受信するサブスクリプションのベクターを指定します。

readVectorOfBfiles()

サーバーへの1回のラウンドトリップで複数のBfileを読み取ります。Bfileをすべて読取り用にオープンしておく必要があります。

構文

void readVectorOfBfiles(
const Connection *conn,
vector<Bfile> &vec,
oraub8 *byteAmts,
oraub8 *offsets,
unsigned char *buffers[],
oraub8 *bufferLengths);

パラメータ

説明

conn

接続を指定します。

vec

Bfileオブジェクトのベクターを指定します。各Bfileを読取り用にオープンしておく必要があります。

byteAmts

各Bfileから読み取るバイト数の配列です。各Bfileから読み取られた実際のバイト数が、この配列に戻されます。

offsets

Bfile内の読取り開始位置であるオフセットの配列です。

buffers

データ読込み先バッファのポインタの配列です。

bufferLengths

各バッファのサイズ（単位: バイト）の配列です。

readVectorOfBlobs()

サーバーへの1回のラウンドトリップで複数のBLOBを読み取ります。

構文

void readVectorOfBlobs(
const Connection *conn,
vector<Blob> &vec,
oraub8 *byteAmts,
oraub8 *offsets,
unsigned char *buffers[],
oraub8 *bufferLengths);

パラメータ

説明

conn

接続を指定します。

vec

Blobオブジェクトのベクターです。

byteAmts

各Blobから読み取るバイト数の配列です。Blobから読み取られた実際のバイト数が、この配列に戻されます。

offsets

Blob内の読取り開始位置であるオフセットの配列です。

buffers

データ読込み先バッファのポインタの配列です。

bufferLengths

各バッファのサイズ（単位: バイト）の配列です。

readVectorOfClobs()

サーバーへの1回のラウンドトリップで複数のClobを読み取ります。すべてのClobは、同じキャラクタ・セット・フォームにあり、かつ同じキャラクタ・セットIDに属する必要があります。

構文

説明

void readVectorOfClobs(
const Connection *conn,
vector<Clob> &vec,
oraub8 *byteAmts,
araub8 *charAmts,
oraub8 *offsets,
unsigned char *buffers[],
oraub8 *bufferLengths);

このメソッドの一般的なフォームです。

void readVectorOfClobs(
const Connection *conn,
vector<Clob> &vec,
oraub8 *byteAmts,
araub8 *charAmts,
oraub8 *offsets,
utext *buffers[],
oraub8 *bufferLengths);

utextバッファとともに使用するときの、このメソッドのフォームです。この場合、データはUTF16キャラクタ・セット・エンコーディングです。

パラメータ

説明

conn

接続を指定します。

vec

Clobオブジェクトのベクターです。

byteAmts

各Clobから読み取るバイト数の配列です。Clob索引に対してcharAmtsがNULLまたは0である場合にのみ、使用されます。各Clobからの読取りバイト数を戻します。

charAmts

各Clobから読み取られる文字数の配列です。各Clobについて読み取られた文字数を戻します。

offsets

Clob内の読取り開始位置であるオフセット（文字数）の配列です。

buffers

データ読込み先バッファのポインタの配列です。

bufferLengths

各バッファのサイズ（単位: バイト）の配列です。

registerSubscriptions()

通知に関してSubscriptionを登録します。

新規のクライアント・プロセスと停止後に再起動する既存のプロセスは、必要なサブスクリプションすべてに登録する必要があります。サーバーの停止および再起動中もクライアントが稼働している場合、このクライアントは引き続きDISCONNECTED登録に関する通知を受け取りますが、CONNECTED登録に関する通知はサーバーが停止している間に失われるため、受け取りません。

構文

void registerSubscriptions(
const vector<aq::Subscription>& sub)=0;

パラメータ

説明

sub

通知用に登録するサブスクリプションのベクターです。

rollback()

前回のコミットまたはロールバック以降の変更をすべて削除し、セッションが現在保持しているデータベース・ロックを解放します。

構文

void rollback()=0;

setStmtCacheSize()

文キャッシュを有効化または無効化します。0 (ゼロ)以外の値を指定すると、指定したサイズのキャッシュによる文キャッシュが有効化されます。値0 (ゼロ)を指定すると、キャッシュが無効化されます。

構文

void setStmtCacheSize(
unsigned int cacheSize)=0;

パラメータ

説明

cacheSize

キャッシュ内の文の最大数です。

setTAFNotify()

フェイルオーバーを構成済で、検出する必要のあるConnectionオブジェクトに対して、フェイルオーバー・コールバック関数を登録します。

OCCIがデフォルトの処理を続行できる場合、フェイルオーバー・コールバックはOCCI_SUCCESSを戻すことでそのことを示す必要があります。フェイルオーバー・イベントfoEventの定義については、表13-11を参照してください。foEventがFO_ERRORである場合、コールバック関数は、フェイルオーバーを再試行する必要があることを示すときにはFO_RETRYを戻し、フェイルオーバーの試行を終了するときにはOCCI_SUCCESSを戻すことができます。

構文

void setTAFNotify(
int (*notifyFn)(
Environment *env,
Connection *conn,
void *ctx,
FailOverType foType,
FailOverEventType foEvent),
void *ctxTAF)

パラメータ

説明

notifyFn

フェイルオーバー・イベント時に起動されるユーザー定義のコールバック関数です。

env

障害の発生したConnectionが作成されたEnvironmentオブジェクトです。

conn

コールバック関数を登録する、障害発生先として想定されるConnectionです。

ctx

コールバックの登録時にユーザーが提供するコンテキストです。

foType

構成済のFailOverTypeです。値はFO_SESSIONまたはFO_SELECTです。各値の定義は表13-11を参照してください。

foEvent

コールバックをトリガーするフェイルオーバー・イベント・タイプであるFailOverEventTypeです。値はFO_BEGIN、FO_END、FO_ABORTまたはFO_ERRORです。各値の定義は表13-11を参照してください。

ctxTAF

起動時にコールバック関数に戻されるユーザー・コンテキストです。

terminateStatement()

Statementオブジェクトをクローズします。

構文

説明

void terminateStatement(
Statement *stmt)=0;

Statementオブジェクトをクローズし、そのオブジェクトに関連付けられているすべてのリソースを解放します。

void terminateStatement(
Statement *stmt,
const string &tag)=0;

文にオプションのタグstringを付けてから文を解放し、キャッシュに戻します。

void terminateStatement(
Statement* stmt,
const UString &tag) = 0;

文にオプションのタグUStringを付けてから文を解放し、キャッシュに戻します。

パラメータ

説明

stmt

クローズするStatementです。

tag

文に関連付けるタグstringまたはUStringです。

unregisterSubscription()

通知をオフにしてSubscriptionの登録を解除します。

構文

void unregisterSubscription(
const aq::Subscription& sub)=0;

パラメータ

説明

sub

通知をオフにするSubscriptionです。

writeVectorOfBlobs()

サーバーへの1回のラウンドトリップで複数のBlobを書き込みます。

構文

void writeVectorOfBlobs(
const Connection *conn,
vector<Blob> &vec,
oraub8 *byteAmts,
oraub8 *offsets,
unsigned char *buffers[],
oraub8 *bufferLengths);

パラメータ

説明

conn

接続を指定します。

vec

Blobオブジェクトのベクターです。

byteAmts

各Blobに書き込むバイト数の配列です。

offsets

Blob内での書込み開始位置であるオフセットの配列です。

buffers

データ書出し元バッファのポインタの配列です。

bufferLengths

各バッファのサイズ（単位: バイト）の配列です。

writeVectorOfClobs()

サーバーへの1回のラウンドトリップで複数のClobを書き込みます。すべてのClobは、同じキャラクタ・セット・フォームにあり、かつ同じキャラクタ・セットIDに属する必要があります。

構文

説明

void writeVectorOfClobs(
const Connection *conn,
vector<Clob> &vec,
oraub8 *byteAmts,
araub8 *charAmts,
oraub8 *offsets,
unsigned char *buffers[],
oraub8 *bufferLengths);

このメソッドの一般的なフォームです。

void writeVectorOfClobs(
const Connection *conn,
vector<Clob> &vec,
oraub8 *byteAmts,
araub8 *charAmts,
oraub8 *offsets,
utext *buffers[],
oraub8 *bufferLengths);

utextバッファとともに使用するときの、このメソッドのフォームです。この場合、データはUTF16キャラクタ・セット・エンコーディングです。

パラメータ

説明

conn

接続を指定します。

vec

Clobオブジェクトのベクターです。

byteAmts

各Clobに書き込まれるバイト数の配列です。Clob索引に対してcharAmtsがNULLまたは0である場合にのみ、使用されます。各Clobについて書き込まれたバイト数を戻します。

charAmts

各Clobに書き込まれる文字数の配列です。各Clobについて読み込まれた文字数を戻します。

offsets

Clob内での書込み開始位置であるオフセット（文字数）の配列です。

buffers

データ書出し元バッファのポインタの配列です。

bufferLengths

各バッファのサイズ（単位: バイト）の配列です。

ConnectionPoolクラス

ConnectionPoolクラスは、特定のデータベースに対する接続プールを示します。

表13-13 ConnectionPoolメソッドの概要

メソッド

概要

createConnection()

プール接続を作成します。

createProxyConnection()

プロキシ接続を作成します。

getBusyConnections()

接続プール内のビジー接続数を戻します。

getIncrConnections()

接続プール内の増分接続数を戻します。

getMaxConnections()

接続プール内の最大接続数を戻します。

getMinConnections()

接続プール内の最小接続数を戻します。

getOpenConnections()

接続プール内のオープン接続数を戻します。

getPoolName()

接続プールの名前を戻します。

getStmtCacheSize()

文キャッシュのサイズを取得します。

getTimeOut()

接続プール内の接続のタイムアウト間隔を戻します。

setErrorOnBusy()

接続プールの全接続がビジーで、それ以上の接続をオープンできない場合に、SQLExceptionが生成されるように指定します。

setPoolSize()

接続プールについて、最小、最大および増分のプール接続数を設定します。

setStmtCacheSize()

文キャッシュを有効化または無効化します。

setTimeOut()

接続プール内の接続のタイムアウト間隔を秒数で設定します。

terminateConnection()

接続を破棄します。

createConnection()

プール接続を作成します。

構文

説明

Connection* createConnection(
const string &userName,
const string &password)=0;

プール接続を作成します。userNameとpasswordの両方がNULLの場合、接続は外部認証されます。

Connection* createConnection(
const UString &username,
const UString &password)=0;

グローバリゼーション対応のプール接続を作成します。

パラメータ

説明

userName

接続に使用するユーザー名を指定します。

password

ユーザーのパスワードを指定します。

createProxyConnection()

接続プールからプロキシ接続を作成します。

構文

説明

Connection* createProxyConnection(
const string &name,
Connection::ProxyType
proxyType=Connection::PROXY_DEFAULT)=0;

プロキシ接続を作成します。

Connection* createProxyConnection(
const UString &name,
Connection::ProxyType
proxyType=Connection::PROXY_DEFAULT)=0;

グローバリゼーション対応のプロキシ接続を作成します。

Connection* createProxyConnection(
const string &name,
string roles[],
int numRoles,
Connection::ProxyType
proxyType=Connection::PROXY_DEFAULT)=0;

複数のロール用のプロキシ接続を作成します。

Connection* createProxyConnection(
const UString &name,
string roles[],
unsigned int numRoles,
Connection::ProxyType
proxyType=Connection::PROXY_DEFAULT)=0;

複数のロール用のグローバリゼーション対応プロキシ接続を作成します。

パラメータ

説明

name

接続するユーザー名を指定します。

roles

データベース・サーバー上でアクティブにするロールを指定します。

numRoles

データベース・サーバー上でアクティブにするロール数を指定します。

proxyType

実行するプロキシ認証の種類を指定します。ProxyTypeの定義は、表13-11を参照してください。次の値が有効です。

- PROXY_DEFAULTは、データベース・ユーザー名を示します。

getBusyConnections()

接続プール内のビジー接続数を戻します。データベース常駐接続プーリングを使用する場合、この数値は、接続ブローカへの永続的な接続の数となります。

構文

unsigned int getBusyConnections() const=0;

getIncrConnections()

接続プール内の増分接続数を戻します。データベース常駐接続プーリングを使用する場合、この数値は、接続ブローカへの永続的な接続の数となります。

構文

unsigned int getIncrConnections() const=0;

getMaxConnections()

接続プール内の最大接続数を戻します。データベース常駐接続プーリングを使用する場合、この数値は、接続ブローカへの永続的な接続の数となります。

構文

unsigned int getMaxConnections() const=0;

getMinConnections()

接続プール内の最小接続数を戻します。データベース常駐接続プーリングを使用する場合、この数値は、接続ブローカへの永続的な接続の数となります。

構文

unsigned int getMinConnections() const=0;

getOpenConnections()

接続プール内のオープン接続数を戻します。データベース常駐接続プーリングを使用する場合、この数値は、接続ブローカへの永続的な接続の数となります。

構文

unsigned int getOpenConnections() const=0;

getPoolName()

接続プールの名前を戻します。

構文

string getPoolName() const=0;

getStmtCacheSize()

文キャッシュのサイズを取得します。

構文

unsigned int getStmtCacheSize() const=0;

getTimeOut()

接続プール内の接続のタイムアウト間隔を戻します。

構文

unsigned int getTimeOut() const=0;

setErrorOnBusy()

接続プールの全接続がビジーで、それ以上の接続をオープンできない場合に、SQLExceptionが生成されるように指定します。

構文

void setErrorOnBusy()=0;

setPoolSize()

接続プールについて、最小、最大および増分のプール接続数を設定します。

構文

void setPoolSize(
unsigned int minConn = 0,
unsigned int maxConn = 1,
unsigned int incrConn = 1)=0;

パラメータ

説明

minConn

接続プールの最小接続数を指定します。

maxConn

接続プールの最大接続数を指定します。

incrConn

接続プールの増分接続数を指定します。

setStmtCacheSize()

文キャッシュを有効化または無効化します。0 (ゼロ)以外の値を指定すると、指定したサイズのキャッシュによる文キャッシュが有効化されます。値0 (ゼロ)を指定すると、キャッシュが無効化されます。

構文

void setStmtCacheSize(
unsigned int cacheSize)=0;

パラメータ

説明

cacheSize

文キャッシュのサイズを指定します。

setTimeOut()

接続プール内の接続のタイムアウト間隔を設定します。OCCIは、アイドル時間が指定タイムアウト間隔を超えている、この接続プールに関連している接続を、すべて終了します。

この属性が設定されていない場合、プール領域が必要になると、最も以前に使用されたセッションがタイムアウトになります。Oracleでは、プールにセッションを解放する際に、タイムアウトのセッションの有無のみをチェックします。

構文

void setTimeOut(
unsigned int connTimeOut = 0)=0;

パラメータ

説明

connTimeOut

タイムアウト間隔を秒数で指定します。

terminateConnection()

プール接続またはプロキシ接続を終了します。

構文

void terminateConnection(
Connection *connection)=0;

パラメータ

説明

connection

終了するプール接続またはプロキシ接続を指定します。

Consumerクラス

ConsumerクラスはMessageのデキューをサポートし、デキュー・オプションを制御します。

表13-14 Consumerクラスで使用される列挙値

属性

オプション

DequeMode

- DEQ_BROWSEは、ロックを取得せずにメッセージを読み込むことを示します。SELECTと等価です。

- DEQ_LOCKEDは、メッセージを読み込むことを示します。その書込みロックを取得します。このロックはトランザクションの存続期間中は継続します。SELECT FOR UPDATEと等価です。

- DEQ_REMOVEは、メッセージを読み込むことを示します。メッセージを更新または削除します。メッセージは、保存プロパティに基づいてキュー表に保持できます。これは、デフォルト設定です。

- DEQ_REMOVE_NODATAは、メッセージの受信者を確認するが、実際の内容は配信されないことを示します。

Navigation

- DEQ_FIRST_MSGは、検索基準に一致する最初に使用可能なメッセージをキューから取り出す必要があることを示します。キューの初めに位置をリセットします。

- DEQ_NEXT_TRANSACTIONは、検索基準に一致する次に使用可能なメッセージをキューから取り出す必要があることを示します。前のメッセージがメッセージ・グループに属している場合、AQは、そのメッセージ・グループに属していて検索基準と一致する、次に使用可能なメッセージを取り出します。これは、デフォルト設定です。

- DEQ_NEXT_MSGは、現行トランザクション・グループに残りがあってもスキップすることを示します。次のトランザクション・グループの最初のメッセージを取得します。このオプションを使用できるのは、現行のキューに対してメッセージのグループ化が有効になっている場合のみです。

Visibility

- DEQ_IMMEDIATEは、デキューされたメッセージを現行のトランザクションの一部にしないことを示します。独自のトランザクションを構成します。

- DEQ_ON_COMMITは、デキューを現行のトランザクションの一部にすることを示します。これは、デフォルト設定です。

DequeWaitOption

- DEQ_WAIT_FOREVERは、コンシューマが特に期限を設けずにMessageを待機することを示します。

- DEQ_NO_WAITは、キューにメッセージがない場合は待機が行われないことを示します。

表13-15 Consumerメソッドの概要

メソッド

説明

Consumer()

Consumerクラスのコンストラクタです。

getConsumerName()

Consumerの名前を取得します。

getCorrelationId()

デキューするメッセージの相関識別子を取得します。

getDequeueMode()

Consumerのデキュー・モードを取得します。

getMessageIdToDequeue()

デキューされるメッセージのIDを取得します。

getQueueName()

コンシューマで使用するキューの名前を取得します。

getPositionOfMessage()

デキューされるメッセージの位置を取得します。

getTransformation()

Messageのデキュー前に適用された変換を取得します。

getVisibility()

デキュー操作のトランザクション動作を取得します。

getWaitTime()

検索基準と一致するMessageを待機するときの、Consumerの指定の動作を取得します。

isNull()

ConsumerオブジェクトがNULLかどうかをテストします。

operator=()

Consumerクラスの代入演算子です。

receive()

Messageを受信してデキューします。

setAgent()

コンシューマのAgentの名前とアドレス（キュー名）を設定します。

setConsumerName()

Consumerの名前を設定します。

setCorrelationId()

デキューされるメッセージの相関識別子を指定します。

setDequeueMode()

デキューに関連付けられているロック動作を指定します。

setMessageIdToDequeue()

デキューするMessageの識別子を指定します。

setNull()

ConsumerをNULLに設定します。このオブジェクトに関連付けられているメモリーを解放します。

setPositionOfMessage()

取得するMessageの位置を指定します。

setQueueName()

Messageをデキューする前にキューの名前を指定します。

setTransformation()

Messageのデキュー前に適用される変換を指定します。

setVisibility()

Messageを現行のトランザクションの一部としてデキューする必要があるかどうかを指定します。

setWaitTime()

基準と一致するMessageがない場合の待機条件を指定します。

Consumer()

Consumerクラスのコンストラクタです。

構文

説明

Consumer(
const Connection *conn);

指定したConnectionハンドルを使用して新規のConsumerオブジェクトを作成します。

Consumer(
const Connection *conn
const Agent& agent);

指定したConnectionと指定したAgentのプロパティを使用して、新規のConsumerオブジェクトを作成します。

Consumer(
const Connection *conn,
const string& queue);

指定したConnectionとキューを使用して新規のConsumerオブジェクトを作成します。

Consumer(
const Consumer& consumer);

コピー・コンストラクタです。

パラメータ

説明

conn

Consumerの作成に使用する接続を指定します。

agent

Consumerに割り当てるエージェントを指定します。

queue

Consumerがメッセージを取り出すキューを指定します。

consumer

オリジナルのConsumerオブジェクトです。

getConsumerName()

Consumerの名前を取得します。

構文

string getConsumerName() const;

getCorrelationId()

デキューするメッセージの相関識別子を取得します。

構文

string geCorrelationId() const;

getDequeueMode()

Consumerのデキュー・モードを取得します。DequeueModeの定義は、表13-14を参照してください。

構文

DequeueMode getDequeueMode() const;

getMessageIdToDequeue()

デキューされるメッセージのIDを取得します。

構文

Bytes getMessageToDequeue() const;

getPositionOfMessage()

デキューされるメッセージの位置またはナビゲーションを取得します。Navigationの定義は、表13-14を参照してください。

構文

Navigation getPositionOfMessage() const;

getQueueName()

コンシューマで使用するキューの名前を取得します。

構文

string getQueueName() const;

getTransformation()

Messageのデキュー前に適用された変換を取得します。

構文

string getTransformation() const;

getVisibility()

デキュー操作のトランザクション動作または可視性を取得します。Visibilityの定義は、表13-14を参照してください。

構文

Visibility getVisibility() const;

getWaitTime()

検索基準と一致するMessageを待機するときの、Consumerの指定の動作を取得します。DequeWaitOptionの定義は、表13-14を参照してください。

構文

DequeWaitOption getWaitTime() const;

isNull()

ConsumerオブジェクトがNULLかどうかをテストします。ConsumerオブジェクトがNULLの場合はTRUEを、それ以外の場合はFALSEを戻します。

構文

bool isNull() const;

operator=()

Consumerクラスの代入演算子です。

構文

void operator=(
const Consumer& consumer);

パラメータ

説明

consumer

オリジナルのConsumerです。

receive()

Messageを受信してデキューします。

構文

Message receive(
Message::PayloadType pType,
const string& type="",
const string& schema="");

パラメータ

説明

pType

受信するペイロードの型を指定します。ペイロードの型の定義は、表13-14を参照してください。

type

typeがOBJECTの場合の、ペイロードの型を指定します。

schema

型が定義されているスキーマを指定します（pTypeがOBJECTの場合）。

setAgent()

コンシューマのAgentの名前とアドレス（キュー名）を設定します。

構文

void setAgent(
const Agent& agent);

パラメータ

説明

agent

Agentの名前を指定します。

setConsumerName()

Consumerの名前を設定します。コンシューマ名が一致するメッセージにのみアクセスできます。キューが複数のコンシューマ用に設定されていない場合は、このオプションをNULLに設定する必要があります。

構文

void setConsumerName(
const string& name);

パラメータ

説明

name

Consumerの名前を指定します。

setCorrelationId()

デキューされるメッセージの相関識別子を指定します。パーセント記号（%）やアンダースコア（_）など、特殊なパターン一致文字を使用できます。複数のメッセージがパターンと一致する場合、デキュー順序は不定になります。

構文

void setCorrelationId
const string& id);

パラメータ

説明

id

Messageの識別子を指定します。

setDequeueMode()

デキューに関連付けられているロック動作を指定します。

構文

void setDequeueMode(
DequeueMode mode);

パラメータ

説明

mode

エンキュー動作を指定します。DequeModeの定義は、表13-14を参照してください。

setMessageIdToDequeue()

デキューするMessageの識別子を指定します。

構文

void setMessageIdToDequeue(
const Bytes& msgid);

パラメータ

説明

msgid

デキューするMessageの識別子を指定します。

setNull()

ConsumerをNULLに設定します。このオブジェクトに関連付けられているメモリーを解放します。

構文

void setNull();

setPositionOfMessage()

取得するMessageの位置を指定します。

構文

void setPositionOfMessage(
Navigation pos);

パラメータ

説明

pos

メッセージの位置、Navigationの定義は、表13-14を参照してください。

setQueueName()

Messageのデキュー前にキューの名前を指定します。通常は、同じキューから複数のメッセージをデキューする場合に使用します。

構文

void setQueueName(
const string& queue);

パラメータ

説明

queue

データベース内で有効なキューの名前を指定します。

setTransformation()

Messageのデキュー前に適用される変換を指定します。

構文

void setTransformation(
string &fName);

パラメータ

説明

fName

SQL変換関数を指定します。

setVisibility()

Messageを現行のトランザクションの一部としてデキューする必要があるかどうかを指定します。DEQ_BROWSEモードの場合、可視性パラメータは無視されます。

構文

void setVisibility(
Visibility option);

パラメータ

説明

option

設定するVisibilityオプションの定義は、表13-14を参照してください。

setWaitTime()

基準と一致するMessageがない場合の待機条件を指定します。同じグループのメッセージをデキューする場合、waitパラメータは無視されます。

構文

void setWaitTime(
DequeWaitOption wait);

パラメータ

説明

wait

待機条件を指定します。DequeWaitOptionの定義は、表13-14を参照してください。

Dateクラス

Dateクラスは、SQL DATEデータ項目の抽象化を指定します。また、Dateクラスは、書式操作と解析操作を追加して、日付値のOCCIエスケープ構文をサポートします。

SQL標準DATEはOracle Dateのサブセットであるため、このクラスはこの両方をサポートするために使用できます。

Dateクラスのオブジェクトは、クライアント側の数値計算ではスタンドアロン・クラス・オブジェクトとして使用できます。また、データベースからのフェッチおよびデータベースへの設定にも使用できます。

例13-5 データベースからDate値を取得し、スタンドアロン計算に使用する方法

次の例では、データベースから取り出されたDate列値、Dateオブジェクトを使用したバインド、およびスタンドアロンDateオブジェクトを使用した計算が示されています。

/* Create a connection */
Environment *env = Environment::createEnvironment(Environment::DEFAULT);
Connection *conn = Connection(user, passwd, db);

/* Create a statement and associate a DML statement to it */
string sqlStmt = "SELECT job-id, start_date from JOB_HISTORY
where end_date = :x";
Statement *stmt = conn->createStatement(sqlStmt);

/* Create a Date object and bind it to the statement */
Date edate(env, 2000, 9, 3, 23, 30, 30);
stmt->setDate(1, edate);
ResultSet *rset = stmt->executeQuery();

/* Fetch a date from the database */
while(rset->next())
{
Date sd = rset->getDate(2);
Date temp = sd;    /*assignment operator */
/* Methods on Date */
temp.getDate(year, month, day, hour, minute, second);
temp.setMonths(2);
IntervalDS inter = temp.daysBetween(sd);
.
.
}

表13-16 Dateメソッドの概要

メソッド

概要

Date()

Dateクラスのコンストラクタです。

addDays()

n日を追加したDateオブジェクトを戻します。

addMonths()

nか月を追加したDateオブジェクトを戻します。

daysBetween()

現行のDateオブジェクトと指定した日付の間の日数を戻します。

fromBytes()

Dateオブジェクトの外部Bytes表現をDateオブジェクトに変換します。

fromText()

指定されたフォーマットとNLSパラメータを使用して、日付を所定の入力文字列から変換します。

getDate()()

Dateオブジェクトの日付と時刻のコンポーネントを戻します。

getSystemDate()

システム日付の入ったDateオブジェクトを戻します。

isNull()

DateがNULLの場合はTRUEを、それ以外の場合はFALSEを戻します。

lastDay()

月の最終日のDateを戻します。

nextDay()

翌日の曜日のDateを戻します。

operator=()

日付の値を別の日付に割り当てます。

operator==()

aとbが同じ場合はTRUEを、それ以外の場合はFALSEを戻します。

operator!=()

aとbが同じでない場合はTRUEを、それ以外の場合はFALSEを戻します。

operator>()

aがbより後の場合はTRUEを、それ以外の場合はFALSEを戻します。

operator>=()

aがb以後の場合はTRUEを、それ以外の場合はFALSEを戻します。

operator=()

aがbより前の場合はTRUEを、それ以外の場合はFALSEを戻します。

operator>()

aがb以前の場合はTRUEを、それ以外の場合はFALSEを戻します。

setDate()

入力された日付コンポーネントから日付を設定します。

setNull()

オブジェクトの状態をNULLに設定します。

toBytes()

Dateオブジェクトを外部Bytes表現に変換します。

toText()

Dateオブジェクトを文字列として戻します。

toZone()

あるタイム・ゾーンから別のタイム・ゾーンに変換されたDateオブジェクトを戻します。

Date()

Dateクラスのコンストラクタです。

構文

説明

Date();

NULLのDateオブジェクトを作成します。

Date(
const Date &srcDate);

Dateオブジェクトのコピーを作成します。

Date(
const Environment *envp,
int year = 1,
unsigned int month = 1,
unsigned int day = 1,
unsigned int hour = 0,
unsigned int minute = 0,
unsigned int seconds = 0);

整数パラメータを使用してDateオブジェクトを作成します。

パラメータ

説明

year

0を除いた-4712〜9999

month

1〜12

day

1〜31

minutes

0〜59

seconds

0〜59

addDays()

指定した日数をDateオブジェクトに追加して、新しい日付を戻します。

構文

Date addDays(
int val) const;

パラメータ

説明

val

現行のDateオブジェクトに追加する日数を指定します。

addMonths()

指定した月数をDateオブジェクトに追加して、新しい日付を戻します。

構文

Date addMonths(
int val) const;

パラメータ

説明

val

現行のDateオブジェクトに追加する月数を指定します。

daysBetween()

現行のDateオブジェクトと指定した日付の間の日数を戻します。

構文

IntervalDS daysBetween(
const Date &date) const;

パラメータ

説明

date

間の日数を計算するために使用する日付を指定します。

fromBytes()

BytesオブジェクトをDateオブジェクトに変換します。

構文

void fromBytes(
const Bytes &byteStream,
const Environment *envp = NULL);

パラメータ

説明

byteStream

Bytes形式の外部書式での日付を指定します。

envp

OCCI環境を指定します。

fromText()

DateオブジェクトをstringまたはUStringが表す値に設定します。

値はfmtおよびnlsParamパラメータに基づいて解析されます。nlsParamが渡されない場合は、envpパラメータのグローバリゼーション・サポート設定が使用されます。

関連項目
TO_DATEの詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

構文

説明

void fromText(
const string &datestr,
const string &fmt = "",
const string &nlsParam = "",
const Environment *envp = NULL);

Dateオブジェクトをstringが表す値に設定します。

void fromText(
const UString &datestr,
const UString &fmt,
const UString &nlsParam,
const Environment *envp = NULL);

DateオブジェクトをUStringが表す値に設定します。これはグローバリゼーション対応の場合です。

パラメータ

説明

envp

OCCI環境を指定します。

datestr

Dateオブジェクトに変換する日付文字列を指定します。

fmt

書式文字列を指定します。デフォルトはDD-MON-YYです。

nlsParam

NLSパラメータ文字列を指定します。nlsParamが指定されている場合は、この指定によって、変換に使用されるNLSパラメータが決まります。nlsParamが指定されていない場合は、NLSパラメータがenvpから選択されます。

getDate()

日付を年、月、日、時、分および秒の日付コンポーネントのフォームで戻します。

構文

void getDate(
int &year,
unsigned int &month,
unsigned int &day,
unsigned int &hour,
unsigned int &min,
unsigned int &seconds) const;

パラメータ

説明

year

日付の年のコンポーネントを指定します。

month

日付の月のコンポーネントを指定します。

day

日付の日のコンポーネントを指定します。

hour

日付の時のコンポーネントを指定します。

min

日付の分のコンポーネントを指定します。

seconds

日付の秒のコンポーネントを指定します。

getSystemDate()

システム日付を戻します。

構文

static Date getSystemDate(
const Environment *envp);

パラメータ

説明

envp

システム日付が戻される環境を指定します。

isNull()

DateがNULLかどうかをテストします。DateがNULLの場合はTRUEを、それ以外の場合はFALSEを戻します。

構文

bool isNull() const;

lastDay()

現在の月の最終日を示す日付を戻します。

構文

Date lastDay() const;

nextDay()

指定した曜日の翌日を示す日付を戻します。

関連項目
TO_DATEの詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

構文

説明

Date nextDay(
const string &dow) const;

指定した曜日の翌日を示す日付を戻します。

Date nextDay(
const UString &dow) const;

指定した曜日の翌日を示す日付を戻します。これはグローバリゼーション対応の場合です。パラメータには、日付の作成環境に関連付けられているキャラクタ・セットを使用する必要があります。

パラメータ

説明

dow

曜日を表す文字列を指定します。

operator=()

等号（=）の右側にある日付オブジェクトを、等号（=）の左側にある日付オブジェクトに割り当てます。

構文

Date& operator=(
const Date &d);

パラメータ

説明

date

割り当てる日付オブジェクトを指定します。

operator==()

指定した日付を比較します。2つの日付が等しい場合はTRUEを、それ以外の場合はFALSEを戻します。

構文

bool operator==(
const Date &first,
const Date &second);

パラメータ

説明

first

比較対象の最初の日付を指定します。

second

比較対象の第2の日付を指定します。

operator!=()

指定した日付を比較します。2つの日付が等しくない場合はTRUEを、それ以外の場合はFALSEを戻します。

構文

bool operator!=(
const Date &first,
const Date &second);

パラメータ

説明

first

比較対象の最初の日付を指定します。

second

比較対象の第2の日付を指定します。

operator>()

指定した日付を比較します。第1日付が第2日付より後の日付である場合はTRUEを、それ以外の場合はFALSEを戻します。どちらかの日付がNULLの場合はFALSEを戻します。2つの日付の種類が異なる場合は、FALSEを戻します。

構文

bool operator>(
const Date &first,
const Date &second);

パラメータ

説明

first

比較対象の最初の日付を指定します。

second

比較対象の第2の日付を指定します。

operator>=()

指定した日付を比較します。第1日付が第2日付以降の日付である場合はTRUEを、それ以外の場合はFALSEを戻します。どちらかの日付がNULLの場合はFALSEを戻します。2つの日付の種類が異なる場合は、FALSEを戻します。

構文

bool operator>=(
const Date &first,
const Date &second);

パラメータ

説明

first

比較対象の最初の日付を指定します。

second

比較対象の第2の日付を指定します。

operator<()

指定した日付を比較します。第1日付が第2日付より前の場合はTRUEを、それ以外の場合はFALSEを戻します。どちらかの日付がNULLの場合はFALSEを戻します。2つの日付の種類が異なる場合は、FALSEを戻します。

構文

bool operator<(
const Date &first,
const Date &second);

パラメータ

説明

first

比較対象の最初の日付を指定します。

second

比較対象の第2の日付を指定します。

operator<=()

指定した日付を比較します。第1日付が第2日付以前の日付である場合はTRUEを、それ以外の場合はFALSEを戻します。どちらかの日付がNULLの場合はFALSEを戻します。2つの日付の種類が異なる場合は、FALSEを戻します。

構文

bool operator<=(
const Date &first,
const Date &second);

パラメータ

説明

first

比較対象の最初の日付を指定します。

second

比較対象の第2の日付を指定します。

setDate()

日付を指定した値に設定します。

構文

void setDate(
int year = 1,
unsigned int month = 1,
unsigned int day = 1,
unsigned int hour = 0,
unsigned int minute = 0,
unsigned int seconds = 0);

パラメータ

説明

year

年の値を指定する引数を指定します。有効な値は、-4713〜9999です。

month

月の値を指定する引数を指定します。有効な値は、1〜12です。

day

日の値を指定する引数を指定します。有効な値は、1〜31です。

hour

時の値を指定する引数を指定します。有効な値は、0〜23です。

min

分の値を指定する引数を指定します。有効な値は、0〜59です。

seconds

秒の値を指定する引数を指定します。有効な値は、0〜59です。

setNull()

DateをアトミックNULLに設定します。

構文

void setNull();

toBytes()

日付をBytes表現で戻します。

構文

Bytes toBytes() const;

toText()

fmtとnlsParamを使用して日付書式化された値のstringまたはUStringを戻します。

値はfmtおよびnlsParamパラメータに基づいて解析されます。nlsParamが渡されない場合は、envpパラメータのグローバリゼーション・サポート設定が使用されます。

関連項目
TO_DATEの詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

構文

説明

string toText(
const string &fmt = "",
const string &nlsParam = "") const;

fmtとnlsParamを使用して日付書式化された値のstringを戻します。

UString toText(
const UString &fmt,
const UString &nlsParam) const;

fmtとnlsParamを使用して日付書式化された値のUStringを戻します。

パラメータ

説明

fmt

書式文字列を指定します。デフォルトはDD-MON-YYです。

nlsParam

NLSパラメータ文字列を指定します。nlsParamが指定されている場合は、この指定によって、変換に使用されるNLSパラメータが決まります。nlsParamが指定されていない場合は、NLSパラメータがenvpから選択されます。

toZone()

あるタイム・ゾーンから別のタイム・ゾーンに変換されたDate値を戻します。

構文

Date toZone(
const string &zone1,
const string &zone2) const;

パラメータ

説明

zone1

変換元タイム・ゾーンを表す文字列を指定します。

zone2

変換先タイム・ゾーンを表す文字列を指定します。

有効なタイム・ゾーン・コードは次のとおりです。

ゾーン・コード

値

AST、ADT

大西洋標準時または大西洋夏時間

BST、BDT

ベーリング標準時またはベーリング夏時間

CST、CDT

中部標準時または中部夏時間

EST、EDT

東部標準時または東部夏時間

GMT

グリニッジ標準時

HST、HDT

アラスカ・ハワイ標準時またはアラスカ・ハワイ夏時間

MST、MDT

山地標準時または山地夏時間

NST

ニューファンドランド標準時

PST、PDT

太平洋標準時または太平洋夏時間

YST、YDT

ユーコン標準時またはユーコン夏時間

Environmentクラス

Environmentクラスは、OCCIオブジェクトのメモリーやその他のリソースを管理するためのOCCI環境を提供します。

アプリケーションは複数のOCCI環境を保持できます。各環境ごとに、独自のヒープやスレッド・セーフティmutexを持つことができます。

表13-17 Environmentクラスで使用される列挙値

属性

オプション

Mode

- DEFAULTは、Environmentオブジェクトの作成に使用されます。スレッド・セーフティやオブジェクトはサポートしません。

- OBJECTは、Environmentオブジェクトの作成用です。オブジェクト機能を使用します。

- SHAREDは、Environmentオブジェクトの作成用です。

- NO_USERCALLBACKSは、Environmentオブジェクトの作成用です。ユーザー・コールバックはサポートしません。

- THREADED_MUTEXEDは、Environmentオブジェクト作成用のスレッド・セーフ・モードです。OCCIにより内部的にmutex化されます。

- THREADED_UNMUTEXEDは、Environmentオブジェクト作成用のスレッド・セーフ・モードです。クライアントがmutex化を受け持ちます。

- EVENTSは、Oracle Streams Advanced Queuingで使用されるイベント通知の登録をサポートします。

- USE_LDAPは、LDAPによる登録をサポートします。

表13-18 Environmentメソッドの概要

メソッド

概要

createConnection()

指定したデータベースへの接続を確立します。

createConnectionPool()

接続プールを作成します。

createEnvironment()

Environmentオブジェクトを作成します。

createStatelessConnectionPool()

ステートレスな接続プールを作成します。

enableSubscription()

サブスクリプション通知を有効化します。

disableSubscription()

サブスクリプション通知を無効化します。

getCacheMaxSize()

キャッシュの最大ヒープ・サイズを取り出します。

getCacheOptSize()

キャッシュの最適ヒープ・サイズを取り出します。

getCacheSortedFlush()

キャッシュ・ソート・フラグの設定を取り出します。

getClientVersion()

クライアント・ライブラリのバージョンを戻します。

getCurrentHeapSize()

現行の環境にあるすべてのオブジェクトに現在割り当てられているメモリー・サイズを戻します。

getLDAPAdminContext()

LDAPのオープン通知登録を使用する場合の管理コンテキストを戻します。

getLDAPAuthentication()

LDAPのオープン通知登録を使用する場合の認証モードを戻します。

getLDAPHost()

LDAPサーバーが稼働しているホストを戻します。

getLDAPPort()

LDAPサーバーがリスニングしているポートを戻します。

getMap()()

現行の環境のマップを戻します。

getOCIEnvironment()

現行の環境に関連付けられているOCI環境を戻します。

getXAConnection()

データベースへのXA接続を作成します。

getXAEnvironment()

XA Environmentオブジェクトを作成します。

releaseXAConnection()

getXAConnection()のコールにより割り当てられたリソースをすべて解放します。

releaseXAEnvironment()

getXAEnvironment()のコールにより割り当てられたリソースをすべて解放します。

setCacheMaxSize()

クライアント側オブジェクト・キャッシュの最大サイズを、最適サイズの率として指定します。

setCacheOptSize()

クライアント側オブジェクト・キャッシュの最適サイズをバイト単位で指定します。

setCacheSortedFlush()

フラッシュする前に表の順序でキャッシュをソートするかどうかを指定します。

setLDAPAdminContext()

LDAPクライアントの管理コンテキストを指定します。

setLDAPAuthentication()

LDAPの認証モードを指定します。

setLDAPHostAndPort()

LDAPサーバーのホストとポートを指定します。

setLDAPLoginNameAndPassword()

LDAPサーバーへの接続時のログイン名とパスワードを指定します。

terminateConnection()

接続プールをクローズし、関連しているすべてのリソースを解放します。

terminateConnectionPool()

接続プールをクローズし、関連しているすべてのリソースを解放します。

terminateEnvironment()

環境を破棄します。

terminateStatelessConnectionPool()

ステートレスな接続プールをクローズし、関連しているすべてのリソースを解放します。

createConnection()

このメソッドは、指定したデータベースへの接続を確立します。

構文

説明

Connection * createConnection(
const string &userName,
const string &password,
const string &connectString="")=0;

デフォルト接続を作成します。userNameとpasswordがNULLの場合、接続は外部認証できます。

Connection * createConnection(
const UString &userName,
const UString &password,
const UString &connectString)=0;

接続を作成します（Unicodeサポート）。クライアントのEnvironmentをOCCIUTIF16モードで初期化する必要があります。

Connection * createConnection(
const string &userName,
const string &password,
const string &connectString,
const string &connectionClass,
const Connection::Purity &purity)=0;

データベース常駐接続プーリングの接続を作成します。

Connection * createConnection(
const UString &userName,
const UString &password,
const UString &connectString,
const UString &connectionClass
const Connection::Purity &purity)=0;

データベース常駐接続プーリングの接続を作成します（Unicodeサポート）。クライアントのEnvironmentをOCCIUTIF16モードで初期化する必要があります。

パラメータ

説明

userName

接続に使用するユーザー名を指定します。

password

ユーザーのパスワードを指定します。

connectString

接続先データベースを指定します。

purity

データベース常駐接続プーリングで使用される接続の純正値を指定します。SELFまたはNEWのいずれかとなります。

connectionClass

データベース常駐接続プーリングで使用されるConnectionクラスを指定します。

createConnectionPool()

指定したパラメータに基づいて接続プールを作成します。

構文

説明

ConnectionPool* createConnectionPool(
const string &poolUserName,
const string &poolPassword,
const string &connectString = "",
unsigned int minConn = 0,
unsigned int maxConn = 1,
unsigned int incrConn = 1)=0;

デフォルト接続プールを作成します。

ConnectionPool* createConnectionPool(
const UString &poolUserName,
const UString &poolPassword,
const UString &connectString,
unsigned int minConn = 0,
unsigned int maxConn = 1,
unsigned int incrConn = 1)=0;

接続プールを作成します（Unicodeサポート）。クライアントのEnvironmentをOCCIUTIF16モードで初期化する必要があります。

パラメータ

説明

poolUserName

プールのユーザー名を指定します。

poolPassword

プールのパスワードを指定します。

connectString

サーバーの接続文字列を指定します。

minConn

プール内の最小接続数を指定します。このメソッドによって、この最小数の接続がオープンします。追加の接続は、必要な場合のみオープンします。通常、minConnは、アプリケーションで予定している同時実行文の数に設定する必要があります。

maxConn

プール内の最大接続数を指定します。有効な値は、1以上です。

incrConn

現行の接続数がmaxConnより少ない場合に、オープンする接続の増分数を指定します。有効な値は、1以上です。

createEnvironment()

Environmentオブジェクトを作成します。このオブジェクトは、setMemMgrFunctions()メソッドに指定されているメモリー管理関数を使用して作成されます。メモリー管理関数が指定されていない場合、OCCIはデフォルトの関数を使用します。最終的には、Environmentオブジェクトをクローズし、取得したシステム・リソースをすべて解放する必要があります。

指定したModeがTHREADED_MUTEXEDまたはTHREADED_UNMUTEXEDの場合、3種類のメモリー管理関数はすべてスレッド・セーフであることが必要です（表13-17の定義を参照）。

構文

説明

static Environment * createEnvironment(
Mode mode = DEFAULT,
void *ctxp = 0,
void *(*malocfp)(void *ctxp,
size_t size) = 0,
void *(*ralocfp)(void *ctxp,
void *memptr,
size_t newsize) = 0,
void (*mfreefp)(void *ctxp,
void *memptr) = 0);

デフォルト環境を作成します。

static Environment * createEnvironment(
const string &charset,
const string &ncharset,
Mode mode = DEFAULT,
void *ctxp = 0,
void *(*malocfp)(void *ctxp,
size_t size) = 0,
void *(*ralocfp)(void *ctxp,
void *memptr,
size_t newsize) = 0,
void (*mfreefp)(void *ctxp,
void *memptr) = 0);

指定したキャラクタ・セットIDとNCHARキャラクタ・セットIDを使用して環境を作成します（Unicodeサポート）。クライアントのEnvironmentをOCCIUTIF16モードで初期化する必要があります。

パラメータ

説明

mode

値はModeの一部として表13-17に定義されているDEFAULT、THREADED_MUTEXED、THREADED_UNMUTEXED、OBJECTです。

ctxp

ユーザー定義のメモリー管理関数のためのコンテキスト・ポインタを指定します。

size

ユーザー定義のメモリー割当て関数によって割り当てられるメモリーのサイズを指定します。

newsize

再割当てされるメモリーの新規サイズを指定します。

memptr

新規サイズに再割当てする必要のある既存のメモリーを指定します。

malocfp

ユーザー定義のメモリー割当て関数を指定します。

ralocfp

ユーザー定義のメモリー再割当て関数を指定します。

mfreefp

ユーザー定義のメモリー解放関数を指定します。

charset

NLS_LANGで指定したIDで置き換えるキャラクタ・セットIDを指定します。

ncharset

NLS_NCHARで指定したIDで置き換えるキャラクタ・セットIDを指定します。

createStatelessConnectionPool()

指定したプール属性を使用してStatelessConnectionPoolオブジェクトを作成します。

構文

説明

StatelessConnectionPool* createStatelessConnectionPool(
const string &poolUserName,
const string &poolPassword,
const string connectString="",
unsigned int maxConn=1,
unsigned int minConn=0,
unsigned int incrConn=1,
StatelessConnectionPool::PoolType
pType=StatelessConnectionPool::HETEROGENEOUS);

stringをサポートする場合です。

StatelessConnectionPool* createStatelessConnectionPool(
const UString &poolUserName,
const UString &poolPassword,
const UString &connectString,
unsigned int maxConn = 1,
unsigned int minConn = 0,
unsigned int incrConn = 1,
StatelessConnectionPool::PoolType
pType=StatelessConnectionPool::HETEROGENEOUS);

UStringをサポートする場合です。

パラメータ

説明

poolUserName

プールのユーザー名を指定します。

poolPassword

プールのパスワードを指定します。

connectString

サーバーの接続文字列を指定します。

maxConn

プール内でオープンできる最大接続数を指定します。それ以上はセッションをオープンできません。

minConn

プール内で最初に作成される接続の数を指定します。このパラメータが考慮されるのは、PoolTypeがHOMOGENEOUSに設定されている場合のみです(表13-41の定義を参照)。

incrConn

すべてのオープン接続がビジーの場合にプールの増分となる接続数を、maxConnパラメータで指定した最大オープン接続数の範囲内で指定します。このパラメータが考慮されるのは、PoolTypeがHOMOGENEOUSに設定されている場合のみです(表13-41の定義を参照)。

pType

接続プールのPoolTypeは、表13-41の定義を参照してください。

enableSubscription()

サブスクリプション通知を有効化します。

構文

void enableSubscription(
const aq::Subscription &sub);

パラメータ

説明

sub

サブスクリプションを指定します。

disableSubscription()

サブスクリプション通知を無効化します。

構文

void disableSubscription(
Subscription &subscr);

パラメータ

説明

subscr

サブスクリプションを指定します。

getCacheMaxSize()

キャッシュの最大サイズを取得します。

構文

unsigned int getCacheMaxSize() const;

getCacheOptSize()

キャッシュの最適ヒープ・サイズを取り出します。

構文

unsigned int getCacheOptSize() const;

getCacheSortedFlush()

キャッシュ・ソート・フラグの現在の設定（TRUEまたはFALSE）を取り出します。

構文

bool getCacheSortedFlush() const;

getCurrentHeapSize()

この環境のすべてのオブジェクトに現在割り当てられているメモリー・サイズを戻します。

構文

unsigned int getCurrentHeapSize() const;

getLDAPAdminContext()

LDAPのオープン通知登録を使用する場合の管理コンテキストを戻します。

構文

string getLDAPAdminContext() const;

getLDAPAuthentication()

LDAPのオープン通知登録を使用する場合の認証モードを戻します。

構文

unsigned int getLDAPAuthentication() const;

getLDAPHost()

LDAPサーバーが稼働しているホストを戻します。

構文

string getLDAPHost() const;

getLDAPPort()

LDAPサーバーがリスニングしているポートを戻します。

構文

unsigned int getLDAPPort() const;

getMap()

この環境のマップへのポインタを戻します。

構文

Map *getMap() const;

getOCIEnvironment()

この環境に関連付けられているOCI環境へのポインタを戻します。

構文

OCIEnv *getOCIEnvironment() const;

getXAConnection()

XAライブラリによりオープンされている、オブジェクトに対応するOCCI Connectionオブジェクトへのポインタを戻します。

構文

Connection* getXAConnection(
const string &dbname);

パラメータ

説明

dbname

データベース名を指定します。このデータベース名は、Open Stringに指定された（およびリソース・マネージャへの接続に使用される）オプションのdbnameと同じです。

getXAEnvironment()

XAライブラリによりオープンされているオブジェクトに対応するOCCI Environmentオブジェクトへのポインタを戻します。

構文

Environment *getXAEnvironment(
const string &dbname);

パラメータ

説明

dbname

データベース名を指定します。このデータベース名は、Open Stringに指定された（およびリソース・マネージャへの接続に使用される）オプションのdbnameと同じです。

releaseXAConnection()

getXAConnection()メソッドにより割り当てられたリソースをすべて解放/割当て解除します。

構文

void releaseXAConnection(
Connection* conn);

パラメータ

説明

conn

getXAConnection()メソッドから戻された接続を指定します。

releaseXAEnvironment()

getXAEnvironment()メソッドにより割り当てられたリソースをすべて解放/割当て解除します。

構文

void releaseXAEnvironment(
Environment* env);

パラメータ

説明

env

getXAEnvironment()メソッドから戻された環境を指定します。

setCacheMaxSize()

クライアント側オブジェクト・キャッシュの最大サイズを、最適サイズの率として設定します。デフォルト値は10%です。

構文

void setCacheMaxSize(
unsigned int maxSize);

パラメータ

説明

maxSize

最大サイズ値を率として指定します。

setCacheOptSize()

クライアント側オブジェクト・キャッシュの最適サイズをバイト単位で設定します。デフォルト値は8MBです。

構文

void setCacheOptSize(
unsigned int optSize);

パラメータ

説明

optSize

最適サイズ値をバイト単位で指定します。

setCacheSortedFlush()

キャッシュ・フラッシュ・プロトコルを設定します。デフォルト（flag=FALSE）では、キャッシュ内のオブジェクトは変更された順にフラッシュされます。サーバー側のパフォーマンスを改善するにはflag=TRUEに設定します。この設定では、クライアント・キャッシュ内のオブジェクトは、フラッシュされる前に表の順序でソートされます。

構文

void setCacheSortedFlush(
bool flag);

パラメータ

説明

flag

FALSE (デフォルト): ソートされません。TRUE: 表の順にソートされます。

setLDAPAdminContext()

クライアントの管理コンテキストを設定します。通常は、LDAPサーバーのOracle RDBMS LDAPスキーマのルートです。

構文

void setLDAPAdminContext(
const string &ctx);

パラメータ

説明

ctx

クライアントのコンテキストを指定します。

setLDAPAuthentication()

認証モードを指定します。現在サポートされている値は0x1、つまり簡易認証（ユーザー名/パスワード認証）のみです。

構文

void setLDAPAuthentication(
unsigned int mode);

パラメータ

説明

mode

認証モードを指定します。

setLDAPHostAndPort()

LDAPサーバーが稼働しているホストと、要求をリスニングしているポートを指定します。

構文

void setLDAPHostAndPort(
const string &host,
unsigned int port);

パラメータ

説明

host

LDAPのホストを指定します。

port

LDAPのポートを指定します。

setLDAPLoginNameAndPassword()

LDAPサーバーへの接続時に使用するログイン識別名とパスワードを指定します。

構文

void setLDAPLoginNameAndPassword(
const string &login,
const &passwd);

パラメータ

説明

login

ログイン名を指定します。

passwd

ログイン・パスワードを指定します。

terminateConnection()

環境への接続をクローズし、関連しているすべてのシステム・リソースを解放します。

構文

void terminateConnection(
Connection *connection);

パラメータ

説明

connection

終了する接続インスタンスへのポインタを指定します。

terminateConnectionPool()

接続プールの接続をクローズし、関連しているすべてのシステム・リソースを解放します。

構文

void terminateConnectionPool(
ConnectionPool *poolPointer);

パラメータ

説明

poolPointer

終了する接続プール・インスタンスへのポインタを指定します。

terminateEnvironment()

環境をクローズし、関連しているすべてのシステム・リソースを解放します。

構文

void terminateEnvironment(
Environment *env);

パラメータ

説明

env

クローズする環境を指定します。

terminateStatelessConnectionPool()

指定したStatelessConnectionPoolを破棄します。

構文

void termimnateStatelessConnectionPool(
StatelessConnectionPool* poolPointer,
StatelessConnectionPool::DestroyMode mode=StatelessConnectionPool::DEFAULT);

パラメータ

説明

poolPointer

破棄するStatelessConnectionPoolを指定します。

mode

表13-41に定義されているDestroyMode (DEFAULTまたはSPD_FORCE)を指定します。

IntervalDSクラス

IntervalDSクラスは、日、時、分、秒および小数秒での各時間隔計算をカプセル化したものです。先行フィールド精度は、日を入力する際の桁数によって決まります。小数秒精度は、入力時の小数桁数によって決まります。

表13-19 IntervalDSクラスのフィールド

フィールド

型

説明

day

int

日のコンポーネントを指定します。有効な値は、-10の9乗〜10の9乗です。

hour

int

時のコンポーネントを指定します。有効な値は、-23〜23です。

minute

int

分のコンポーネントを指定します。有効な値は、-59〜59です。

second

int

秒のコンポーネントを指定します。有効な値は、-59〜59です。

fs

int

小数秒のコンポーネントを指定します。NULLのIntervalDSオブジェクトが作成されます。NULLのintervalDSは、fromTextメソッドを割り当てるか、コールすることによって初期化できます。NULLのIntervalDSオブジェクトでコールできるメソッドは、setName()とisNull()です。

例13-6 直接割当てを使用した空のIntervalDSオブジェクトの使用方法

この例では、デフォルト・コンストラクタによるNULL値を作成し、日時時間隔にNULL以外の値を割り当て、それに基づいて操作を実行する方法が示されています。

Environment *env = Environment::createEnvironment();

// Create a NULL day-second interval
IntervalDS ds;
if(ds.isNull())
cout << "\n ds is null";

// Assign a non-NULL value to ds
IntervalDS anotherDS(env, "10 20:14:10.2");
ds = anotherDS;

// Now all operations on IntervalDS are valid
int DAY = ds.getDay();

例13-7 *Text()メソッドを使用した空のIntervalDSオブジェクトの使用方法

この例では、NULLの日時時間隔を作成してfromText()メソッドで初期化し、次に、+=演算子で日時時間隔に追加し、*演算子を使用して乗算した後で、2つの日時時間隔を比較し、一方の日時時間隔をtoTextメソッドで文字列に変換する方法が示されています。

Environment *env = Environment::createEnvironment();

// Create a null day-second interval
IntervalDS ds1

// Initialize a null day-second interval by using the fromText method
ds1.fromText("20 10:20:30.9","",env);

IntervalDS addWith(env,2,1);
ds1 += addWith;    //call += operator

IntervalDS mulDs1=ds1 * Number(env,10);
//call * operator
if(ds1==mulDs1)    //call == operator
.
.
string strds=ds1.toText(2,4);                       //2 is leading field precision
//4 is the fractional field precision

表13-20 IntervalDSメソッドの概要

メソッド

概要

IntervalDS()

IntervalDSクラスのコンストラクタです。

fromText()

stringから変換されたIntervalDSを戻します。

fromUText()

UStringから変換されたIntervalDSを戻します。

getDay()

日の時間隔値を戻します。

getHour()

小数秒の時間隔値を戻します。

getFracSec()

時の時間隔値を戻します。

getMinute()

分の時間隔値を戻します。

getSecond()

秒の時間隔値を戻します。

isNull()

IntervalDSがNULLの場合はtrueを、それ以外の場合はfalseを戻します。

operator*()

2つのIntervalDS値の積を戻します。

operator*=()

乗算による割当てを行います。

operator=()

単純割当てを行います。

operator==()

aとbが等しいかどうかをチェックします。

operator!=()

aとbが等しくないかどうかをチェックします。

operator/()

IntervalDSを(a / b)の値で戻します。

operator/=()

除算による割当てを行います。

operator>()

aがbを超えているかどうかをチェックします。

operator>=()

aがb以上かどうかをチェックします。

operator<()

aがb未満かどうかをチェックします。

operator<=()

aがb以下かどうかをチェックします。

operator-()

IntervalDSを（a - b）の値で戻します。

-=

減算による割当てを行います。

operator+()

2つのIntervalDS値の合計を戻します。

operator+=()

加算による割当てを行います。

set()

日時時間隔を設定します。

setNull()

日時時間隔をNULLに設定します。

toText()

時間隔をstring表現に変換します。

toUText()

時間隔をUString表現に変換します。

IntervalDS()

IntervalDSクラスのコンストラクタです。

構文

説明

IntervalDS();

NULLのIntervalDSオブジェクトが作成されます。NULLのIntervalDSは、fromTextメソッドを割り当てるか、コールすることによって初期化できます。NULLのIntervalDSオブジェクトでコールできるメソッドは、setName()とisNull()です。

IntervalDS(
const Environment *env,
int day = 0,
int hour = 0,
int minute = 0,
int second = 0,
int fs = 0);

指定されたEnvironment内でIntervalDSオブジェクトを構成します。

IntervalDS(
const IntervalDS &src);

srcからIntervalYMオブジェクトが作成されます。

パラメータ

説明

env

Environmentを指定します。

day

IntervalDSのdayフィールドを指定します。

hour

IntervalDSのhourフィールドを指定します。

minute

IntervalDSのminuteフィールドを指定します。

second

IntervalDSのsecondフィールドを指定します。

fs

IntervalDSのfsフィールドを指定します。

src

IntervalDSオブジェクトのコピー元を指定します。

fromText()

指定した文字列から時間隔を作成します。文字列は、関連する環境に関連付けられているnlsパラメータを使用して変換されます。nlsパラメータはenvから選択されます。envがNULLの場合は、nlsパラメータがインスタンスに関連付けられている環境から選択されます（関連付けられている場合）。

構文

void fromText(
const string &inpstr,
const string &nlsParam = "",
const Environment *env = NULL);

パラメータ

説明

inpstr

日時時間隔を示す、'10 20:14:10.2'などの'日 時:分:秒'形式の文字列を指定します。

nlsParam

NLSパラメータ文字列を指定します。nlsParamが指定されている場合は、この指定によって、変換に使用されるNLSパラメータが決まります。nlsParamが指定されていない場合は、NLSパラメータがenvpから選択されます。

env

NLSパラメータが使用される環境を指定します。

fromUText()

指定したUStringから時間隔を作成します。

構文

void fromUText(
const UString &inpstr,
const Environment *env=NULL );

パラメータ

説明

inpstr

日時時間隔を示す、'10 20:14:10.2'などの'日 時:分:秒'形式のUStringを指定します。

env

Environmentを指定します。

getDay()

時間隔の日要素を戻します。

構文

int getDay() const;

getFracSec()

時間隔の小数秒要素を戻します。

構文

int getFracSec() const;

getHour()

時間隔の時要素を戻します。

構文

int getHour() const;

getMinute()

時間隔の分要素を戻します。

構文

int getMinute() const;

getSecond()

時間隔の秒要素を戻します。

構文

int getSecond() const;

isNull()

時間隔がNULLかどうかをテストします。時間隔がNULLの場合はTRUEを、それ以外の場合はFALSEを戻します。

構文

bool isNull() const;

operator*()

時間隔に指定の値を乗算し、その結果を戻します。

構文

const IntervalDS operator*(
const IntervalDS &interval,
const Number &val);

パラメータ

説明

interval

乗算する時間隔を指定します。

val

時間隔に乗算する値を指定します。

operator*=()

IntervalDSとaの積をIntervalDSに割り当てます。

構文

IntervalDS& operator*=(
const IntervalDS &factor);

パラメータ

説明

factor

日時時間隔を指定します。

operator=()

指定された値を時間隔に割り当てます。

構文

IntervalDS& operator=(
const IntervalDS &src);

パラメータ

説明

src

割り当てる値を指定します。

operator==()

指定した2つの時間隔を比較します。2つの時間隔が等しい場合はTRUEを、それ以外の場合はFALSEを戻します。いずれかの時間隔がNULLの場合はSQLExceptionが発生します。

構文

bool operator==(
const IntervalDS &first,
const IntervalDS &second);

パラメータ

説明

first

比較対象の最初の時間隔を指定します。

second

比較対象の第2の時間隔を指定します。

operator!=()

指定した2つの時間隔を比較します。2つの時間隔が等しくない場合はTRUEを、それ以外の場合はFALSEを戻します。いずれかの時間隔がNULLの場合はSQLExceptionが発生します。

構文

bool operator!=(
const IntervalDS &first,
const IntervalDS &second);

パラメータ

説明

first

比較対象の最初の時間隔を指定します。

second

比較対象の第2の時間隔を指定します。

operator/()

時間隔を定数値で除算した結果を戻します。

構文

const IntervalDS operator/(
const IntervalDS &dividend,
const Number &factor);

パラメータ

説明

dividend

被除数の時間隔を指定します。

factor

時間隔を除算する値を指定します。

operator/=()

IntervalDSとvalの商をIntervalDSに割り当てます。

構文

IntervalDS& operator/=(
const IntervalDS &factor);

パラメータ

説明

factor

日時時間隔を指定します。

operator>()

指定した2つの時間隔を比較します。第1の時間隔が第2の時間隔より長い場合はTRUEを、それ以外の場合はFALSEを戻します。いずれかの時間隔がNULLの場合はSQLExceptionが発生します。

構文

bool operator>(
const IntervalDS &first,
const IntervalDS &second);

パラメータ

説明

first

比較対象の最初の時間隔を指定します。

second

比較対象の第2の時間隔を指定します。

operator>=()

指定した2つの時間隔を比較します。第1の時間隔が第2の時間隔以上の長さの場合はTRUEを、それ以外の場合はFALSEを戻します。いずれかの時間隔がNULLの場合はSQLExceptionが発生します。

構文

bool operator>=(
const IntervalDS &first,
const IntervalDS &first);

パラメータ

説明

first

比較対象の最初の時間隔を指定します。

second

比較対象の第2の時間隔を指定します。

operator<()

指定した2つの時間隔を比較します。第1の時間隔が第2の時間隔より短い場合はTRUEを、それ以外の場合はFALSEを戻します。いずれかの時間隔がNULLの場合はSQLExceptionが発生します。

構文

bool operator<(
const IntervalDS &first,
const IntervalDS &second);

パラメータ

説明

first

比較対象の最初の時間隔を指定します。

second

比較対象の第2の時間隔を指定します。

operator<=()

指定した2つの時間隔を比較します。第1の時間隔が第2の時間隔以下の長さの場合はTRUEを、それ以外の場合はFALSEを戻します。いずれかの時間隔がNULLの場合はSQLExceptionが発生します。

構文

bool operator<=(
const IntervalDS &first,
const IntervalDS &second);

パラメータ

説明

first

比較対象の最初の時間隔を指定します。

second

比較対象の第2の時間隔を指定します。

operator-()

firstとsecondの2つの時間隔の差を戻します。

構文

const IntervalDS operator-(
const IntervalDS &first,
const IntervalDS &second);

パラメータ

説明

first

比較対象の最初の時間隔を指定します。

second

比較対象の第2の時間隔を指定します。

operator-=()

IntervalDSとvalの差をIntervalDSに割り当てます。

構文

IntervalDS& operator-=(
const IntervalDS &val);

パラメータ

説明

val

日時時間隔を指定します。

operator+()

指定された時間隔の和を戻します。

構文

const IntervalDS operator+(
const IntervalDS &first,
const IntervalDS &second);

パラメータ

説明

first

比較対象の最初の時間隔を指定します。

second

比較対象の第2の時間隔を指定します。

operator+=()

IntervalDSとvalの和をIntervalDSに割り当てます。

構文

IntervalDS& operator+=(
const IntervalDS &val);

パラメータ

説明

val

日時時間隔を指定します。

set()

時間隔を指定した値に設定します。

構文

void set(
int day,
int hour,
int minute,
int second,
int fracsec);

パラメータ

説明

day

日のコンポーネントを指定します。

hour

時のコンポーネントを指定します。

min

分のコンポーネントを指定します。

second

秒のコンポーネントを指定します。

fracsec

小数秒のコンポーネントを指定します。

setNull()

IntervalDSをNULLに設定します。

構文

void setNull();

toText()

時間隔をstring表現に変換します。

構文

string toText(
unsigned int lfprec,
unsigned int fsprec,
const string &nlsParam = "") const;

パラメータ

説明

lfprec

先行フィールド精度を指定します。

fsprec

小数秒の精度を指定します。

nlsParam

NLSパラメータ文字列を指定します。nlsParamが指定されている場合は、この指定によって、変換に使用されるNLSパラメータが決まります。nlsParamが指定されていない場合は、NLSパラメータがenvpから選択されます。

toUText()

時間隔をUString表現に変換します。

構文

UString toUText(
unsigned int lfprec,
unsigned int fsprec) cosnt;

パラメータ

説明

lfprec

先行フィールド精度を指定します。

fsprec

小数秒の精度を指定します。

IntervalYMクラス

IntervalYMは、SQLの年月時間隔標準データ型をサポートしています。

先行フィールド精度は、入力時の桁数によって決まります。

表13-21 IntervalYMクラスのフィールド

フィールド

型

説明

year

int

年のコンポーネントを指定します。有効な値は、-10の9乗〜10の9乗です。

month

int

月のコンポーネントを指定します。有効な値は、-11〜11です。

例13-8 直接割当てを使用した空のIntervalYMオブジェクトの使用方法

この例では、デフォルト・コンストラクタによるNULL値の作成、年月時間隔にNULL以外の値を割り当て、それに基づいて操作を実行する方法が示されています。

Environment *env = Environment::createEnvironment();

// Create a NULL year-month interval
IntervalYM ym
if(ym.isNull())
cout << "\n ym is null";

// Assign a non-NULL value to ym
IntervalYM anotherYM(env, "10-30");
ym=anotherYM;

// Now all operations on YM are valid
int yr = ym.getYear();

例13-9 ResultSetおよびtoText()メソッドを使用したIntervalYMオブジェクトの使用方法

この例では、結果セットから年月時間隔の列を取得し、+=演算子を使用して年月時間隔に追加し、次に、*演算子を使用して乗算して、2つの年月時間隔を比較し、その後、一方の年月時間隔をtoTextメソッドで文字列に変換する方法が示されています。

//SELECT WARRANT_PERIOD from PRODUCT_INFORMATION
//obtain result set
resultset->next();

//get interval value from resultset
IntervalYM ym1 = resultset->getIntervalYM(1);

IntervalYM addWith(env, 10, 1);
ym1 += addWith;    //call += operator

IntervalYM mulYm1 = ym1 * Number(env, 10);    //call * operator
if(ym1<mulYm1)    //comparison
.
.
string strym = ym1.toText(3);    //3 is the leading field precision

表13-22 IntervalYMメソッドの概要

メソッド

概要

IntervalYM()

IntervalYMクラスのコンストラクタです。

fromText()

stringをIntervalYMに変換します。

fromUText()

UStringをIntervalYMに変換します。

getMonth()

月の時間隔値を戻します。

getYear()

年の時間隔値を戻します。

isNull()

時間隔がNULLかどうかをチェックします。

operator*()

2つのIntervalYM値の積を戻します。

operator*=()

乗算による割当てを行います。

operator=()

単純割当てを行います。

operator==()

aとbが等しいかどうかをチェックします。

operator!=()

aとbが等しくないかどうかをチェックします。

operator/()

intervalを(a/b)の値で戻します。

operator/=()

除算による割当てを行います。

operator>()

aがbを超えているかどうかをチェックします。

operator>=()

aがb以上かどうかをチェックします。

operator<()

aがb未満かどうかをチェックします。

operator<=()

aがb以下かどうかをチェックします。

operator-()

intervalを(a-b)の値で戻します。

operator-=()

減算による割当てを行います。

operator+()

2つのIntervalYM値の合計を戻します。

operator+=()

加算による割当てを行います。

set()

時間隔を指定した値に設定します。

setNull()

時間隔をNULLに設定します。

toText()

時間隔をstring表現に変換します。

toUText()

時間隔をUString表現に変換します。

IntervalYM()

IntervalYMクラスのコンストラクタです。

構文

説明

IntervalYM();

NULLのIntervalYMオブジェクトが作成されます。NULLのIntervalYMは、operator*()メソッドを割り当てるか、コールすることによって初期化できます。NULLのIntervalYMオブジェクトでコールできるメソッドは、setName()とisNull()です。

IntervalYM(
const Environment *env,
int year  = 0,
int month = 0);

指定されたEnvironment内でIntervalYMオブジェクトを作成します。

IntervalDS(
const IntervalYM &src);

コピー・コンストラクタです。

パラメータ

説明

env

Environmentを指定します。

year

IntervalYMオブジェクトのyearフィールドを指定します。

month

IntervalYMのmonthフィールドを指定します。

src

IntervalYMオブジェクトのコピー元を指定します。

fromText()

このメソッドは、時間隔をinpstrの値に初期化します。文字列は、環境に設定されているNLSパラメータを使用して解釈されます。

NLSパラメータはenvから選択されます。envがNULLの場合は、NLSパラメータがインスタンスに関連付けられている環境から選択されます（関連付けられている場合）。

構文

void fromText(
const string &inpStr,
const string &nlsParam = "",
const Environment *env = NULL);

パラメータ

説明

inpStr

'年-月'形式の年月時間隔を示すstring型文字列を指定します。

nlsParam

NLSパラメータ文字列を指定します。nlsParamが指定されている場合は、この指定によって、変換に使用されるNLSパラメータが決まります。nlsParamが指定されていない場合は、NLSパラメータがenvpから選択されます。

env

NLSパラメータが使用される環境を指定します。

fromUText()

指定したUStringから時間隔を作成します。

構文

void fromUText(
const UString &inpStr,
const Environment *env=NULL );

パラメータ

説明

inpStr

'年-月'形式の年月時間隔を示す入力用UString型文字列を指定します。

env

Environmentを指定します。

getMonth()

このメソッドは、時間隔の月要素を戻します。

構文

int getMonth() const;

getYear()

このメソッドは、時間隔の年要素を戻します。

構文

int getYear() const;

isNull()

このメソッドは、時間隔がNULLかどうかをテストします。時間隔がNULLの場合はTRUEを、それ以外の場合はFALSEを戻します。

構文

bool isNull() const;

operator*()

このメソッドは、時間隔に係数を乗算し、その結果を戻します。

構文

const IntervalYM operator*(
const IntervalDS &interval
const Number &val);

パラメータ

説明

interval

乗算する時間隔を指定します。

val

時間隔に乗算する値を指定します。

operator*=()

このメソッドは、時間隔に指定の値を乗算します。

構文

IntervalYM& operator*=(
const Number &factor);

パラメータ

説明

factor

乗算する値を指定します。

operator=()

このメソッドは、指定された値を時間隔に割り当てます。

構文

IntervalYM& operator=(
const IntervalYM &src);

パラメータ

説明

src

割り当てる値を指定します。

operator==()

このメソッドは、指定した2つの時間隔を比較します。2つの時間隔が等しい場合はTRUEを、それ以外の場合はFALSEを戻します。いずれかの時間隔がNULLの場合はSQLExceptionが発生します。

構文

bool operator==(
const IntervalYM &first,
const IntervalYM &second);

パラメータ

説明

first

比較対象の最初の時間隔を指定します。

second

比較対象の第2の時間隔を指定します。

operator!=()

このメソッドは、指定した2つの時間隔を比較します。2つの時間隔が等しくない場合はTRUEを、それ以外の場合はFALSEを戻します。いずれかの時間隔がNULLの場合はSQLExceptionが発生します。

構文

bool operator!=(
const IntervalYM &first,
const IntervalYM &second);

パラメータ

説明

first

比較対象の最初の時間隔を指定します。

second

比較対象の第2の時間隔を指定します。

operator/()

このメソッドは、時間隔を係数で除算した結果を戻します。

構文

const IntervalYM operator/(
const IntervalYM &dividend,
const Number &factor);

パラメータ

説明

dividend

被除数の時間隔を指定します。

factor

時間隔を除算する値を指定します。

operator/=()

このメソッドは、時間隔を係数で除算します。

構文

IntervalYM& operator/=(
const Number &factor);

パラメータ

説明

factor

日時時間隔を指定します。

operator>()

このメソッドは、指定した2つの時間隔を比較します。第1の時間隔が第2の時間隔より長い場合はTRUEを、それ以外の場合はFALSEを戻します。いずれかの時間隔がNULLの場合はSQLExceptionが発生します。

構文

bool operator>(
const IntervalYM &first,
const IntervalYM &second);

パラメータ

説明

first

比較対象の最初の時間隔を指定します。

second

比較対象の第2の時間隔を指定します。

operator>=()

このメソッドは、指定した2つの時間隔を比較します。第1の時間隔が第2の時間隔以上の長さの場合はTRUEを、それ以外の場合はFALSEを戻します。いずれかの時間隔がNULLの場合はSQLExceptionが発生します。

構文

bool operator>=(
const IntervalYM &first,
const IntervalYM &second);

パラメータ

説明

first

比較対象の最初の時間隔を指定します。

second

比較対象の第2の時間隔を指定します。

operator<()

このメソッドは、指定した2つの時間隔を比較します。第1の時間隔が第2の時間隔より短い場合はTRUEを、それ以外の場合はFALSEを戻します。いずれかの時間隔がNULLの場合はSQLExceptionが発生します。

構文

bool operator<(
const IntervalYM &first,
const IntervalYM &second);

パラメータ

説明

first

比較対象の最初の時間隔を指定します。

second

比較対象の第2の時間隔を指定します。

operator<=()

このメソッドは、指定した2つの時間隔を比較します。第1の時間隔が第2の時間隔以下の長さの場合はTRUEを、それ以外の場合はFALSEを戻します。いずれかの時間隔がNULLの場合はSQLExceptionが発生します。

構文

bool operator<=(
const IntervalYM &first,
const IntervalYM &second);

パラメータ

説明

first

比較対象の最初の時間隔を指定します。

second

比較対象の第2の時間隔を指定します。

operator-()

このメソッドは、指定された時間隔の差を戻します。

構文

const IntervalYM operator-(
const IntervalYM &first,
const IntervalYM &second);

パラメータ

説明

first

比較対象の最初の時間隔を指定します。

second

比較対象の第2の時間隔を指定します。

operator-=()

このメソッドは、この時間隔と別の時間隔との差を計算します。

構文

IntervalYM& operator-=(
const IntervalYM &val);

パラメータ

説明

val

日時時間隔を指定します。

operator+()

このメソッドは、指定された時間隔の和を戻します。

構文

const IntervalYM operator+(
const IntervalYM &first,
const IntervalYM &second);

パラメータ

説明

first

比較対象の最初の時間隔を指定します。

second

比較対象の第2の時間隔を指定します。

operator+=()

このメソッドは、IntervalYMとvalの和をIntervalYMに割り当てます。

構文

IntervalYM& operator+=(
const IntervalYM &val);

パラメータ

説明

val

日時時間隔を指定します。

set()

このメソッドは、間隔を指定した値に設定します。

構文

void set(
int year,
int month);

パラメータ

説明

year

年のコンポーネントを指定します。有効な値は、-10の9乗〜10の9乗です。

month

月のコンポーネントを指定します。有効な値は、-11〜11です。

setNull()

このメソッドは、時間隔をNULLに設定します。

構文

void setNull();

toText()

このメソッドは、時間隔を表す文字列を戻します。

構文

string toText(
unsigned int lfprec,
const string &nlsParam = "") const;

パラメータ

説明

lfprec

先行フィールド精度を指定します。

nlsParam

NLSパラメータ文字列を指定します。nlsParamが指定されている場合は、この指定によって、変換に使用されるNLSパラメータが決まります。nlsParamが指定されていない場合は、NLSパラメータがenvpから選択されます。

toUText()

時間隔をUString表現に変換します。

構文

UString toUText(
unsigned int lfprec) cosnt;

パラメータ

説明

lfprec

先行フィールド精度を指定します。

Listenerクラス

Listenerクラスは、指定のキューで登録済AgentとしてMessageをリスニングする機能をカプセル化します。

表13-23 Listenerメソッドの概要

メソッド

概要

Listener()

Listenerクラスのコンストラクタです。

getAgentList()

Listenerがサービスを提供するAgentのリストを取り出します。

getTimeOutForListen()

コールのタイムアウトを取り出します。

listen()

Messageをリスニングし、Messageの宛先であるAgentの名前を戻します。

setAgentList()

Listenerがサービスを提供するAgentのリストを指定します。

setTimeOutForListen()

listen()のコールのタイムアウトを指定します。

Listener()

Listenerクラスのコンストラクタです。

構文

説明

Listener(
const Connection* conn);

Listenerオブジェクトを作成します。

Listener(
const Connection* conn
vector<Agent> &aglist,
int waitTime=0);

Listenerオブジェクトを作成し、かわりにキューでリスニングするAgentのリストを設定します。待機時間も設定します。デフォルトは待機なしです。

パラメータ

説明

conn

新規Listenerオブジェクトの接続を指定します。

aglist

Listenerオブジェクトがかわりにキューで待機するエージェントのリストを指定します。これは、このListenerのクライアントです。

waitTime

クライアントにとって重要なメッセージをキューで待機する秒数を指定します。

getAgentList()

Listenerがサービスを提供するAgentのリストを取り出します。

構文

vector<Agent> getAgentList() const;

getTimeOutForListen()

コールのタイムアウトを取り出します。

構文

int getTimeOutForListen() const;

listen()

前のsetTimeOutForListen()のコールで指定された時間だけ、指定されたAgentとしてMessageをリスニングします。MessageがあるAgentを戻します。

これはブロック化コールです。このコールの前に、次の手順を実行してください。

- setAgentList()をコールして各エージェントのリスナーを登録します。

- setTimeOutForListen()をブロック化コールします。このコールから制御が戻るのは、リストに含まれるAgentのいずれかを宛先とするMessageが着信したときです。待機時間が切れるまでにMessageが着信しない場合、このコールはエラーを戻します。

構文

Agent listen();

setAgentList()

Listenerがサービスを提供するAgentのリストを指定します。

構文

void setAgentList(
vector<Agent>& agList);

パラメータ

説明

agList

Agentのリストを指定します。

setTimeOutForListen()

listen()のコールのタイムアウトを指定します。

構文

void setTimeOutForListen(
int waitTime);

パラメータ

説明

waitTime

指定のキューでListenerがMessageを待機する時間隔を秒単位で指定します。

Mapクラス

Mapクラスは、SQL構造型のマッピングをC++クラスに格納するために使用します。

オブジェクト型トランスレータ（OTT）は、各ユーザー定義型ごとに、C++クラス宣言を生成し、静的なreadSQL()メソッドとwriteSQL()メソッドを実装します。readSQL()メソッドは、サーバーからのオブジェクトがC++クラス・インスタンスとしてアプリケーション内に構築されるとコールされます。writeSQL()メソッドは、アプリケーション・キャッシュ内のオブジェクトがサーバーに書き込まれるか、フラッシュされると、そのオブジェクトをサーバーのデータにマーシャリングするためにコールされます。OTTによって生成されたreadSQL()メソッドとwriteSQL()メソッドは、OCCI標準C++マッピングに基づいています。

OTTで生成された標準マッピングをカスタマイズしたマッピングでオーバーライドする場合、カスタマイズが必要なSQL構造型ごとに、readSQL()メソッドとwriteSQL()メソッドに加えて、カスタムC++クラスを実装する必要があります。また、そのような各クラスのエントリをEnvironmentのMapメンバーに追加する必要があります。

表13-24 Mapメソッドの概要

メソッド

概要

put()

型のマップ・エントリであるtype_nameを追加します。

put()

カスタマイズする必要がある型のマップ・エントリであるtype_nameを追加します。type_nameのC++クラスを実装する必要があります。

次に、この情報をマップ・オブジェクトに追加する必要があります。ユーザーが標準マッピングをオーバーライドする場合は、このオブジェクトを接続に登録する必要があります。この登録は、環境が作成された後に、環境に渡すこのメソッドをコールすることで実行できます。

構文

説明

void put(
const string &schemaType,
void *(*rSQL)(void *),
void (*wSQL) (void *, void *));

型および対応するC++ readSQL関数とwriteSQL関数を登録します。

void put(
const string& schName,
const string& typName,
void *(*rSQL)(void *),
void (*wSQL)(void *, void *));

型および対応するC++ readSQL関数とwriteSQL関数を登録します。これはマルチバイト・サポートの場合です。

void put(
const UString& schName,
const UString& typName,
void *(*rSQL)(void *),
void (*wSQL)(void *, void *));

型および対応するC++ readSQL関数とwriteSQL関数を登録します。これはUnicodeサポートの場合です。

パラメータ

説明

schemaType

スキーマと型名をピリオド（.）で区切って指定します（HR.TYPE1など）。

schName

スキーマの名前を指定します。

typName

型の名前を指定します。

rDQL

型に対応するC++クラスのreadSQL関数のポインタを指定します。

wSQL

型に対応するC++クラスのwriteSQL関数のポインタを指定します。

Messageクラス

メッセージは、エンキューおよびデキューの単位です。Messageオブジェクトは、その内容またはペイロードと、プロパティを保持します。このクラスは、メッセージ・プロパティを取得および設定するメソッドを提供します。

表13-25 Messageクラスで使用される列挙値

属性

オプション

MessageState

- MSG_WAITINGは、メッセージ遅延時間に達していないことを示します。

- MSG_READYは、メッセージの処理準備が完了していることを示します。

- MSG_PROCESSEDは、メッセージが処理済で保持中であることを示します。

- MSG_EXPIREDは、メッセージが例外キューに移動されたことを示します。

PayloadType

- RAW

- ANYDATA

- OBJECT

表13-26 Messageメソッドの概要

メソッド

概要

Message()

Messageクラスのコンストラクタです。

getAnyData()

メッセージのAnyDataのペイロードを取り出します。

getAttemptsToDequeue()

メッセージのデキュー試行回数を取り出します。

getBytes()

メッセージのBytesのペイロードを取り出します。

getCorrelationId()

識別文字列を取り出します。

getDelay()

メッセージのエンキュー時の遅延を取り出します。

getExceptionQueueName()

処理できないMessageの移動先キューの名前を取り出します。

getExpiration()

メッセージの期限切れを取り出します。

getMessageEnqueuedTime()

メッセージのエンキュー時刻を取り出します。

getMessageState()

エンキュー時のメッセージの状態を取り出します。

getObject()

メッセージのオブジェクトのペイロードを取り出します。

getOriginalMessageId()

最後のキューでこのメッセージを生成したメッセージのIDを取り出します。

getPayloadType()

ペイロードの型を取り出します。

getPriority()

メッセージの優先順位を取り出します。

getSenderId()

Messageを送信したエージェントを取り出します。

isNull()

MessageオブジェクトがNULLかどうかをテストします。

operator=()

Messageの代入演算子です。

setAnyData()

メッセージのAnyDataのペイロードを指定します。

setBytes()

メッセージのBytesのペイロードを指定します。

setCorrelationId()

識別文字列を指定します。

setDelay()

エンキューされたMessageの遅延秒数を指定します。

setExceptionQueueName()

処理できないMessageオブジェクトの移動先キューの名前を指定します。

setExpiration()

期限切れになるまでにMessageをデキューできる期間を指定します。

setNull()

MessageオブジェクトをNULLに設定します。

setObject()

メッセージのオブジェクトのペイロードを指定します。

setOriginalMessageId()

Messageを生成した最後のキューのIDを指定します。

setPriority()

Messageオブジェクトの優先順位を指定します。

setRecipientList()

メッセージの宛先であるエージェントのリストを指定します。

setSenderId()

Messageの送信者を指定します。

Message()

Messageクラスのコンストラクタです。

構文

説明

Message(
const Environment *env);

指定されたEnvironment内でMessageオブジェクトを作成します。

Message(
const Message& mes);

コピー・コンストラクタです。

パラメータ

説明

env

Messageの環境を指定します。

mes

オリジナルのMessageオブジェクトです。

getAnyData()

MessageのAnyDataのペイロードを取り出します。

構文

AnyData getAnyData() const;

getAttemptsToDequeue()

メッセージのデキュー試行回数を取り出します。エンキュー時には、このプロパティを取り出せません。

構文

int getAttemptsToDequeue() const;

getBytes()

MessageのBytesのペイロードを取り出します。

構文

Bytes getBytes() const;

getCorrelationId()

識別文字列を取り出します。

構文

string getCorrelationId() const;

getDelay()

Messageのエンキュー時の遅延秒数を取り出します。

構文

int getDelay() const;

getExceptionQueueName()

Messageを正常に処理できない場合に、Messageの移動先となるキューの名前を取り出します。

構文

string getExceptionQueueName() const;

getExpiration()

Messageの有効期間（秒数）を取り出します。この期間中はメッセージをデキューできます。

構文

int getExpiration() const;

getMessageEnqueuedTime()

メッセージのエンキュー時刻をDate書式で取り出します。この値はシステムにより決定され、ユーザーは設定できません。

構文

Date getMessageEnqueuedTime() const;

getMessageState()

エンキュー時のメッセージの状態を取り出します。このパラメータではエンキュー時刻を設定できません。MessageStateの定義は、表13-25を参照してください。

構文

MessageState getMessageState() const;

getObject()

Messageのオブジェクトのペイロードを取り出します。

構文

PObject* getObject();

getOriginalMessageId()

オリジナルのメッセージIDを取り出します。あるキューから別のキューにメッセージが伝播されたとき、伝播後のメッセージの生成元メッセージのIDを最後のキューに取得します。

構文

Bytes getOriginalMessageId() const;

getPayloadType()

ペイロードの型を取り出します。表13-25のPayloadTypeを参照してください。

構文

PayloadType getPayloadType( ) const;

getPriority()

Messageの優先順位を取り出します。

構文

int getPriority() const;

getSenderId()

Messageを送信したエージェントを取り出します。

構文

Agent getSenderId() const;

isNull()

MessageオブジェクトがNULLかどうかをテストします。MessageオブジェクトがNULLの場合はTRUEを、それ以外の場合はFALSEを戻します。

構文

bool isNull() const;

operator=()

Messageの代入演算子です。

void operator=(
const Message& mes);

パラメータ

説明

mes

オリジナルのメッセージを指定します。

setAnyData()

MessageのAnyDataのペイロードを指定します。

構文

void setAnyData(
const AnyData& anydata);

パラメータ

説明

anydata

Messageのデータの内容を指定します。

setBytes()

MessageのBytesのペイロードを指定します。

構文

void setBytes(
const Bytes& bytes);

パラメータ

説明

bytes

Messageのデータの内容を指定します。

setCorrelationId()

識別文字列を指定します。このパラメータは、エンキュー時にProducerにより設定されます。メッセージは、このIDを使用してデキューできます。IDには、ワイルドカード文字を含めることができます。

構文

void setCorrelationId(
const string& id);

パラメータ

説明

id

IDを指定します。上限は128バイトです。

setDelay()

エンキューされたMessageの遅延秒数を指定します。遅延終了後は、Messageをデキューできます。

msgidによりデキューする場合は、遅延指定がオーバーライドされます。遅延付きでエンキューされたMessageは、WAITING状態になります。遅延は、Messageのプロデューサにより設定されます。

構文

void setDelay(
int delay);

パラメータ

説明

delay

遅延を指定します。

setExceptionQueueName()

正常に処理できないMessageオブジェクトの移動先キューの名前を指定します。有効なキュー名を指定する必要があります。

移動時に例外キューが存在しなければ、Messageはキュー表に関連付けられているデフォルトの例外キューに移動し、アラート・ログに警告が記録されます。

また、デフォルトの例外キューが使用される場合、パラメータはエンキュー時にNULL値を戻します。属性では有効なキュー名を参照する必要があります。

構文

void setExceptionQueueName(
const string& queue);

パラメータ

説明

queue

例外キューの名前を指定します。

setExpiration()

Messageオブジェクトをデキューできる有効期間を秒単位で指定します。この期間をすぎると、Messageは期限切れになります。

構文

void setExpiration(
int exp);

パラメータ

説明

exp

有効期間を指定します。

setNull()

MessageオブジェクトをNULLに設定します。EnvironmentクラスのterminateConnection()のコールによりConnectionが破棄される前に、すべてのMessageオブジェクトをNULLに設定する必要があります。

構文

void setNull();

setObject()

Messageのオブジェクトのペイロードを指定します。

構文

void setObject(
PObject& pobj);

パラメータ

説明

pobj

データの内容を指定します。

setOriginalMessageId()

あるキューから別のキューにメッセージが伝播されたとき、伝播後のメッセージの生成元メッセージのIDを最後のキューに設定します。

構文

void setOriginalMessageId(
const Bytes& queue);

パラメータ

説明

queue

最後のキューを指定します。

setPriority()

Messageオブジェクトの優先順位を指定します。この優先順位はエンキュー時に設定され、負の値に設定できます。デフォルトは0（ゼロ）です。

構文

void setPriority(
int priority);

パラメータ

説明

priority

Messageの優先順位を指定します。

setRecipientList()

Messageの宛先であるAgentのリストを指定します。これらの受信者は、キューのサブスクライバとは異なります。このプロパティはエンキュー時に設定されます。リスト内のAgentがすべて有効である必要があります。受信者リストによりデフォルトのサブスクライバ・リストがオーバーライドされます。

構文

void setRecipientList(
vector<Agent>& agentList);

パラメータ

説明

agentList

Agentのリストを指定します。

setSenderId()

Messageの送信者を指定します。

構文

void setSenderId(
const Agent& sender);

パラメータ

説明

sender

送信者IDを指定します。

MetaDataクラス

MetaDataオブジェクトは、ResultSetの列またはデータベース内の既存のスキーマ・オブジェクトの型やプロパティを記述するために使用できます。データベース全体の情報も提供します。MetaDataの列挙値については表13-27、MetaDataのメソッドの概要については表13-28をそれぞれ参照してください。

表13-27 MetaDataクラスで使用される列挙値

属性

オプション

ParamType

オブジェクトのパラメータ・タイプは次のとおりです。

- PTYPE_ARGはファンクションまたはプロシージャの引数です。

- PTYPE_COLは表またはビューの列です。

- PTYPE_DATABASEはデータベースです。

- PTYPE_FUNCはファンクションです。

- PTYPE_PKGはパッケージです。

- PTYPE_PROCはプロシージャです。

- PTYPE_SCHEMAはスキーマです。

- PTYPE_SEQは順序です。

- PTYPE_SYNはシノニムです。

- PTYPE_TABLEは表です。

- PTYPE_TYPEは型です。

- PTYPE_TYPE_ARGは型のメソッドの引数です。

- PTYPE_TYPE_ATTRは型の属性です。

- PTYPE_TYPE_COLLは型情報のコレクションです。

- PTYPE_TYPE_METHODは型のメソッドです。

- PTYPE_TYPE_RESULTはメソッドの結果です。

- PTYPE_UNKは不明な型のオブジェクトです。

- PTYPE_VIEWはビューです。

すべてのパラメータに共通のAttrId

すべてのパラメータの属性です。

- ATTR_OBJ_IDはオブジェクトまたはスキーマのIDです。

- ATTR_OBJ_NAMEはデータベース名またはスキーマ内のオブジェクト名です。

- ATTR_OBJ_SCHEMAはオブジェクトを記述するスキーマの名前です。

- ATTR_PTYPEは、ParamTypeパラメータによって記述される情報の型です。

- ATTR_TIMESTAMPはオブジェクトのタイムスタンプです。

表とビューのAttrId

表またはビューのパラメータ（PTYPE_TABLEおよびPTYPE_VIEWのParamType）には、次のような型固有の属性があります。

- ATTR_OBJIDはオブジェクトIDです。

- ATTR_NUM_COLSは列の数です。

- ATTR_LIST_COLUMNSは列リストです。

- ATTR_REF_TDOは、エクステント表の場合におけるベース型のTDOに対するREFです。

- ATTR_IS_TEMPORARYは表が一時表であることを示します。

- ATTR_IS_TYPEDは表が特定の型の表であることを示します。

- ATTR_DURATIONは一時表の継続時間です。値には、DURATION_SESSION、DURATION_TRANSおよびDURATION_NULLが指定できます。これらは、属性AttrValuesに定義されています。

表専用のAttrId

表専用のパラメータです（PTYPE_TABLEのParamType）。

- ATTR_RDBAは、セグメント・ヘッダーのデータ・ブロック・アドレスを示します。

- ATTR_TABLESPACEは、表がある表領域を示します。

- ATTR_CLUSTEREDは、表をクラスタ化することを示します。

- ATTR_PARTITIONEDは表をパーティション化することを示します。

- ATTR_INDEX_ONLYは表が索引のみの表であることを示します。

ファンクションとプロシージャのAttrId

ファンクションとプロシージャのパラメータです（PTYPE_FUNCおよびPTYPE_PROCのそれぞれのParamType）。

- ATTR_LIST_ARGUMENTSは、引数のリストです。

- ATTR_IS_INVOKER_RIGHTSは、プロシージャまたはファンクションに対して実行者権限が設定されていることを示します。

- ATTR_NAMEはプロシージャまたはファンクションの名前を示します。

- ATTR_OVERLOAD_IDはオーバーロードする側のID番号を示します。これはプロシージャまたはファンクションがクラスの一部でかつそれらをオーバーロードする場合に必要です。戻り値は、PL/SQLファンクションまたはプロシージャによる直接問合せとは異なる可能性があります。

パッケージのAttrId

パッケージのパラメータです（PTYPE_PKGのParamType）。

- ATTR_LIST_SUBPROGRAMSはサブプログラムのリストです。

- ATTR_IS_INVOKER_RIGHTSは、プロシージャまたはファンクションに対して実行者権限が設定されていることを示します。

型のAttrId

型のパラメータです（PTYPE_TYPEのParamType）。

- ATTR_REF_TDOは、列の型がオブジェクト型の場合に、型の型記述子のメモリー内REFを戻します。領域が確保されていない場合は、暗黙的にキャッシュに割り当てられます。これによりコール元はオブジェクトを確保できます。

- ATTR_TYPECODEは、データ型コードを示します。

- ATTR_COLLECTION_TYPECODEは、コレクションの型コードを示します。（型がコレクションの場合）。

- ATTR_IS_INCOMPLETE_TYPEは、これが不完全な型であることを示します。

- ATTR_IS_SYSTEM_TYPEは、これがシステム生成の型であることを示します。

- ATTR_IS_PREDEFINED_TYPEは、これが事前定義の型であることを示します。

- ATTR_IS_TRANSIENT_TYPEは、これが一時的な型であることを示します。

- ATTR_IS_SYSTEM_GENERATED_TYPEは、これがシステム生成の型であることを示します。

- ATTR_HAS_NESTED_TABLE は、この型にネストした表の属性があることを示します。

- ATTR_HAS_LOBは、この型にLOB属性が含まれていることを示します。

- ATTR_HAS_FILEは、この型にBFILE属性が含まれていることを示します。

- ATTR_COLLECTION_ELEMENTは、コレクション要素の参照を示します。

- ATTR_NUM_TYPE_ATTRSは型属性の数を示します。

- ATTR_LIST_TYPE_ATTRSは型属性のリストを示します。

- ATTR_NUM_TYPE_METHODSは型メソッドの数を示します。

- ATTR_LIST_TYPE_METHODSは型メソッドのリストを示します。

- ATTR_MAP_METHODは型のマップ・メソッドを示します。

- ATTR_ORDER_METHODは型のオーダー・メソッドを示します。

- ATTR_IS_INVOKER_RIGHTSは、型に対して実行者権限が設定されていることを示します。

- ATTR_NAMEは型属性名を示します。

- ATTR_SCHEMA_NAMEは型が作成されたスキーマを示します。

- ATTR_IS_FINAL_TYPEは、これが最終の型であることを示します。

- ATTR_IS_INSTANTIABLE_TYPEは、これがインスタンス化可能な型であることを示します。

- ATTR_IS_SUBTYPEは、これがサブタイプであることを示します。

- ATTR_SUPERTYPE_SCHEMA_NAMEは、スーパータイプが含まれているスキーマの名前を示します。

- ATTR_SUPERTYPE_NAMEはスーパータイプの名前を示します。

型属性のAttrId

型属性のパラメータです（PTYPE_TYPE_ATTRのParamType）。

- ATTR_DATA_SIZEは、型属性の最大サイズを示します。

- ATTR_TYPECODEは、データ型コードを示します。

- ATTR_DATA_TYPEは、型属性のデータ型を示します。

- ATTR_NAMEはプロシージャまたはファンクションの名前を示します。

- ATTR_PRECISIONは、数値型属性の精度を示します。

- ATTR_SCALEは、数値型属性のスケールを示します。

- ATTR_TYPE_NAMEは、型名を示します。

- ATTR_SCHEMA_NAMEは、型が作成されたスキーマの名前を示します。

- ATTR_REF_TDOは、列型がオブジェクト型である場合に、型のメモリー内REFを示します。領域が確保されていない場合は、暗黙的にキャッシュに割り当てられます。これによりコール元はオブジェクトを確保できます。

- ATTR_CHARSET_IDは、キャラクタ・セットIDを示します。

- ATTR_CHARSET_FORMは、キャラクタ・セット・フォームを示します。

- ATTR_FSPRECISIONは、Timestamp、IntervalDSまたはIntervalYMの秒の小数部分の精度を示します。

- ATTR_LFPRECISIONは、IntervalDSまたはIntervalYMの整数部分のフィールドの精度を示します。

型メソッドのAttrId

型のメソッドのパラメータです（PTYPE_TYPE_METHODのParamType）。

- ATTR_NAMEはプロシージャまたはファンクションの名前を示します。

- ATTR_ENCAPSULATIONは、メソッドのカプセル化レベルを示します。

- ATTR_LIST_ARGUMENTSは、引数のリストです。

- ATTR_IS_CONSTRUCTORは、メソッドがコンストラクタであることを示します。

- ATTR_IS_DESTRUCTORは、メソッドがデストラクタであることを示します。

- ATTR_IS_OPERATORは、メソッドが演算子であることを示します。

- ATTR_IS_SELFISHは、メソッドが自己参照であることを示します。

- ATTR_IS_MAPは、メソッドがマップ・メソッドであることを示します。

- ATTR_IS_ORDERは、メソッドがオーダー・メソッドであることを示します。

- ATTR_IS_RNDSは、メソッドが"read no data"（データの読取りなし）状態であることを示します。

- ATTR_IS_RNPSは、メソッドが"read no process"（プロセスの読取りなし）状態であることを示します。

- ATTR_IS_WNDSは、メソッドが"write no data"（データの書込みなし）状態であることを示します。

- ATTR_IS_WNPSは、メソッドが"write no process"（プロセスの書込みなし）状態であることを示します。

- ATTR_IS_FINAL_METHODは、これが最終のメソッドであることを示します。

- ATTR_IS_INSTANTIABLE_METHODは、これがインスタンス化可能なメソッドであることを示します。

- ATTR_IS_OVERRIDING_METHODは、これがオーバーライドする側のメソッドであることを示します。

コレクションのAttrId

コレクションのパラメータです（PTYPE_TYPE_COLLのParamType）。

- ATTR_DATA_SIZEは示します。

- ATTR_TYPECODEは示します。

- ATTR_DATA_TYPEは、型属性のデータ型を示します。

- ATTR_NUM_ELEMSは、コレクション内の要素数を示します。

- ATTR_NAMEは、型属性の名前を示します。

- ATTR_PRECISIONは、数値型属性の精度を示します。

- ATTR_SCALEは、数値型属性のスケールを示します。

- ATTR_TYPE_NAMEは、型名を示します。

- ATTR_SCHEMA_NAMEは、型が作成されたスキーマを示します。

- ATTR_REF_TDOは、列型がオブジェクト型である場合に、型のメモリー内REFを示します。領域が確保されていない場合は、暗黙的にキャッシュに割り当てられます。これによりコール元はオブジェクトを確保できます。

- ATTR_CHARSET_IDは、キャラクタ・セットIDを示します。

- ATTR_CHARSET_FORMは、キャラクタ・セット・フォームを示します。

シノニムのAttrId

シノニムのパラメータです（PTYPE_SYNのParamType）。

- ATTR_OBJIDは、オブジェクトIDを示します。

- ATTR_SCHEMA_NAMEは、シノニム変換のスキーマ名を示します。

- ATTR_NAMEは、シノニム変換のNULL終了オブジェクト名を示します。

- ATTR_LINKは、シノニム変換のNULL終了データベース・リンク名を示します。

順序のAttrId

順序のパラメータです（PTYPE_SEQのParamType）。

- ATTR_OBJIDは、オブジェクトIDを示します。

- ATTR_MINは、最小値を示します。

- ATTR_MAXは、最大値を示します。

- ATTR_INCRは、増分数を示します。

- ATTR_CACHEは、キャッシュされた順序番号の数を示します。順序がキャッシュされていない場合は、0です。

- ATTR_ORDERは、順序が順序指定されているかどうかを示します。

- ATTR_HW_MARKは、「最高水位標」を示します。

列のAttrId

表またはビューの列パラメータです（PTYPE_COLのParamType）。

- ATTR_CHAR_USEDは、列の長さセマンティクスの型を示します。0はバイト長セマンティクス、1は文字長セマンティクスを示します。

- ATTR_CHAR_SIZEは、列の文字長、すなわち、列内で使用可能な文字数を示します。

- ATTR_DATA_SIZEは、列の最大サイズ、すなわち、列内で使用可能なバイト数を示します。

- ATTR_DATA_TYPEは、列のデータ型を示します。

- ATTR_NAMEは、列名を示します。

- ATTR_PRECISIONは、数値列の精度を示します。

- ATTR_SCALEは、数値列のスケールを示します。

- ATTR_IS_NULLは、列にNULL値が許可されていない場合に、0を示します。

- ATTR_TYPE_NAMEは、型名を示します。

- ATTR_SCHEMA_NAMEは、型が作成されたスキーマを示します。

- ATTR_REF_TDOは、列がオブジェクト型である場合に、型のREFを示します。

- ATTR_CHARSET_IDは、キャラクタ・セットIDを示します。

- ATTR_CHARSET_FORMは、キャラクタ・セット・フォームを示します。

引数および結果のAttrId

プロシージャまたはファンクションの引数（PTYPE_ARG）、メソッド（PTYPE_TYPE_ARG）または結果（PTYPE_TYPE_RESULT）のパラメータです。

- ATTR_NAMEは、引数名を示します。

- ATTR_POSITIONは、リスト内の引数の位置を示します。

- ATTR_TYPECODEは、型コードを示します。

- ATTR_DATA_TYPEは、データ型を示します。

- ATTR_DATA_SIZEは、データ型のサイズを示します。

- ATTR_PRECISIONは、数値引数の精度を示します。

- ATTR_SCALEは、数値引数のスケールを示します。

- ATTR_LEVELは、データ型レベルを示します。

- ATTR_HAS_DEFAULTは、引数にデフォルト値があるかどうかを示します。

- ATTR_LIST_ARGUMENTSは、レコードまたは表の型について次レベルの引数のリストを示します。

- ATTR_IOMODEは、引数モードを示します。0はIN、1はOUT、2はIN/OUTを表します。

- ATTR_RADIXは、数値型の基数を示します。

- ATTR_IS_NULLは、NULL値が許可されていない場合に、0を示します。

- ATTR_TYPE_NAMEは、型名を示します。

- ATTR_SCHEMA_NAMEは、型が作成されたスキーマの名前を示します。

- ATTR_SUB_NAMEは、パッケージのローカル型の型名を示します。

- ATTR_LINKは、パッケージがリモートの場合に、パッケージのローカル型が定義されている、NULL文字で終了するデータベース・リンク名を示します。

- ATTR_REF_TDOは、引数がオブジェクトの場合、型のTDOに対するREFです。

- ATTR_CHARSET_IDは、キャラクタ・セットIDを示します。

- ATTR_CHARSET_FORMは、キャラクタ・セット・フォームを示します。

スキーマのAttrId

スキーマのパラメータです（PTYPE_SCHEMAのParamType）。

- ATTR_LIST_OBJECTSは、スキーマ内のオブジェクトのリストを示します。

リストのAttrId

列、引数またはサブプログラムのリストのパラメータです。

- ATTR_LIST_COLUMNSは列リストを示します。

- ATTR_LIST_ARGUMENTSは、プロジェクトまたはファンクションの引数リストを示します。

- ATTR_LIST_SUBPROGRAMSは、サブプログラムのリストを示します。

- ATTR_LIST_TYPE_ATTRIBSは、型属性のリストを示します。

- ATTR_TYPE_METHODSは、型メソッドのリストを示します。

- ATTR_TYPE_OBJECTSは、スキーマ内のオブジェクトのリストを示します。

- ATTR_LIST_SCHEMASは、データベース内のスキーマのリストを示します。

データベースのAttrId

列、引数またはサブプログラムのリストのパラメータです（PTYPE_DATABASEのParamType）。

- ATTR_VERSIONは、データベースのバージョンを示します。

- ATTR_CHARSET_IDは、データベースのキャラクタ・セットIDを示します。

- ATTR_NCHARSET_IDは、データベースの各国語キャラクタ・セットを示します。

- ATTR_LIST_SCHEMASは、スキーマPTYPE_SCHEMAのリストを示します。

- ATTR_MAX_PROC_LENは、プロシージャ名の最大長を示します。

- ATTR_MAX_COLUMN_LENは、列名の最大長を示します。

- ATTR_CURSOR_COMMIT_BEHAVIORは、カーソルおよびプリコンパイルされたSQL文に対してコミットがどのように影響するかを示します。値には、CURSOR_OPENおよびCURSER_CLOSEDを指定できます。これらは、属性AttrValuesに定義されています。

- ATTR_MAX_CATALOG_NAMELENは、データベース（カタログ）名の最大長を示します。

- ATTR_CATALOG_LOCATIONは、修飾表内のカタログの位置を示します。値には、CL_STARTおよびCL_ENDを指定できます。これらは、属性AttrValuesに定義されています。

- ATTR_SAVEPOINT_SUPPORTは、データベースがセーブポイントをサポートしているかどうかを示します。値には、SP_SUPPORTEDおよびSP_UNSUPPORTEDを指定できます。これらは属性AttrValuesに定義されています。

- ATTR_NOWAIT_SUPPORTは、データベースが「待機なし」条件をサポートするかどうかを示します。値には、NW_SUPPORTEDおよびNW_UNSUPPORTEDが指定できます。これらは属性AttrValuesに定義されています。

- ATTR_AUTOCOMMIT_DDLは、DDL文で自動コミット・モードが必須かどうかを示します。値には、AC_DDLおよびNO_AC_DDLが指定できます。これらは属性AttrValuesに定義されています。

- ATTR_LOCKING_MODEは、データベースのロック・モードを示します。値には、LOCK_IMMEDIATEおよびLOCK_DELAYEDが指定できます。これらは属性AttrValuesに定義されています。

AttrValues

各属性の値は、getxxx()メソッドをその属性付きで実行したときに戻される結果です。

- DURATION_SESSIONは、一時表の継続時間がセッションの間であることを示します。

- DURATION_TRANSは一時表の継続時間がトランザクションの間であることを示します。

- DURATION_NULLは、一時表の継続時間が永続的である、つまり一時表が一時表でないことを示します。

- TYPEENCAP_PRIVATEは、メソッドのカプセル化レベルがプライベートであることを示します。

- TYPEENCAP_PUBLICは、メソッドのカプセル化レベルがパブリックであることを示します。

- TYPEPARAM_INは、引数モードがINであることを示します。

- TYPEPARAM_OUTは、引数モードがOUTであることを示します。

- TYPEPARAM_INOUTは、引数モードがIN/OUTであることを示します。

- CURSOR_OPENは、データベース内のカーソルおよびプリコンパイルされたSQL文に対するCOMMIT操作の効果として、COMMIT操作前のカーソルの状態が保持されていることを示します。

- CURSER_CLOSEDは、データベース内のカーソルおよびプリコンパイルされたSQL文に対するCOMMIT操作の効果として、カーソルはCOMMIT時にクローズされるもののアプリケーションが文を再プリコンパイルなしで再実行可能であることを示します。

- CL_STARTは、修飾表内のカタログの位置が先頭であることを示します。

- CL_ENDは、修飾表内のカタログの位置が末尾であることを示します。

- SP_SUPPORTEDは、データベースでセーブポイントがサポートされることを示します。

- SP_UNSUPPORTEDは、データベースでセーブポイントがサポートされないことを示します。

- NW_SUPPORTEDは、データベースでNOWAIT句がサポートされることを示します。

- NW_UNSUPPORTEDは、データベースでNOWAIT句がサポートされないことを示します。

- AC_DDLは、DDL文に自動コミット・モードが必須です。

- NO_AC_DDLは、DDL文には自動コミット・モードが不要です。

- LOCK_IMMEDIATEは、データベースのロック・モードが即時であることを示します。

- LOCK_DELAYEDは、データベースのロック・モードが遅延であることを示します。

表13-28 MetaDataメソッドの概要

メソッド

説明

MetaData()

MetaDataクラスのコンストラクタです。

getAttributeCount()

属性の数をMetaData オブジェクトで取得します。

getAttributeId()

指定された属性のIDを取得します。

getAttributeType()

指定された属性の型を取得します。

getBoolean()

属性の値をC++のboolean型で取得します。

getInt()

属性の値をC++のint型で取得します。

getMetaData()

属性の値をMetaDataオブジェクトで取得します。

getNumber()

指定された属性をNumberオブジェクトで戻します。

getRef()

属性の値をRef<T>として取得します。

getString()

属性の値を文字列で取得します。

getTimeStamp()

属性の値をTimestampオブジェクトで取得します。

getUInt()

属性の値をC++のunsigned int型で取得します。

getUString()

属性の値をメタデータに関連付けられているキャラクタ・セットでUStringとして戻します。

getVector()

属性の値をC++ のvectorで取得します。

operator=()

あるメタデータ・オブジェクトを別のメタデータ・オブジェクトに割り当てます。

MetaData()

MetaDataクラスのコンストラクタです。

構文

MetaData(
const MetaData &omd);

パラメータ

説明

cmd

MetaDataオブジェクトのコピー元を指定します。

getAttributeCount()

このメソッドは、メタデータ・オブジェクトに関連する属性の数を戻します。

構文

unsigned int getAttributeCount() const;

getAttributeId()

このメソッドは、ATTR_NUM_COLSなど、指定された属性番号で表される属性の属性IDを戻します。

構文

AttrId getAttributeId(
unsigned int attributeNum) const;

パラメータ

説明

attributeNum

戻される属性IDに対応する属性の番号を指定します。

getAttributeType()

このメソッドは、NUMBERやINTなど、指定された属性番号で表される属性の属性型を戻します。

構文

Type getAttributeType(
unsigned int attributeNum) const;

パラメータ

説明

attributeNum

戻される属性の型に対応する属性の番号を指定します。

getBoolean()

このメソッドは、属性の値をC++のboolean型で戻します。値がSQLのNULLの場合、結果はFALSEです。

構文

bool getBoolean(
MetaData::AttrId attributeId) const;

パラメータ

説明

attributeId

属性IDを指定します。

getInt()

このメソッドは、属性の値をC++のint型で戻します。値がSQLのNULLの場合、結果は0（ゼロ）です。

構文

int getInt(
MetaData::AttrId attributeId) const;

パラメータ

説明

attributeId

属性IDを指定します。

getMetaData()

このメソッドは、属性の値を保持するMetaDataインスタンスを戻します。メタデータ属性の値は、MetaDataインスタンスとして取り出すことができます。このメソッドは、メタデータ型の値についてのみコールできます。

構文

MetaData getMetaData(
MetaData::AttrId attributeId) const;

パラメータ

説明

attributeId

属性IDを指定します。

getNumber()

このメソッドは、属性の値をNumberオブジェクトで戻します。値がSQLのNULLの場合、結果はNULLです。

構文

Number getNumber(
MetaData::AttrId attributeId) const;

パラメータ

説明

attributeId

属性IDを指定します。

getRef()

このメソッドは、属性の値をRefAnyまたはTDOへのRefで戻します。値がSQLのNULLの場合、結果はNULLです。

構文

RefAny getRef(
MetaData::AttrId attributeId) const;

パラメータ

説明

attributeId

属性IDを指定します。

getString()

このメソッドは、属性の値を文字列で戻します。値がSQLのNULLの場合、結果はNULLです。

構文

string getString(
MetaData::AttrId attributeId) const;

パラメータ

説明

attributeId

属性IDを指定します。

getTimeStamp()

このメソッドは、属性の値をTimestampオブジェクトで戻します。値がSQLのNULLの場合、結果はNULLです。

構文

Timestamp getTimestamp(
MetaData::AttrId attributeId) const;

パラメータ

説明

attributeId

属性IDを指定します。

getUInt()

このメソッドは、属性の値をC++のunsigned int型で戻します。値がSQLのNULLの場合、結果は0（ゼロ）です。

構文

unsigned int getUInt(
MetaData::AttrId attributeId) const;

パラメータ

説明

attributeId

属性IDを指定します。

getUString()

属性の値をメタデータに関連付けられているキャラクタ・セットでUStringとして戻します。

構文

UString getUString(
MetaData::AttrId attributeId) const;

パラメータ

説明

attributeId

属性IDを指定します。

getVector()

このメソッドは、属性値が含まれているC++ のvectorを戻します。コレクション属性値は、C++ のvectorインスタンスとして取り出すことができます。このメソッドは、リスト型の属性についてのみコールできます。

構文

vector<MetaData> getVector(
MetaData::AttrId attributeId) const;

パラメータ

説明

attributeId

属性IDを指定します。

operator=()

このメソッドは、あるMetaDataオブジェクトを別のMetaDataオブジェクトに割り当てます。これによって、割り当てられるMetaDataオブジェクトの参照カウントが1つ増加します。

構文

void operator=(
const MetaData &omd);

パラメータ

説明

cmd

割り当てられるMetaDataオブジェクトを指定します。

NotifyResultクラス

NotifyResultオブジェクトは、StreamsのAQ通知コールバック時に通知情報を保持します。このオブジェクトはユーザー・コールバックの起動前にOCCIにより作成され、ユーザー・コールバックの戻り後に破棄されます。

表13-29 NotifyResultメソッドの概要

メソッド

概要

getConsumerName()

通知コンシューマの名前を戻します。

getMessage()

メッセージを戻します。

getMessageId()

メッセージIDを戻します。

getPayload()

ペイロードを戻します。

getQueueName()

キューの名前を戻します。

getConsumerName()

エンキューされたメッセージのコンシューマの名前を取得します。シングル・コンシューマ・キューの場合、これは空の文字列です。

string getConsumerName() const;

getMessage()

非永続キューにエンキューされているメッセージを取得します。

Message getMessage() const;

getMessageId()

エンキューされているメッセージのIDを取得します。

Bytes getMessageId() const;

getPayload()

NS_ANONYMOUSネームスペースからの通知についてペイロードを取得します。

Bytes getPayload() const;

getQueueName()

エンキューが発生したキューの名前を取得します。

string getQueueName() const;

Numberクラス

Numberクラスは、精度に制限があり符号付きで10を基数とする数値を処理します。Numberは、10進数で38桁の精度が保証されます。次に示す範囲内の正の数値はすべて、完全な38桁の精度で表現できます。

10^-130

および

9.99999999999999999999999999999999999999*10^125

表現可能な負の数値の範囲は、正の数値と対称的になります。

数値0（ゼロ）を正確に表現できます。また、Oracle NUMBERでは、正の無限大と負の無限大を表現できます。一般的に、これらの数値表現はオーバーフローを示すために使用されます。

内部格納タイプは不透明でプライベートです。Numberインスタンスの作成時に、位取りは保持されません。

Numberは、NaNの概念をサポートしていません。また、IEEE-754-85に準拠していません。Numberは、正の無限大と負の無限大をサポートしていません。

Numberクラスからのオブジェクトは、クライアント側の数値計算でスタンドアロン・クラス・オブジェクトとして使用できます。データベースからフェッチする場合やデータベースに設定する場合にも使用できます。

例13-10 Numberオブジェクトを取り出して使用する方法

この例では、データベースからのNumber列値の取出し、Numberオブジェクトを使用するバインド、およびスタンドアロンNumberオブジェクトを使用する計算が示されています。

/* Create a connection */
Environment *env = Environment::createEnvironment(Environment::DEFAULT);
Connection *conn = Connection(user, passwd, db);

/* Create a statement and associate a select clause with it */
string sqlStmt = "SELECT department_id FROM DEPARTMENTS";
Statement *stmt = conn->createStatement(sqlStmt);

/* Run the statement to get a result set */
ResultSet *rset = stmt->executeQuery();
while(rset->next())
{
Number deptId = rset->getNumber(1);
/* Display the department id with the format string 9,999 */
cout << "Department Id" << deptId.toText(env, "9,999");

/* Use the number obtained as a bind value in the following query */
stmt->setSQL("SELECT * FROM EMPLOYEES WHERE department_id = :x");
stmt->setNumber(1, deptId);
ResultSet *rset2 = stmt->executeQuery();
.
.
}
/* Using a Number object as a standalone and the operations on them */

/* Create a number to a double value */
double value = 2345.123;
Number nu1 (value);

/* Some common Number methods */
Number abs = nu1.abs();    /* absolute value */
Number sqrt = nu1.squareroot();    /* square root */
Environment *env = Environment::createEnvironment();

//create a null year-month interval
IntervalYM ym
if(ym.isNull())
cout << "\n ym is null";

//assign a non null value to ym
IntervalYM anotherYM(env, "10-30");
ym = anotherYM;

//now all operations are valid on ym
int yr = ym.getYear();

表13-30 Numberメソッドの概要

メソッド

概要

Number()

Numberクラスのコンストラクタです。

abs()

数値の絶対値を戻します。

arcCos()

数値のアーク・コサインを戻します。

arcSin()

数値のアーク・サインを戻します。

arcTan()

数値のアーク・タンジェントを戻します。

arcTan2()

入力数値yとこの数値xのアーク・タンジェントを戻します。

ceil()

数値の値以上で、最小の整数値を戻します。

cos()

数値のコサインを戻します。

exp()

数値の自然指数を戻します。

floor()

数値の値以下で、最大の整数値を戻します。

fromBytes()

Bytesオブジェクトから導出したNumberを戻します。

fromText()

指定された数値文字列、書式文字列およびNLSパラメータからNumberを戻します。

hypCos()

数値の双曲線コサインを戻します。

hypSin()

数値の双曲線サインを戻します。

hypTan()

数値の双曲線タンジェントを戻します。

intPower()

指定された整数値で累乗した数値を戻します。

isNull()

NumberがNULLかどうかをチェックします。

ln()

数値の自然対数を戻します。

log()

指定された底に対する数値の対数を戻します。

operator++()

numberを増やします。

--

numberを減らします。

operator*()

2つのNumber値の積を戻します。

operator/()

2つのNumber値の商を戻します。

operator%()

2つのNumber値のモジュロを戻します。

operator+()

2つのNumber値の和を戻します。

operator-()

Numberの負の値を戻します。

operator-()

2つのNumber値の差を戻します。

operator<()

数値が別の数値未満かどうかをチェックします。

operator<=()

数値が別の数値以下かどうかをチェックします。

operator>()

数値が別の数値を超えているかどうかをチェックします。

operator>=()

数値が別の数値以上かどうかをチェックします。

operator=()

ある数値を別の数値に割り当てます。

operator==()

2つの数値が等しいかどうかをチェックします。

operator!=()

2つの数値が等しくないかどうかをチェックします。

operator*=()

乗算による割当てを行います。

operator/=()

除算による割当てを行います。

operator%=()

余りによる割当てを行います。

operator+=()

加算による割当てを行います。

-=

減算による割当てを行います。

operator char()

Numberをシステム固有のchar型に変換して戻します。

operator signed char()

Numberをシステム固有のsigned char型に変換して戻します。

operator double()

Numberをシステム固有のdouble型に変換して戻します。

operator float()

Numberをシステム固有のfloat型に変換して戻します。

operator int()

Numberをシステム固有のint型に変換して戻します。

operator long()

Numberをシステム固有のlong型に変換して戻します。

operator long double()

Numberをシステム固有のlong double型に変換して戻します。

operator short()

Numberをシステム固有のshort int型に変換して戻します。

operator unsigned char()

Numberを符号なしでシステム固有のunsigned char型に変換して戻します。

operator unsigned int()

Numberを符号なしでシステム固有のunsigned int型に変換して戻します。

operator unsigned long()

Numberを符号なしでシステム固有のunsigned long型に変換して戻します。

operator unsigned short()

Numberを符号なしでシステム固有のunsigned short int型に変換して戻します。

power()

Numberの累乗（「指定された別の数値」乗）を戻します。

prec()

Numberを指定の桁の精度に丸めて戻します。

round()

Numberを指定の小数点以下の桁に丸めて戻します。負数も可能です。

setNull()

NumberをNULLに設定します。

shift()

指定された値* 10^n（nは正または負）と等しいNumberを戻します。

sign()

指定された値の符号を戻します。指定された値<0の場合は-1、指定された値==0の場合は0（ゼロ）、指定された値>0の場合は1を戻します。

sin()

数値のサインを戻します。

squareroot()

数値の平方根を戻します。

tan()

数値のタンジェントを戻します。

toBytes()

Numberを示すBytesオブジェクトを戻します。

toText()

数値を、書式とNLSパラメータに基づいて書式化した文字列で戻します。

trunc()

Numberを小数点以下n桁に切り捨てた値を戻します。負数も可能です。

Number()

Numberクラスのコンストラクタです。

構文

説明

Number();

デフォルトのコンストラクタです。

Number(
const Number &srcNum);

Numberのコピーを作成します。

Number(
long double &val);

システム固有のlong double型をNumberに変換します。このNumberは、プラットフォーム固有の定数LDBL_DIGの精度を使用して作成されます。

Number(
double val);

システム固有のdouble型をNumberに変換します。このNumberは、プラットフォーム固有の定数DBL_DIGの精度を使用して作成されます。

Number(
float val);

システム固有のfloat型をNumberに変換します。このNumberは、プラットフォーム固有の定数FLT_DIGの精度を使用して作成されます。

Number(
long val);

システム固有のlong型をNumberに変換します。

Number(
int val);

システム固有のint型をNumberに変換します。

Number(
shot val);

システム固有のshort型をNumberに変換します。

Number(
char val);

システム固有のchar型をNumberに変換します。

Number(
signed char val);

システム固有のsigned char型をNumberに変換します。

Number(
unsigned long val);

システム固有のunsigned long型をNumberに変換します。

Number(
unsigned int val);

システム固有のunsigned int型をNumberに変換します。

Number(
unsigned short val);

システム固有のunsigned short型をNumberに変換します。

Number(
unsigned char val);

システム固有の符号なし文字配列をNumberに変換します。

パラメータ

説明

srcNum

新しいNumberオブジェクトにコピーされるコピー元のNumberを指定します。

val

Numberオブジェクトに割り当てられる値を指定します。

abs()

このメソッドは、Numberオブジェクトの絶対値を戻します。

構文

const Number abs() const;

arcCos()

このメソッドは、Numberオブジェクトのアーク・コサインを戻します。

構文

const Number arcCos() const;

arcSin()

このメソッドは、Numberオブジェクトのアーク・サインを戻します。

構文

const Number arcSin() const;

arcTan()

このメソッドは、Numberオブジェクトのアーク・タンジェントを戻します。

構文

const Number arcTan() const;

arcTan2()

このメソッドは、パラメータを指定してNumberオブジェクトのアーク・タンジェントを戻します。戻される値はatan2 (val, x)で、valは指定されたパラメータ、xは現行のNumberオブジェクトです。

構文

const Number arcTan2(
const Number &val) const;

パラメータ

説明

val

arcTangent関数のatan2(val,x)に数値パラメータvalを指定します。

ceil()

このメソッドは、Numberオブジェクト以上で、最も小さい整数を戻します。

構文

const Number ceil() const;

cos()

このメソッドは、Numberオブジェクトのコサインを戻します。

構文

const Number cos() const;

exp()

このメソッドは、Numberオブジェクトの自然指数を戻します。

構文

const Number exp() const;

floor()

このメソッドは、Numberオブジェクト以下で、最も大きい整数を戻します。

構文

const Number floor() const;

fromBytes()

このメソッドは、指定されたバイト文字列で表現したNumberオブジェクトを戻します。

構文

void fromBytes(
const Bytes &str);

パラメータ

説明

str

バイト文字列を指定します。

fromText()

NumberオブジェクトをstringまたはUStringによって表される値に設定します。

値はfmtおよびnlsParamパラメータに基づいて解析されます。nlsParamが渡されない場合は、envpパラメータのグローバリゼーション・サポート設定が使用されます。

関連項目
TO_NUMBERの詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

構文

説明

void fromText(
const Environment *envp,
const string &number,
const string &fmt,
const string &nlsParam = "");

Numberオブジェクトをstringによって表される値に設定します。

void fromText(
const Environment *envp,
const UString &number,
const UString &fmt,
const UString &nlsParam);

NumberオブジェクトをUStringによって表される値に設定します。

パラメータ

説明

envp

OCCI環境を指定します。

number

Numberオブジェクトに変換する数値文字列を指定します。

fmt

書式文字列を指定します。

nlsParam

NLSパラメータ文字列を指定します。nlsParamが指定されている場合は、この指定によって、変換に使用されるNLSパラメータが決まります。nlsParamが指定されていない場合は、NLSパラメータがenvpから選択されます。

hypCos()

このメソッドは、Numberオブジェクトの双曲線コサインを戻します。

構文

const Number hypCos() const;

hypSin()

このメソッドは、Numberオブジェクトの双曲線サインを戻します。

構文

const Number hypSin() const;

hypTan()

このメソッドは、Numberオブジェクトの双曲線タンジェントを戻します。

構文

const Number hypTan() const;

intPower()

このメソッドは、指定された値で累乗した数値オブジェクトの値を持つNumberを戻します。

構文

const Number intPower(
int val) const;

パラメータ

説明

val

数値を累乗する数を指定します。

isNull()

このメソッドは、NumberオブジェクトがNULLかどうかをテストします。NumberオブジェクトがNULLの場合はTRUEを、それ以外の場合はFALSEを戻します。

構文

bool isNull() const;

ln()

このメソッドは、Numberオブジェクトの自然対数を戻します。

構文

const Number ln() const;

log()

このメソッドは、指定されたパラメータを底としてNumberオブジェクトの対数を戻します。

構文

const Number log(
const Number &val) const;

パラメータ

説明

val

対数計算に使用する底を指定します。

operator++()

単項のoperator++()です。これは後置演算子です。

構文

説明

Number& operator++();

このメソッドは、1つ分増加したNumberオブジェクトを戻します。

const Number operator++(
int incr);

このメソッドは、指定された整数分増加したNumberオブジェクトを戻します。

パラメータ

説明

incr

Numberオブジェクトの増分の数値を指定します。

operator--()

単項のoperator--()です。これは前置演算子です。

構文

説明

Number& operator--();

このメソッドは、1つ分減少したNumberオブジェクトを戻します。

const Number operator--(
int decr);

このメソッドは、指定された整数分減少したNumberオブジェクトを戻します。

パラメータ

説明

decr

Numberオブジェクトの減分の数値を指定します。

operator*()

このメソッドは、指定されたパラメータの積を戻します。

構文

Number operator*(
const Number &first,

const Number &second);

パラメータ

説明

first

最初の被乗数を指定します。

second

第2の被乗数を指定します。

operator/()

このメソッドは、指定された2つのパラメータの商を戻します。

構文

Number operator/(
const Number &dividend,
const Number &divisor);

パラメータ

説明

dividend

被除数の値を指定します。

divisor

除数の値を指定します。

operator%()

このメソッドは、指定されたパラメータを除算した剰余を戻します。

構文

Number operator%(
const Number &dividend,
const Number &divider);

パラメータ

説明

dividend

被除数の値を指定します。

divizor

除数の値を指定します。

operator+()

このメソッドは、指定されたパラメータの合計を戻します。

構文

Number operator+(
const Number &first,
const Number &second);

パラメータ

説明

first

加算する最初の数値を指定します。

second

加算する第2の数値を指定します。

operator-()

単項のoperator-()です。このメソッドは、Numberオブジェクトの負の値を戻します。

構文

const Number operator-();

operator-()

このメソッドは、指定されたパラメータの差異を戻します。

構文

Number operator-(
const Number &subtrahend,
const Number &subtractor);

パラメータ

説明

subtrahend

減数の値を指定します。

subtractor

減算する数値を指定します。

operator<()

このメソッドは、指定された第1パラメータが第2パラメータ未満かどうかをチェックします。第1パラメータが第2パラメータ未満の場合はTRUEを、それ以外の場合はFALSEを戻します。いずれかのパラメータが無限大の場合はFALSEを戻します。

構文

bool operator<(
const Number &first,
const Number &second);

パラメータ

説明

first

比較対象の最初の数値を指定します。

second

比較対象の第2の数値を指定します。

operator<=()

このメソッドは、指定された第1パラメータが第2パラメータ以下であるかどうかをチェックします。第1パラメータが第2パラメータ以下の場合はTRUEを、それ以外の場合はFALSEを戻します。いずれかのパラメータが無限大の場合はFALSEを戻します。

構文

bool operator<=(
const Number &first,
const Number &second);

パラメータ

説明

first

比較対象の最初の数値を指定します。

second

比較対象の第2の数値を指定します。

operator>()

このメソッドは、指定された第1パラメータが第2パラメータを超えているかどうかをチェックします。第1パラメータが第2パラメータを超えている場合はTRUEを、それ以外の場合はFALSEを戻します。いずれかのパラメータが無限大の場合はFALSEを戻します。

構文

bool operator>(
const Number &first,
const Number &second);

パラメータ

説明

first

比較対象の最初の数値を指定します。

second

比較対象の第2の数値を指定します。

operator>=()

このメソッドは、指定された第1パラメータが第2パラメータ以上であるかどうかをチェックします。第1パラメータが第2パラメータ以上の場合はTRUEを、それ以外の場合はFALSEを戻します。いずれかのパラメータが無限大の場合はFALSEを戻します。

構文

bool operator>=(
const Number &first,
const Number &second);

パラメータ

説明

first

比較対象の最初の数値を指定します。

second

比較対象の第2の数値を指定します。

operator==()

このメソッドは、指定された2つのパラメータが等しいかどうかをチェックします。2つのパラメータが等しい場合はTRUEを、それ以外の場合はFALSEを戻します。いずれかのパラメータが正の無限大または負の無限大の場合はFALSEを戻します。

構文

bool operator==(
const Number &first,
const Number &second);

パラメータ

説明

first

比較対象の最初の数値を指定します。

second

比較対象の第2の数値を指定します。

operator!=()

このメソッドは、指定された第1パラメータと第2パラメータが等しくないかどうかをチェックします。2つのパラメータが等しくない場合はTRUEを、それ以外の場合はFALSEを戻します。

構文

bool operator!=(
const Number &first,
const Number &second);

パラメータ

説明

first

比較対象の最初の数値を指定します。

second

比較対象の第2の数値を指定します。

operator=()

このメソッドは、指定されたパラメータの値をNumberオブジェクトに割り当てます。

構文

Number& operator=(
const Number &num);

パラメータ

説明

num

Number型のパラメータを指定します。

operator*=()

このメソッドは、Numberオブジェクトを指定されたパラメータで乗算し、その積をNumberオブジェクトに割り当てます。

構文

Number& operator*=(
const Number &num);

パラメータ

説明

num

Number型のパラメータを指定します。

operator/=()

このメソッドは、Numberオブジェクトを指定されたパラメータで除算し、その商をNumberオブジェクトに割り当てます。

構文

Number& operator/=(
const Number &num);

パラメータ

説明

num

Number型のパラメータを指定します。

operator%=()

このメソッドは、Numberオブジェクトを指定されたパラメータで除算し、剰余をNumberオブジェクトに割り当てます。

構文

Number& operator%=(
const Number &num);

パラメータ

説明

num

Number型のパラメータを指定します。

operator+=()

このメソッドは、Numberオブジェクトと指定されたパラメータを加算し、その和をNumberオブジェクトに割り当てます。

構文

Number& operator+=(
const Number &num);

パラメータ

説明

num

Number型のパラメータを指定します。

operator-=()

このメソッドは、Numberオブジェクトから指定されたパラメータを減算し、その差をNumberオブジェクトに割り当てます。

構文

Number& operator-=(
const Number &num);

パラメータ

説明

num

Number型のパラメータを指定します。

operator char()

このメソッドは、Numberオブジェクトの値をシステム固有のchar型に変換して戻します。

構文

operator char() const;

operator signed char()

このメソッドは、Numberオブジェクトの値をシステム固有のsigned char型に変換して戻します。

構文

operator signed char() const;

operator double()

このメソッドは、Numberオブジェクトの値をシステム固有のdouble型に変換して戻します。

構文

operator double() const;

operator float()

このメソッドは、Numberオブジェクトの値をシステム固有のfloat型に変換して戻します。

構文

operator float() const;

operator int()

このメソッドは、Numberオブジェクトの値をシステム固有のint型に変換して戻します。

構文

operator int() const;

operator long()

このメソッドは、Numberオブジェクトの値をシステム固有のlong型に変換して戻します。

構文

operator long() const;

operator long double()

このメソッドは、Numberオブジェクトの値をシステム固有のlong double型に変換して戻します。

構文

operator long double() const;

operator short()

このメソッドは、Numberオブジェクトの値をシステム固有のshort int型に変換して戻します。

構文

operator short() const;

operator unsigned char()

このメソッドは、Numberオブジェクトの値をシステム固有のunsigned char型に変換して戻します。

構文

operator unsigned char() const;

operator unsigned int()

このメソッドは、Numberオブジェクトの値をシステム固有のunsigned int型に変換して戻します。

構文

operator unsigned int() const;

operator unsigned long()

このメソッドは、Numberオブジェクトの値をシステム固有のunsigned long型に変換して戻します。

構文

operator unsigned long() const;

operator unsigned short()

このメソッドは、Numberオブジェクトの値をシステム固有のunsigned short型に変換して戻します。

構文

operator unsigned short() const;

power()

このメソッドは、指定されたパラメータの値で累乗したNumberオブジェクトの値を戻します。

構文

const Number power(
const Number &val) const;

パラメータ

説明

val

この数値で累乗する値を指定します。

prec()

このメソッドは、パラメータに指定された桁数の精度に丸めたNumberオブジェクトの値を戻します。

構文

const Number prec(
int digits) const;

パラメータ

説明

digits

精度の桁数を指定します。

round()

このメソッドは、パラメータに指定された小数点以下の桁数に丸めたNumberオブジェクトの値を戻します。

構文

const Number round(
int decPlace) const;

パラメータ

説明

decPlace

小数点の右側の桁数を指定します。

setNull()

このメソッドは、Numberオブジェクトの値をNULLに設定します。

構文

void setNull();

shift()

このメソッドは、指定されたパラメータに従って10の累乗倍したNumberオブジェクトを戻します。

構文

const Number shift(
int val) const;

パラメータ

説明

val

整数値を指定します。

sign()

このメソッドは、Numberオブジェクトの値の符号を戻します。Numberオブジェクトが負の場合は、戻される整数パラメータを使用してDateオブジェクトを作成します。Numberオブジェクトが0 (ゼロ)の場合は、戻される整数パラメータを使用してDateオブジェクトを作成します。Numberオブジェクトが正の場合は、1を戻します。

構文

const int sign() const;

sin()

このメソッドは、Numberオブジェクトのサイン値を戻します。

構文

const Number sin() const;

squareroot()

このメソッドは、Numberオブジェクトの平方根を戻します。

構文

const Number squareroot() const;

tan()

このメソッドは、Numberオブジェクトのタンジェント値を戻します。

構文

const Number tan() const;

toBytes()

このメソッドは、NumberオブジェクトをBytesオブジェクトに変換します。バイト表現は、長さを除いた書式を前提にしています。つまり、Byte.length()メソッドでは有効なバイト長が指定され、0（ゼロ）番目のバイトは指数バイトです。

構文

Bytes toBytes() const;

toText()

指定されたパラメータに基づいて、Numberオブジェクトを書式化したstringまたはUStringに変換します。

関連項目
TO_NUMBERの詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

構文

説明

string toText(
const Environment *envp,
const string &fmt,
const string &nlsParam = "") const;

指定されたパラメータに基づいて、Numberオブジェクトを書式化したstringに変換します。

UString toText(
const Environment *envp,
const UString &fmt,
const UString &nlsParam) const;

指定されたパラメータに基づいて、NumberオブジェクトをUStringに変換します。

パラメータ

説明

envp

OCCI環境を指定します。

fmt

書式文字列を指定します。

nlsParam

NLSパラメータ文字列を指定します。nlsParamが指定されている場合は、この指定によって、変換に使用されるNLSパラメータが決まります。nlsParamが指定されていない場合は、NLSパラメータがenvpから選択されます。

trunc()

このメソッドは、指定されたパラメータに従って小数点以下の桁数を切り捨てたNumberオブジェクトを戻します。

構文

const Number trunc(
int decPlace) const;

パラメータ

説明

decPlace

小数点の右側の値の切り捨てる桁の位置を指定します。

PObjectクラス

OCCIには、アプリケーションが次の操作をオブジェクトに対して実行できるように、オブジェクト・ナビゲーショナル・コールが用意されています。

- オブジェクトの作成、アクセス、ロック、削除、コピーおよびフラッシュ

- オブジェクトへの参照の取得

このクラスによって、型の定義に携わる担当者は、クラスが永続または一時インスタンスを保持できる時点を指定できます。PObjectから導出されたクラスのインスタンスは、永続または一時のいずれかです。たとえば、永続性可能なクラスAは、PObjectクラスを継承します。

class A : PObject { ... }

NULLのPObjectに対する有効なメソッドは、setName()、isNull()およびoperator=()のみです。

lock()などの一部のメソッドは、永続インスタンスのみに適用され、一時インスタンスには適用されません。

表13-31 PObjectクラスで使用される列挙値

属性

オプション

LockOption

- OCCI_LOCK_WAITは、キャッシュに対してロックの取得後にのみオブジェクトを確保するように指示します。オブジェクトが別のユーザーによりロックされている場合、このオプションを指定した確保コールはロックを取得できるまで待機してからコール元に戻ります。これはSELECT FOR UPDATEと等価です。

- OCCI_LOCK_NOWAITは、キャッシュに対してロックの取得後にのみオブジェクトを確保するように指示します。オブジェクトが別のユーザーによりロックされている場合は待機しません。これはSELECT FOR UPDATE WITH NOWAITと等価です。

UnpinOption

- OCCI_PINCOUNT_RESETは、オブジェクトの確保カウントを0にリセットします。

- OCCI_PINCOUNT_DECRは、オブジェクトの確保カウントを1だけ減らします。

表13-32 PObjectメソッドの概要

メソッド

概要

PObject()

PObjectクラスのコンストラクタです。

flush()

修正した永続オブジェクトをデータベース・サーバーにフラッシュします。

getConnection()

PObjectオブジェクトのインスタンス化元の接続を戻します。

getRef()

指定された永続オブジェクトへの参照を戻します。

getSQLTypeName()

このクラスのOracleデータベース型名を戻します。

isLocked()

永続オブジェクトがロックされているかどうかを確認します。

isNull()

オブジェクトがNULLかどうかをテストします。

lock()

データベース・サーバーの永続オブジェクトをロックします。ロックがない場合、デフォルトのモードはロックの待機です。

markDelete()

永続オブジェクトに削除済マークを設定します。

markModified()

永続オブジェクトに修正済または使用済マークを設定します。

operator=()

あるPObjectを別のPObjectに割り当てます。

operator delete()

永続オブジェクトをアプリケーション・キャッシュのみから削除します。

operator new()

永続/一時インスタンスを新規作成します。

pin()

オブジェクトを確保します。

setNull()

オブジェクトの値をNULLに設定します。

unmark()

オブジェクトの使用済マークを解除します。

unpin()

オブジェクトの確保を解除します。デフォルトのモードでは、オブジェクトの確保カウントは1つ分減少します。

PObject()

PObjectクラスのコンストラクタです。

構文

説明

PObject();

NULLのPObjectを作成します。

PObject(
const PObject &obj);

PObjectのコピーを作成します。

パラメータ

説明

obj

コピー元のオブジェクトを指定します。

flush()

このメソッドは、修正した永続オブジェクトをデータベース・サーバーにフラッシュします。

構文

void flush();

getConnection()

永続オブジェクトがインスタンス化された元の接続を戻します。

構文

const Connection *getConnection() const;

getRef()

このメソッドは、永続オブジェクトへの参照を戻します。

構文

RefAny getRef() const;

getSQLTypeName()

このクラスのOracleデータベース型名を戻します。

構文

string getSQLTypeName() const;

isLocked()

このメソッドは、永続オブジェクトがロックされているかどうかを確認します。永続オブジェクトがロックされている場合はTRUEを、それ以外の場合はFALSEを戻します。

構文

bool isLocked() const;

isNull()

このメソッドは、永続オブジェクトがNULLかどうかをテストします。永続オブジェクトがNULLの場合はTRUEを、それ以外の場合はFALSEを戻します。

構文

bool isNull() const;

lock()

データベース・サーバーの永続オブジェクトをロックします。

構文

void lock(
PObject::LockOption lock_option);

パラメータ

説明

lock_option

ロック・オプションです。表13-31を参照してください。

markDelete()

このメソッドは、永続オブジェクトに削除済マークを設定します。

構文

void markDelete();

markModified()

このメソッドは、永続オブジェクトに修正済または使用済マークを設定します。

構文

void mark_Modified();

operator=()

このメソッドは、永続オブジェクトの値をこのPObjectオブジェクトに割り当てます。オブジェクトの性質（一時または永続）は保持されます。NULL情報がソース・インスタンスからコピーされます。

構文

PObject& operator=(
const PObject& obj);

パラメータ

説明

obj

割り当てられる値の取得元のオブジェクトを指定します。

operator delete()

永続オブジェクトまたは一時オブジェクトを削除します。永続オブジェクトの場合、この削除演算子は、オブジェクトをアプリケーション・キャッシュのみから削除します。データベース・サーバーからオブジェクトを削除するには、markDelete()メソッドをコールします。

構文

void operator delete(
void *obj,
size_t size);

パラメータ

説明

obj

削除するオブジェクトへのポインタを指定します。

size

（オプション）サイズはオブジェクトから暗黙的に取得されます。

operator new()

このメソッドは、新規オブジェクトを作成します。接続および表名が指定されている場合は、永続オブジェクトが作成されます。それ以外の場合は、一時オブジェクトが作成されます。

構文

説明

void *operator new(
size_t size);

サイズのみを指定してデフォルトの新規オブジェクトを作成します。

void *operator new(
size_t size,
const Connection *conn,
const string& tableName,
const char *typeName);

クライアント側のキャラクタ・セットがマルチバイトの場合の、一時オブジェクトの作成に使用します。

void *operator new(
size_t size,
const Connection *conn,
const string& tableName,
const string& typeName,
const string& schTableName="",
const string& schTypeName="");

クライアント側のキャラクタ・セットがマルチバイトの場合の、永続オブジェクトの作成に使用します。

void *operator new(
size_t size,
const Connection *conn,
const UString& tableName,
const UString& typeName,
const UString& schTableName="",
const UString& schTypeName="");

クライアント側のキャラクタ・セットがUnicode（UTF16）の場合の、永続オブジェクトの作成に使用します。

パラメータ

説明

size

オブジェクトのサイズを指定します。

conn

永続オブジェクトが作成されるデータベースへの接続を指定します。

tableName

データベース・サーバーにある表の名前を指定します。

typeName

このC++クラスに対応するSQLの型名を指定します。フォーマットは、<schemaname>.<typename>です。

schTableName

スキーマの表の名前を指定します。

schTypeName

スキーマの型の名前を指定します。

pin()

このメソッドは、オブジェクトを確保し、確保カウントを1つ増やします。オブジェクトが確保されている場合は、このオブジェクト・インスタンスへの参照がない場合でもキャッシュによって解放されることはありません。

構文

void pin();

setNull()

このメソッドは、オブジェクトの値をNULLに設定します。

構文

void setNull();

unmark()

このメソッドは、永続オブジェクトの修正済または削除済マークを解除します。

構文

void unmark();

unpin()

このメソッドは、永続オブジェクトの確保を解除します。デフォルトのモードでは、オブジェクトの確保カウントは1つ分減少します。このメソッドがOCCI_PINCOUNT_RESETでコールされると、オブジェクトの確保カウントがリセットされます。確保カウントがリセットされると、このオブジェクトを指し示している参照（Ref）はすべて無効になります。キャッシュは、解放の対象となるオブジェクトを設定し、必要に応じてメモリーを再生します。

構文

void unpin(
UnpinOption mode=OCCI_PINCOUNT_DECR);

パラメータ

説明

mode

UnpinOptionモード、つまり確保カウントを減らすか、0（ゼロ）にリセットするかを指定します。表13-31を参照してください。有効な値は、OCCI_PINCOUNT_RESETおよびOCCI_PINCOUNT_DECRです。

Producerクラス

Producerは、Messageをエンキューしてエンキュー・オプションを定義します。

表13-33 Producerクラスで使用される列挙値

属性

オプション

EnqueueSequence

- ENQ_BEFOREは、メッセージが、関連メッセージIDで指定したメッセージの前にエンキューされることを示します。

- ENQ_TOPは、メッセージが他のすべてのメッセージの前にエンキューされることを示します。

Visibility

- ENQ_IMMEDIATEは、エンキューを現行のトランザクションの一部にしないことを示します。操作は固有のトランザクションを構成します。

- ENQ_ON_COMMITは、エンキューを現行のトランザクションの一部にすることを示します。トランザクションのコミット時に操作が完了します。これは、デフォルト設定です。

表13-34 Producerメソッドの概要

メソッド

概要

Producer()

Producerクラスのコンストラクタです。

getQueueName()

Messageがエンキューされるキューの名前を取り出します。

getRelativeMessageId()

順序逸脱操作で参照されるMessageのIDを取得します。

getSequenceDeviation()

Messageをキューにある他のMessageの前にデキューする必要があるかどうかを示す情報を取得します。

getTransformation()

Messageのエンキュー前に適用される変換を取得します。

getVisibility()

エンキュー要求のトランザクション動作を取得します。

isNull()

ProducerがNULLかどうかをテストします。

send()

Messageをエンキューして送信します。

operator=()

Producerの代入演算子です。

setNull()

Producerのスコープがその作成に使用されたConnectionを超えている場合はメモリーを解放します。

setQueueName()

Messageがエンキューされるキューの名前を指定します。

setRelativeMessageId()

順序逸脱操作で参照されるMessageのIDを指定します。

setSequenceDeviation()

Messageをキューにある他のMessageの前にデキューする必要があるかどうかを指定します。

setTransformation()

Messageのエンキュー前に適用される変換を指定します。

setVisibility()

エンキュー要求のトランザクション動作を指定します。

Producer()

Producerオブジェクトのコンストラクタです。

構文

説明

Producer(
const Connection *conn);

指定したConnectionを使用してProducerオブジェクトを作成します。

Producer(
const Connection *conn,
const string& queue);

指定したConnectionとキュー名を使用してProducerオブジェクトを作成します。

パラメータ

説明

conn

新規Producerオブジェクトの接続を指定します。

queue

新規Producerオブジェクトで使用されるキューを指定します。

getQueueName()

Messageがエンキューされるキューの名前を取り出します。

構文

string getQueueName() cosnt;

getRelativeMessageId()

順序逸脱操作で参照されるMessageのIDを取得します。順序逸脱が指定されている場合にのみ使用します。それ以外の場合は無視されます。

構文

Bytes getRelativeMessageId() const;

getSequenceDeviation()

Messageをキューにある他のMessageの前にデキューする必要があるかどうかを示す情報を取得します。有効な戻り値は、ENQ_BEFOREおよびENQ_TOPです(表13-33の定義を参照)。

構文

EnqueueSequence getSequenceDeviation() const;

getTransformation()

Messageのエンキュー前に適用される変換を取得します。

構文

string getTransformation() const;

getVisibility()

エンキュー要求のトランザクション動作を取得します。Visibilityの定義は、表13-33を参照してください。

構文

Visibility getVisibility() const;

isNull()

ProducerがNULLかどうかをテストします。ProducerがNULLの場合はTRUEを、それ以外の場合はFALSEを戻します。

構文

bool isNull() const;

operator=()

Producerの代入演算子です。

構文

void operator=(
const Producer& prod);

パラメータ

説明

prod

オリジナルのProducerオブジェクトです。

send()

Messageをエンキューして送信します。

構文

説明

Bytes send(
Message& msg);

前にsetQueueName()メソッドでqueueNameを設定している場合に使用されます。

Bytes send(
Message& msg,
string& queue);

Messageを指定したqueueNameにエンキューします。

パラメータ

説明

msg

エンキューするMessageを指定します。

queue

データベース内で有効なキューの名前を指定します。

setNull()

Producerに関連付けられているメモリーを解放します。インナー・スコープで操作中の場合を除き、このコールはConnectionを終了する前に行う必要があります。

構文

void setNull();

setQueueName()

Messageがエンキューされるキューの名前を指定します。通常は、同じキューに複数のメッセージをエンキューするときに使用します。

構文

void setQueueName(
const string& queue);

パラメータ

説明

queue

Messageをエンキューする、データベース内で有効なキューの名前を指定します。

setRelativeMessageId()

順序逸脱操作で参照されるMessageのIDを指定します。順序逸脱を指定していない場合、このパラメータは無視されます。Messageのエンキューごとに設定できます。

構文

void setRelativeMessageId(
const Bytes& msgid);

パラメータ

説明

msgid

Messageの相対IDを指定します。

setSequenceDeviation()

エンキュー対象のMessageを、キューにある他のMessageの前にデキューする必要があるかどうかを指定します。Messageのエンキューごとに設定できます。

構文

void setSequenceDeviation(
EnqueueSequence option);

パラメータ

説明

option

設定するエンキューの順序の定義は、表13-33を参照してください。

setTransformation()

Messageのエンキュー前に適用される変換関数を指定します。

構文

void setTransformation(
string &fName);

パラメータ

説明

fName

SQL変換関数を指定します。

setVisibility()

エンキュー要求のトランザクション動作を指定します。Messageのエンキューごとに設定できます。

構文

void setVisibility(
Visibility option);

パラメータ

説明

option

設定するVisibilityオプションの定義は、表13-33を参照してください。

Refクラス

SQL REF値のC++プログラミング言語によるマッピングです。このマッピングは、データベースにあるSQL構造型の値への参照です。

各REF値には、参照先オブジェクトの一意の識別子があります。SQL REF値は、参照するSQL構造型のかわりに使用できます。また、表の列値または構造型の属性値として使用できます。

SQL REF値は、SQL構造型への論理ポインタであるため、デフォルトの場合、Refオブジェクトも論理ポインタです。したがって、RefオブジェクトとしてSQL REF値を取得しても、クライアントの構造型の属性をマテリアライズしません。

NULLのRefオブジェクトに対する有効なメソッドは、isNull()およびoperator=()のみです。

Refオブジェクトは永続記憶域に保存でき、operator*()、operator->()またはptr()メソッドによって間接参照されます。Tは、PObjectから導出したクラスであることが必要です。次の項では、T*とPObject*が同じ意味で使用されています。

表13-35 Refクラスで使用される列挙値

属性

オプション

LockOptions

- OCCI_LOCK_NONEは、Refオブジェクトに対するロック設定を消去します。

- OCCI_LOCK_Xは、オブジェクトがロックされていて、オブジェクトが別のセッションによってロックされる場合はロックが利用できるようになるまで待機する必要があることを示します。

- OCCI_LOCK_X_NOWAITは、オブジェクトがロックされていて、オブジェクトが別のセッションによってロックされる場合にはエラーが戻されることを示します。

PrefetchOption

- OCCI_MAX_PREFETCH_DEPTHは、フェッチが最大の深さまで実行されることを示します。

表13-36 Refメソッドの概要

メソッド

概要

Ref()

Refオブジェクトのコンストラクタです。

clear()

参照を消去します。

getConnection()

このRefが作成された元の接続を戻します。

isClear()

Refが消去されているかどうかをチェックします。

isNull()

RefがNULLかどうかをチェックします。

markDelete()

参照オブジェクトに削除済マークを設定します。

operator->()

Refを間接参照し、必要に応じてオブジェクトを確保します。

operator*()

Refを間接参照し、必要に応じてオブジェクトを確保またはフェッチします。

operator==()

Refとポインタが同じオブジェクトを参照しているかどうかをチェックします。

operator!=()

Refとポインタが異なるオブジェクトを参照しているかどうかをチェックします。

operator=()

代入演算子です。

ptr()

PObjectへのポインタを戻します。Refを間接参照し、必要に応じてオブジェクトを確保またはフェッチします。

setLock()

参照元オブジェクトにロック・オプションを設定します。

setNull()

RefをNULLに設定します。

setPrefetch()

複合オブジェクト検索のプリフェッチ・オプションを設定します。

unmarkDelete()

参照先オブジェクトの削除マークを解除します。

Ref()

Refオブジェクトのコンストラクタです。

構文

説明

Ref();

NULLのRefを作成します。

Ref(
const Ref<T> &src);

Refのコピーを作成します。

パラメータ

説明

src

コピーするRefを指定します。

clear()

このメソッドは、Refオブジェクトを消去します。

構文

void clear();

getConnection()

Refオブジェクトがインスタンス化された元の接続を戻します。

構文

const Connection *getConnection() const;

isClear()

このメソッドは、Refオブジェクトが消去されているかどうかをチェックします。

構文

bool isClear() const;

isNull()

このメソッドは、RefオブジェクトがNULLかどうかをテストします。RefオブジェクトがNULLの場合はTRUEを、それ以外の場合はFALSEを戻します。

構文

bool isNull() const;

markDelete()

このメソッドは、参照オブジェクトに削除済マークを設定します。

構文

void markDelete();

operator->()

このメソッドは、Refオブジェクトを間接参照し、必要に応じて参照オブジェクトを確保またはフェッチします。参照先オブジェクトのプリフェッチ属性が設定されている場合は、結果的にオブジェクトのグラフのプリフェッチとなる場合があります。

構文

説明

T *operator->();

constでないRefオブジェクトを間接参照し、確保またはフェッチします。

const T *operator->() const;

constのRefオブジェクトを間接参照し、確保またはフェッチします。

operator*()

このメソッドは、Refオブジェクトを間接参照し、必要に応じて参照オブジェクトを確保またはフェッチします。参照先オブジェクトのプリフェッチ属性が設定されている場合は、結果的にオブジェクトのグラフのプリフェッチとなる場合があります。オブジェクトを削除する必要はありません。有効範囲外になると、デストラクタが自動的にコールされます。

構文

説明

T& operator*();

constでないRefオブジェクトを間接参照し、確保またはフェッチします。

const T& operator*() const;

constのRefオブジェクトを間接参照し、確保またはフェッチします。

operator==()

このメソッドは、2つのRefオブジェクトが同じオブジェクトを参照しているかどうかを確認します。2つのRefオブジェクトが同じオブジェクトを参照している場合はTRUEを、それ以外の場合はFALSEを戻します。

構文

bool operator == (
const Ref<T> &ref) const;

パラメータ

説明

ref

比較するオブジェクトのRefオブジェクトを指定します。

operator!=()

このメソッドは、2つのRefオブジェクトが同じオブジェクトを参照しているかどうかを確認します。2つのRefオブジェクトが同じオブジェクトを参照していない場合はTRUEを、それ以外の場合はFALSEを戻します。

構文

bool operator!= (
const Ref<T> &ref) const;

パラメータ

説明

ref

比較するオブジェクトのRefオブジェクトを指定します。

operator=()

RefまたはオブジェクトをRefに割り当てます。最初の場合は複数のRefが割り当てられ、2番目の場合はRefがオブジェクトから作成され、その後に割り当てられます。

構文

説明

Ref<T>& operator=(
const Ref<T> &src);

RefをRefに割り当てます。

Ref<T>& operator=(
const T *)obj;

Refをオブジェクトに割り当てます。

パラメータ

説明

src

割り当てられるソースのRefオブジェクトを指定します。

obj

Refオブジェクトが割り当てられるソース・オブジェクトのポインタを指定します。

ptr()

PObjectへのポインタを戻します。この演算子はRefを間接参照し、必要に応じてオブジェクトを確保またはフェッチします。Refのプリフェッチ属性が設定されている場合は、結果的にオブジェクトのグラフのプリフェッチとなる場合があります。

構文

説明

T *ptr();

constでないRefオブジェクトのポインタを戻します。

const T *ptr() const;

constのRefオブジェクトのポインタを戻します。

setLock()

このメソッドは、間接参照する場合のオブジェクトのロック方法を指定します。

構文

void setLock(lockOptions);

引数

説明

lockOptions

ロック・オプションを指定します(表13-35のLockOptionsの定義を参照)。

setNull()

このメソッドは、RefオブジェクトをNULLに設定します。

構文

void setNull();

setPrefetch()

複合オブジェクト検索のプリフェッチ・オプションを設定します。このメソッドは、Refを介して到達できる（推移閉包）すべてのオブジェクトをプリフェッチする場合のレベルを指定します。選択した属性の型のみをプリフェッチする場合は、このメソッドの最初のバージョンを使用します。このメソッドは、参照先のオブジェクトのどのRef属性をオブジェクトのプリフェッチ用にたどるか（複合オブジェクト検索）、およびどのレベルまでそれらのリンクをたどるかを指定します。

構文

説明

void setPrefetch(
const string &typeName,
unsigned int depth);

型名とレベルを使用して、複合オブジェクト検索のプリフェッチ・オプションを設定します。

void setPrefetch(
unsigned int depth);

レベルのみを使用して、複合オブジェクト検索のプリフェッチ・オプションを設定します。

void setPrefetch(
const string &schName,
const string &typeName,
unsigned int depth);

スキーマ、型名およびレベルを使用して、複合オブジェクト検索のプリフェッチ・オプションを設定します。

void setPrefetch(
const UString &schName,
const UString &typeName,
unsigned int depth);

スキーマ、型名およびレベル、さらにUStringのサポートを使用して、複合オブジェクト検索のプリフェッチ・オプションを設定します。

パラメータ

説明

typeName

プリフェッチするRef属性の型を指定します。

schName

プリフェッチするRef属性のスキーマ名を指定します。

depth

リンクをたどる深さのレベルを指定します。PrefetchOptionを使用できます。表13-35の定義を参照してください。

unmarkDelete()

このメソッドは、参照オブジェクトの使用済および削除用マークを解除します。

構文

void unmarkDelete();

RefAnyクラス

RefAnyクラスは、あらゆる型への参照をサポートするために設計されています。このクラスの主な目的は、一般的な参照を処理し、型の階層でRefの変換を可能にすることです。RefAnyオブジェクトは、Ref<x>とRef<y>（xとyは異なる型）の2つの型の中継として使用できます。

表13-37 RefAnyメソッドの概要

メソッド

概要

RefAny()

RefAnyクラスのコンストラクタです。

clear()

参照を消去します。

getConnection()

このRefが作成された元の接続を戻します。

isNull()

RefAnyオブジェクトがNULLかどうかをチェックします。

markDelete()

オブジェクトを削除済にマークします。

operator=()

RefAnyの代入演算子です。

operator==()

このRefAnyオブジェクトが指定したRefAnyと等しいかどうかをチェックします。

operator!=()

等しくないかどうかをチェックします。

unmarkDelete()

オブジェクトの削除済マークを解除します。

RefAny()

Ref<T>は、常にRefAnyに変換できます。Ref<T>テンプレートには変換を実行するためのメソッドがあります。各Ref<T>には、コンストラクタ、およびRefAnyへの参照を取得する割当て演算子があります。

構文

説明

RefAny();

NULLのRefAnyを作成します。

RefAny(
const Connection *sessptr,
const OCIRef *ref);

セッションのポインタと参照からRefAnyを作成します。

RefAny(
const RefAny& src);

RefAnyを別のRefAnyオブジェクトのコピーとして作成します。

パラメータ

説明

sessptr

セッションのポインタを指定します。

ref

参照を指定します。

src

割り当てられるソースのRefAnyオブジェクトを指定します。

clear()

このメソッドは、参照を消去します。

構文

void clear();

getConnection()

この参照がインスタンス化された元の接続を戻します。

構文

const Connection* getConnection() const;

isNull()

このRefが指すオブジェクトがNULLの場合はTRUEを、それ以外の場合はFALSEを戻します。

構文

bool isNull() const;

markDelete()

このメソッドは、参照オブジェクトに削除済マークを設定します。

構文

void markDelete();

operator=()

RefAnyの代入演算子です。

構文

RefAny& operator=(
const RefAny& src);

パラメータ

説明

src

割り当てられるソースのRefAnyオブジェクトを指定します。

operator==()

このrefとRefAnyオブジェクトを比較し、両方がキャッシュ内の同じオブジェクトを参照している場合はTRUEを、それ以外の場合はFALSEを戻します。

構文

bool operator== (
const RefAny &refAnyR) const;

パラメータ

説明

refAnyR

比較対象のRefAnyオブジェクトを指定します。

operator!=()

このrefとRefAnyオブジェクトを比較し、両方がキャッシュ内の同じオブジェクトを参照していない場合はTRUEを、それ以外の場合はFALSEを戻します。

構文

bool operator!= (
const RefAny &refAnyR) const;

パラメータ

説明

refAnyR

比較対象のRefAnyオブジェクトを指定します。

unmarkDelete()

このメソッドは、参照オブジェクトの使用済マークを解除します。

構文

void unmarkDelete();

ResultSetクラス

ResultSetは、Statementの実行で生成されたデータの表へのアクセスを提供します。表の行は順序に従って取り出されます。1行の中の列値は、どのような順序でもアクセスできます。

ResultSetは、データの現在行を指し示すカーソルを保持しています。最初、カーソルは第1行目の前にあります。nextメソッドによって、カーソルが次の行に移動します。

getxxx()メソッドを使用して、現在行の列値を取り出します。列の索引番号を使用して値を取り出すことができます。各列には、1から順に番号が付けられています。getxxx()メソッドの場合、OCCIは、基礎となるデータを指定されたC++型に変換して、C++の値を戻そうとします。SQL型はResultSet::getxxx()メソッドを使用してC++型にマップされます。

ResultSetの列の番号、型およびプロパティは、getColumnListMetaData()メソッドが戻すMetaDataオブジェクトによって指定されます。

表13-38 ResultSetクラスで使用される列挙値

属性

オプション

Status

- DATA_AVAILABLEは、サーバーから1つ以上の行が正常にフェッチされたことを示します。最大で、要求した数の行（numRows）が戻されます。ストリーム・モードでは、numRowsが1より大きい場合に、取得された正確な行数を確認するためにgetNumArrayRows()メソッドを使用できます。

- STREAM_DATA_AVAILABLEは、アプリケーションがgetCurrentStreamColumn()メソッドをコールしてストリームを読み込むことを指定します。

- END_OF_FETCHは、フェッチできるデータがなくなったことを示します。

表13-39 ResultSetメソッドの概要

メソッド

説明

cancel()

ResultSetを取り消します。

closeStream()

指定されたStreamをクローズします。

getBDouble()

現在行の列の値をBDoubleで戻します。

getBfile()

現在行の列の値をBfileで戻します。

getBFloat()

現在行の列の値をBFloatで戻します。

getBlob()

現在行の列の値をBlobオブジェクトで戻します。

getBytes()

現在行の列の値をBytes配列で戻します。

getCharSet()

データをフェッチするキャラクタ・セットを戻します。

getCharSetUString()

データをフェッチするキャラクタ・セットをUStringで戻します。

getClob()

現在行の列の値をClobオブジェクトで戻します。

getColumnListMetaData()

結果セット列の記述情報をMetaDataオブジェクトで戻します。

getCurrentStreamColumn()

現行の読込み可能Streamの列索引を戻します。

getCurrentStreamRow()

処理しているResultSetの現在行を戻します。

getCursor()

ネストしたカーソルをResultSetで戻します。

getDate()

現在行の列の値をDateオブジェクトで戻します。

getDatabaseNCHARParam()

データがNCHARキャラクタ・セットにあるかどうかを戻します。

getDouble()

現在行の列の値をC++ のdouble型で戻します。

getFloat()

現在行の列の値をC++のfloat型で戻します。

getInt()

現在行の列の値をC++のint型で戻します。

getIntervalDS()

現在行の列の値をIntervalDSで戻します。

getIntervalYM()

現在行の列の値をIntervalYMで戻します。

getMaxColumnSize()

setMaxColumnSize()で設定された値を戻します。

getNumArrayRows()

最後の配列フェッチで実際にフェッチした行数を戻します。

getNumber()

現在行の列の値をNumberオブジェクトで戻します。

getObject()

現在行の列の値をPObjectで戻します。

getRef()

現在行の列の値をRefで戻します。

getRowid()

SELECT FOR UPDATE文の現行のROWIDを戻します。

getRowPosition()

現在行の位置のROWIDを戻します。

getStatement()

ResultSetのStatementを戻します。

脚注 0getStream()

現在行の列の値をStreamで戻します。

getString()

現在行の列の値を文字列で戻します。

getTimestamp()

現在行の列の値をTimestampオブジェクトで戻します。

getUInt()

現在行の列の値をC++のunsigned int型で戻します。

getUString()

現在行の列の値をUStringで戻します。

getVector()

指定されたコレクション・パラメータをベクターで戻します。

getVectorOfRefs()

現行の位置の列をRefのベクターで戻します。

isNull()

値がNULLかどうかをチェックします。

isTruncated()

切捨てが発生したかどうかをチェックします。

next()

ResultSetの次の行を現在行にします。

preTruncationLength()

切捨て前のパラメータの実際の長さを戻します。

setBinaryStreamMode()

列をバイナリ・ストリームで戻すように指定します。

setCharacterStreamMode()

列をキャラクタ・ストリームで戻すように指定します。

setCharSet()

データを戻すキャラクタ・セットを指定します。

setCharSetUString()

データを戻すキャラクタ・セットを指定します。

setDatabaseNCHARParam()

パラメータを、データベースのNCHARキャラクタ・セットのデータが含まれている列から取り出そうとする場合は、true値を渡すことによって、そのことをOCCIに通知する必要があります。

setDataBuffer()

データをフェッチする、または収集および分散のバインドと定義が行われるデータ・バッファを指定します。

setErrorOnNull()

NULL値が読み取られた場合の例外処理を有効化または無効化します。

setErrorOnTruncate()

切捨てが発生する際の例外を使用可能または使用禁止にします。

setPrefetchMemorySize()

サーバーへの各ラウンドトリップでフェッチしたデータを格納するために、OCCIによって繰り返し使用されるメモリー・サイズを設定します。

setPrefetchRowCount()

サーバーへの各ラウンドトリップで、OCCIによって繰り返しフェッチされる行数を設定します。

setMaxColumnSize()

列から読み込むデータの最大量(バイト単位)を指定します。envが作成された環境のキャラクタ・セットに基づく必要があります。

status()

ResultSetの現在のステータスを戻します。

cancel()

このメソッドは結果セットを取り消します。

構文

void cancel();

closeStream()

このメソッドは、パラメータstreamによって指定されたストリームをクローズします。

構文

void closeStream(
Stream *stream);

パラメータ

説明

stream

クローズするStreamを指定します。

getBDouble()

このメソッドは、現在行の列の値をBDoubleで戻します。値がSQLのNULLの場合、結果はNULLです。

構文

BDouble getBDouble(
unsigned int colIndex);

パラメータ

説明

colIndex

列の索引を、第1列は1、第2列は2のように指定します。

getBfile()

このメソッドは、現在行の列の値をBfileで戻します。列の値を戻します。値がSQLのNULLの場合、結果はNULLです。

構文

Bfile getBfile(
unsigned int colIndex);

パラメータ

説明

colIndex

列の索引を、第1列は1、第2列は2のように指定します。

getBFloat()

このメソッドは、現在行の列の値をBFloatで戻します。値がSQLのNULLの場合、結果はNULLです。

構文

BFloat getBFloat(
unsigned int colIndex);

パラメータ

説明

colIndex

列の索引を、第1列は1、第2列は2のように指定します。

getBlob()

現在行の列の値をBlobで取得します。列の値を戻します。値がSQLのNULLの場合、結果はNULLです。

構文

Blob getBlob(
unsigned int colIndex);

パラメータ

説明

colIndex

列の索引を、第1列は1、第2列は2のように指定します。

getBytes()

現在行の列の値をBytes配列で取得します。バイト数はサーバーによって戻される行の値を示します。列の値を戻します。値がSQLのNULLの場合、結果はNULLの配列です。

構文

Bytes getBytes(
unsigned int colIndex);

パラメータ

説明

colIndex

列の索引を、第1列は1、第2列は2のように指定します。

getCharSet()

データをフェッチするキャラクタ・セットを文字列で取得します。

構文

string getCharSet(
unsigned int colIndex) const;

パラメータ

説明

colIndex

列の索引を、第1列は1、第2列は2のように指定します。

getCharSetUString()

データをフェッチするキャラクタ・セットを文字列で取得します。

構文

UString getCharSetUString(
unsigned int colIndex) const;

パラメータ

説明

colIndex

列の索引を、第1列は1、第2列は2のように指定します。

getClob()

現在行の列の値をClobで取得します。列の値を戻します。値がSQLのNULLの場合、結果はNULLです。

構文

Clob getClob(
unsigned int colIndex);

パラメータ

説明

colIndex

列の索引を、第1列は1、第2列は2のように指定します。

getColumnListMetaData()

ResultSetの列の番号、型およびプロパティは、getMetaDataメソッドによって指定されます。ResultSetの列の説明を戻します。指定された列の値をPObjectで戻します。C++オブジェクトの型は、Environmentのマップに登録されている列のSQL型に対応するC++ PObject型になります。このメソッドは、SQLユーザー定義型のデータをマテリアライズするために使用します。

構文

vector<MetaData> getColumnListMetaData() const;

getCurrentStreamColumn()

結果セットに入力Streamパラメータがある場合、このメソッドは読込みが必要な現行の入力Streamの列索引を戻します。出力Streamを読み取る必要がない場合、または結果セットに入力Stream列がない場合、このメソッドは0 (ゼロ)を戻します。読込みが必要な現行の入力Stream列の列索引を戻します。

構文

unsigned int getCurrentStreamColumn() const;

getCurrentStreamRow()

結果に入力Streamがない場合、このメソッドはOCCIで処理中の結果セットの現在行を戻します。このメソッドは、行の配列セットに含まれる行がすべて処理された後にコールされると0（ゼロ）を戻します。処理中の現在行の行番号を戻します。第1行目は1、第2行目は2のようになります。

構文

unsigned int getCurrentStreamRow() const;

getCursor()

ネストしたカーソルをResultSetで取得します。この結果セットからデータをフェッチできます。ネストしたカーソルは、CURSOR(SELECT...)句でネストされた問合せの結果として生じます。

SELECT last_name,
CURSOR(SELECT  department_name FROM departments)
FROM employees WHERE last_name = 'JONES'

戻されるREF CURSORが複数の場合は、次のREF CURSORを取得してフェッチを開始する前に、各カーソルからのデータを完全にフェッチする必要があります。ネストしたカーソルに対してResultSetを1つ戻します。

構文

ResultSet * getCursor(
unsigned int colIndex);

パラメータ

説明

colIndex

列の索引を、第1列は1、第2列は2のように指定します。

getDatabaseNCHARParam()

データがNCHARキャラクタ・セットにあるかどうかを戻します。

構文

bool getDatabaseNCHARParam(
unsigned int paramIndex) const;

パラメータ

説明

paramIndex

パラメータの索引を、第1パラメータは1、第2パラメータは2のように指定します。

getDate()

現在行の列の値をDateオブジェクトで取得します。列の値を戻します。値がSQLのNULLの場合、結果はNULLです。

構文

Date getDate(
unsigned int colIndex);

パラメータ

説明

colIndex

列の索引を、第1列は1、第2列は2のように指定します。

getDouble()

現在行の列の値をC++のdouble型で取得します。列の値を戻します。値がSQLのNULLの場合、結果は0（ゼロ）です。

構文

double getDouble(
unsigned int colIndex);

パラメータ

説明

colIndex

列の索引を、第1列は1、第2列は2のように指定します。

getFloat()

現在行の列の値をC++のfloat型で取得します。列の値を戻します。値がSQLのNULLの場合、結果は0（ゼロ）です。

構文

float getFloat(
unsigned int colIndex);

パラメータ

説明

colIndex

列の索引を、第1列は1、第2列は2のように指定します。

getInt()

現在行の列の値をC++のint型で取得します。列の値を戻します。値がSQLのNULLの場合、結果は0（ゼロ）です。

構文

int getInt(
unsigned int colIndex);

パラメータ

説明

colIndex

列の索引を、第1列は1、第2列は2のように指定します。

getIntervalDS()

現在行の列の値をIntervalDSオブジェクトで取得します。列の値を戻します。値がSQLのNULLの場合、結果はNULLです。

構文

IntervalDS getIntervalDS(
unsigned int colIndex);

パラメータ

説明

colIndex

列の索引を、第1列は1、第2列は2のように指定します。

getIntervalYM()

現在行の列の値をIntervalYMオブジェクトで取得します。列の値を戻します。値がSQLのNULLの場合、結果はNULLです。

構文

IntervalYM getIntervalYM(
unsigned int colIndex);

パラメータ

説明

colIndex

列の索引を、第1列は1、第2列は2のように指定します。

getMaxColumnSize()

setMaxColumnSize()で設定された値を戻します。

構文

unsigned int getMaxColumnSize(
unsigned int colIndex) const;

パラメータ

説明

colIndex

列の索引を、第1列は1、第2列は2のように指定します。

getNumArrayRows()

最後の配列フェッチで実際にフェッチした行数を戻します。next()メソッドと組み合せて使用します。このメソッドは、配列以外のフェッチには使用できません。

構文

unsigned int getNumArrayRows() const;

getNumber()

現在行の列の値をNumberオブジェクトで取得します。列の値を戻します。値がSQLのNULLの場合、結果はNULLです。

構文

Number getNumber(
unsigned int colIndex);

パラメータ

説明

colIndex

列の索引を、第1列は1、第2列は2のように指定します。

getObject()

列値を保持しているPObjectへのポインタを戻します。

構文

PObject * getObject(
unsigned int colIndex);

パラメータ

説明

colIndex

列の索引を、第1列は1、第2列は2のように指定します。

getRef()

現在行の列の値をRefAnyで取得します。Ref値を取得しても、Refが参照するデータはマテリアライズされません。また、Ref値は、この値が作成されたセッションまたは接続がオープンしている間、値が保持されます。列値を保持しているRefAnyを戻します。

構文

RefAny getRef(
unsigned int colIndex);

パラメータ

説明

colIndex

列の索引を、第1列は1、第2列は2のように指定します。

getRowid()

SELECT...FOR UPDATE文の現行の行IDを取得します。このROWIDは、プリコンパイルされたDELETE文などにバインドできます。SELECT...FOR UPDATE文の現行のrowidを戻します。

構文

Bytes getRowid(
unsigned int colIndex);

パラメータ

説明

colIndex

列の索引を、第1列は1、第2列は2のように指定します。

getRowPosition()

このメソッドは、現在行の位置のrowidを取得します。

構文

Bytes getRowPosition() const;

getStatement()

このメソッドは、ResultSetのstatementを戻します。

構文

Statement* getStatement() const;

getStream()

現在行の列の値をStreamで戻します。

構文

Stream * getStream(
unsigned int colIndex);

パラメータ

説明

colIndex

列の索引を、第1列は1、第2列は2のように指定します。

getString()

現在行の列の値を文字列で取得します。列の値を戻します。値がSQLのNULLの場合、結果は空の文字列です。

構文

string getString(
unsigned int colIndex);

パラメータ

説明

colIndex

列の索引を、第1列は1、第2列は2のように指定します。

getTimestamp()

現在行の列の値をTimestampオブジェクトで取得します。列の値を戻します。値がSQLのNULLの場合、結果はNULLです。

構文

Timestamp getTimestamp(
unsigned int colIndex);

パラメータ

説明

colIndex

列の索引を、第1列は1、第2列は2のように指定します。

getUInt()

現在行の列の値をC++のint型で取得します。列の値を戻します。値がSQLのNULLの場合、結果は0（ゼロ）です。

構文

unsigned int getUInt(
unsigned int colIndex);

パラメータ

説明

colIndex

列の索引を、第1列は1、第2列は2のように指定します。

getUString()

値をUStringで戻します。

このメソッドをコールする必要があるのは、環境のキャラクタ・セットがUTF16の場合、またはUTF16データを明示的に取得するためにsetCharset()メソッドがコールされている場合のみです。

構文

UString getUString(
unsigned int colIndex);

パラメータ

説明

colIndex

列の索引を、第1列は1、第2列は2のように指定します。

getVector()

このメソッドは、現行の位置の列をベクターで戻します。列はコレクション型（VARRAYまたはネストした表）であることが必要です。コレクション内の要素のSQL型は、ベクター内のオブジェクトのデータ型との互換性が必要です。

構文

説明

void getVector(
ResultSet *rs,
unsigned int colIndex,
vector<BDouble> &vect);

BDoubleのベクターに使用します。

void getVector(
ResultSet *rs,
unsigned int colIndex,
vector<Bfile> &vect);

Bfileのベクターに使用します。

void getVector(
ResultSet *rs,
unsigned int colIndex,
vector<BFloat> &vect);

BFloatのベクターに使用します。

void getVector(
ResultSet *rs,
unsigned int colIndex,
vector<Blob> &vect);

Blobのベクターに使用します。

void getVector(
ResultSet *rs,
unsigned int colIndex,
vector<Clob> &vect);

Clobのベクターに使用します。

void getVector(
ResultSet *rs,
unsigned int colIndex,
vector<Date> &vect);

Dateクラスのベクターに使用します。

void getVector(
ResultSet *rs,
unsigned int colIndex,
vector<double> &vect);

double型のベクターに使用します。

void getVector(
ResultSet *rs,
unsigned int colIndex,
vector<float> &vect);

float型のベクターに使用します。

void getVector(
ResultSet *rs,
unsigned int colIndex,
vector<int> &vect);

int型のベクターに使用します。

void getVector(
ResultSet *rs,
unsigned int colIndex,
vector<IntervalDS> &vect);

IntervalDSクラスのベクターに使用します。

void getVector(
ResultSet *rs,
unsigned int colIndex,
vector<IntervalYM> &vect);

IntervalYMクラスのベクターに使用します。

void getVector(
ResultSet *rs,
unsigned int colIndex,
vector<Number> &vect);

Numberクラスのベクターに使用します。

void getVector(
ResultSet *rs,
unsigned int colIndex,
vector<Ref<T>> &vect);

この構文は、関数テンプレートの一部の順序付けがサポートされているプラットフォームでのみ使用できます。この関数は今後非推奨になる可能性があります。かわりにgetVectorOfRefs()を使用できます。

void getVector(
ResultSet *rs,
unsigned int colIndex,
vector<RefAny> &vect);

RefAnyクラスのベクターに使用します。

void getVector(
ResultSet *rs,
unsigned int colIndex,
vector<string> &vect);

string型のベクターに使用します。

void getVector(
ResultSet *rs,
unsigned int colIndex,
vector<T *> &vect);

この構文は、関数テンプレートの一部の順序付けがサポートされているプラットフォームで使用します。

void getVector(
ResultSet *rs,
unsigned int colIndex,
vector<T> &vect);

この構文は、Windows NTおよびz/OSなど、関数テンプレートの一部の順序付けがサポートされていないプラットフォームで使用します。

void getVector(
ResultSet *rs,
unsigned int colIndex,
vector<Timestamp> &vect);

Timestampクラスのベクターに使用します。

void getVector(
ResultSet *rs,
unsigned int colIndex,
vector<unsigned int> &vect);

unsigned int型のベクターに使用します。

void getVector(
ResultSet *rs,
unsigned int colIndex,
vector<UString> &vect);

UStringクラスのベクターに使用します。グローバリゼーション対応の場合です。

パラメータ

説明

rs

結果セットを指定します。

colIndex

列の索引を、第1列は1、第2列は2のように指定します。

vect

ベクター（OUTパラメータ）への参照を指定します。

getVectorOfRefs()

現行の位置の列をREFのベクターで戻します。列はREFのコレクション型（VARRAYまたはネストした表）であることが必要です。Ref<T>に対しては、特化したメソッドのgetVector()ではなく、この関数の使用をお薦めします。

構文

void getVectorOfRefs(
ResultSet *rs,
unsigned int colIndex,
vector< Ref<T> > &vect);

パラメータ

説明

rs

結果セットを指定します。

colIndex

列の索引を、第1列は1、第2列は2のように指定します。

vect

REFのベクター（OUTパラメータ）への参照を指定します。

isNull()

列には、SQLのNULLの値が含まれることがあります。isNull()は、最後の列の読込みで、この特別な値があったかどうかをレポートします。値がSQLのNULLかどうかを調べるには、最初に列に対してgetxxx()をコールしてその値の読込みを試行し、次に、isNull()をコールする必要があります。最後の列の読込みがSQLのNULLであった場合はTRUEを戻します。

構文

bool isNull(
unsigned int colIndex) const;

パラメータ

説明

colIndex

列の索引を、第1列は1、第2列は2のように指定します。

isTruncated()

このメソッドは、パラメータの値が切り捨てられているかどうかをチェックします。パラメータの値が切り捨てられている場合はTRUEを、それ以外の場合はFALSEを戻します。

構文

bool isTruncated(
unsigned int paramIndex) const;

パラメータ

説明

paramIndex

パラメータの索引を、第1パラメータは1、第2パラメータは2のように指定します。

next()

このメソッドは、前回実行した問合せから指定の行数(numRows)をフェッチし、このフェッチのStatusをレポートします(表13-38の定義を参照)。

非ストリーム・モードの場合、next()は、ステータスDATA_AVAILABLEまたはEND_OF_FETCHのみを戻します。

- 1度に1つの行をフェッチする場合（numRows=1）、getxxx()メソッドを使用してデータを処理します。

- 配列フェッチのように1度に複数行をフェッチする場合（numRows>1の場合）は、setDataBuffer()メソッドを使用して、事前割当てしたバッファの位置を指定してから、next()を起動する必要があります。

setDataBuffer()コールによって指定したバッファには、最大numRows個のデータ・レコードを移入できます。戻された正確なレコード数を確認するには、getNumArrayRows()メソッドを使用します。

構文

Status next(
unsigned int numRows =1);

パラメータ

説明

numRows

配列フェッチに対してフェッチする行数を指定します。

preTruncationLength()

切捨て前のパラメータの実際の長さを戻します。

構文

int preTruncationLength(
unsigned int paramIndex) const;

パラメータ

説明

paramIndex

パラメータの索引を、第1パラメータは1、第2パラメータは2のように指定します。

setBinaryStreamMode()

getStreamメソッドが、列をバイナリ・ストリームで戻すように定義します。

構文

void setBinaryStreamMode(
unsigned int colIndex,
unsigned int size);

パラメータ

説明

colIndex

列の索引を、第1列は1、第2列は2のように指定します。

size

バイナリ・ストリームで読み込まれるデータ量を指定します。

setCharacterStreamMode()

getStreamメソッドが列をキャラクタ・ストリームで戻すように定義します。

構文

void setCharacterStreamMode(
unsigned int colIndex,
unsigned int size);

パラメータ

説明

colIndex

列の索引を、第1列は1、第2列は2のように指定します。

size

キャラクタ・ストリームで読み込まれるデータ量を指定します。

setCharSet()

指定された列のデフォルトのキャラクタ・セットを上書きします。データが、データベースのキャラクタ・セットからこの列に指定されたキャラクタ・セットに変換されます。

構文

void setCharSet(
unsigned int colIndex,
string charSet);

パラメータ

説明

colIndex

列の索引を、第1列は1、第2列は2のように指定します。

charSet

希望するキャラクタ・セットを文字列で指定します。

setCharSetUString()

キャラクタ・セット値のデータがUStringとして戻されるように指定します。

構文

UString setCharSetUString(
unsigned int colIndex,
const UString &charSet);

パラメータ

説明

colIndex

列の索引を、第1列は1、第2列は2のように指定します。

charSet

希望するキャラクタ・セットを文字列で指定します。

setDatabaseNCHARParam()

データベースのNCHARキャラクタ・セットのデータが含まれている列からパラメータを取り出す場合は、TRUE値を渡すことによって、そのことをOCCIに通知する必要があります。デフォルトをリストアするにはFALSEを渡します。

構文

void setDatabaseNCHARParam(
unsigned int paramIndex,
bool isNCHAR);

パラメータ

説明

paramIndex

パラメータの索引を、第1パラメータは1、第2パラメータは2のように指定します。

isNCHAR

TRUEまたはFALSEを指定します。

setDataBuffer()

データをフェッチまたはバインドするデータ・バッファを指定します。このbufferパラメータは、ユーザーが割り当てたデータ・バッファへのポインタです。データの現在の長さをlengthパラメータに指定する必要があります。データ量は、sizeパラメータを超えないようにします。typeには、データのデータ型を指定します。使用できるのは、STL文字列など、OCCI固有でもC++固有の型でもない型のみです。BytesやDateなどのOCCIクラスは使用できません。

配列フェッチ用に、setDataBuffer()を使用してデータをフェッチする場合は、各結果セットごとに1回のみコールする必要があります。各行のデータは、buffer (i- 1)（iは行番号）の位置にあるとみなされます。同様に、データの長さは、(length+(i-1))とみなされます。

構文

void setDataBuffer(
unsigned int colIndex,
void *buffer,
Type type,
sb4 size = 0,
ub2 *length = NULL,
sb2 *ind = NULL,
ub2 *rc = NULL);

パラメータ

説明

colIndex

列の索引を、第1列は1、第2列は2のように指定します。

buffer

ユーザーが割り当てたバッファへのポインタを指定します。配列フェッチが行われる場合、バッファにはnumRows * sizeのバイト数が必要です。収集または分散のバインドおよび定義が行われる場合、この構造には、OCIIOVecのアドレスおよびそのアドレスで開始されるOCIIOVec要素の数が格納されます。

type

バッファに入る（取得する）データの型を指定します。

size

データ・バッファのサイズを指定します。配列フェッチの場合、このサイズはデータ項目の各要素のサイズです。

length

バッファのデータ長へのポインタを指定します。配列フェッチの場合、データ長は各バッファ要素に対する長さデータの配列です。配列のサイズはarrayLengthと等しくしてください。

ind

標識変数または配列へのポインタ（IN/OUT）を指定します。

rc

列レベルのリターン・コードの配列へのポインタ（OUT）を指定します。

setErrorOnNull()

このメソッドは、結果セットのcolIndex列でのNULL値の読込みに対する例外を使用可能または使用禁止にします。

構文

void setErrorOnNull(
unsigned int colIndex,
bool causeException);

パラメータ

説明

colIndex

列の索引を、第1列は1、第2列は2のように指定します。

causeException

TRUEの場合、例外は使用可能です。FALSEの場合は使用禁止です。

setErrorOnTruncate()

このメソッドは、切捨てが発生する際の例外を使用可能/使用禁止にします。

構文

void setErrorOnTruncate(
unsigned int paramIndex,
bool causeException);

パラメータ

説明

paramIndex

パラメータの索引を、第1パラメータは1、第2パラメータは2のように指定します。

causeException

TRUEの場合、例外は使用可能です。FALSEの場合は使用禁止です。

setPrefetchMemorySize()

サーバーへの各ラウンドトリップでフェッチしたデータを格納するために、OCCIによって繰り返し使用されるメモリー・サイズを設定します。0 (ゼロ)の値は、ラウンドトリップ中にフェッチしたデータの量がFetchRowCountパラメータによって制限されることを意味します。両方のパラメータが0（ゼロ）でない場合、2つのうち量の少ないほうが使用されます。

構文

void setPrefetchMemorySize(
unsigned int bytes);

パラメータ

説明

bytes

各サーバーのラウンドトリップ中にフェッチされたデータの格納に使用するバイト数を指定します。

setPrefetchRowCount()

サーバーへの各ラウンドトリップで、OCCIによって繰り返しフェッチされる行数を設定します。0 (ゼロ)の値は、ラウンドトリップ中にフェッチしたデータの量がFetchMemorySizeパラメータによって制限されることを意味します。両方のパラメータが0（ゼロ）でない場合、2つのうち量の少ないほうが使用されます。両方のパラメータが0 (ゼロ)の場合、行カウントが内部的に1行にデフォルト設定され、これが、getFetchRowCount()メソッドから戻る値となります。

構文

void setPrefetchRowCount(
unsigned int rowCount);

パラメータ

説明

rowCount

サーバーへの各ラウンドトリップでフェッチする行数を指定します。

setMaxColumnSize()

列から読み込むデータの最大量(バイト単位)を指定します。envが作成された環境のキャラクタ・セットに基づく必要があります。

構文

void setMaxColumnSize(
unsigned int colIndex,
unsigned int max);

パラメータ

説明

colIndex

列の索引を、第1列は1、第2列は2のように指定します。

max

読み込むデータの最大量(バイト単位)を指定します。

status()

結果セットの現在のStatusを戻します。表13-38の定義を参照してください。このメソッドは、繰り返しコールできます。

構文

Status status() const;

SQLExceptionクラス

SQLExceptionクラスは、生成されたエラー、エラー・コードおよび関連するメッセージに関する情報を提供します。

表13-40 SQLExceptionの概要

メソッド

説明

SQLException()

SQLExceptionのコンストラクタです。

getErrorCode()

データベース・エラー・コードを戻します。

getMessage()

この例外のエラー・メッセージのstringを戻します。

getNLSMessage()

この例外のエラー・メッセージのstringを戻します（Unicodeサポート）。

getNLSUStringMessage()

この例外のエラー・メッセージのUStringを戻します（Unicodeサポート）。

getUStringMessage()

この例外のエラー・メッセージのUStringを戻します。

getXAErrorCode()

例外のメッセージ文字列を戻します。

setErrorCtx()

エラー・コンテキストを設定します。

what()

このSQLExceptionに関連付けられているエラー・メッセージを戻します。

SQLException()

これは、SQLExceptionコンストラクタです。

構文

説明

SQLException();

NULLのSQLExceptionオブジェクトが作成されます。

SQLException(
const SQLException &e);

SQLExceptionオブジェクトが別のSQLExceptionオブジェクトのコピーとして作成されます。

パラメータ

説明

e

コピーするSQLExceptionを指定します。

getErrorCode()

データベース・エラー・コードを取得します。

構文

int getErrorCode() const;

getMessage()

エラー・メッセージ文字列が作成されていた場合は、このSQLExceptionのエラー・メッセージ文字列を戻します。SQLExceptionにエラー・メッセージが作成されていない場合は、NULLを戻します。

構文

string getMessage() const;

getNLSMessage()

エラー・メッセージのstringが作成されている場合は、このSQLExceptionのエラー・メッセージのstringを戻します。グローバリゼーション対応環境を渡します。SQLExceptionにエラー・メッセージが作成されていない場合は、NULLのstringを戻します。エラー・メッセージには、環境に関連付けられているキャラクタ・セットが使用されます。

構文

string getNLSMessage(
Environment *env) const;

パラメータ

説明

env

グローバリゼーション対応環境を指定します。

getNLSUStringMessage()

エラー・メッセージのUStringが作成されている場合は、このSQLExceptionのエラー・メッセージのUStringを戻します。グローバリゼーション対応環境を渡します。SQLExceptionにエラー・メッセージが作成されていない場合は、NULLのUStringを戻します。エラー・メッセージには、環境に関連付けられているキャラクタ・セットが使用されます。

構文

UString getNLSUStringMessage(
Environment *env) const;

パラメータ

説明

env

グローバリゼーション対応環境を指定します。

getUStringMessage()

エラー・メッセージのUStringが作成されている場合は、このSQLExceptionのエラー・メッセージのUStringを戻します。SQLExceptionにエラー・メッセージが作成されていない場合は、NULLのUStringを戻します。エラー・メッセージには、環境に関連付けられているキャラクタ・セットが使用されます。

構文

UString getUStringMessage() const;

getXAErrorCode()

発生した例外の原因がXAエラーであるかSQLエラーであるかを判別します。

動的登録を使用するC++ XAアプリケーションで使用します。例外の原因がXAの場合はXAエラー・コードを、それ以外の場合はXA_OKを戻します。

構文

int getXAErrorCode(
const string &dbname) const;

パラメータ

説明

dbname

データベース名を指定します。このデータベース名は、Open Stringに指定されてリソース・マネージャへの接続時に使用されるオプションのdbnameと同じです。

setErrorCtx()

エラー・コンテキストへのポインタを設定します。

構文

void setErrorCtx(
void *ctx);

パラメータ

説明

ctx

エラー・コンテキストへのポインタを指定します。

what()

標準C++準拠関数。SQLExceptionに関連付けられているエラー・メッセージを戻します。

構文

const char *what() const throw();

StatelessConnectionPoolクラス

このクラスは、データベースへの認証済でステートレスな接続プールを表します。

表13-41 StatelessConnectionPoolクラスで使用される列挙値

属性

オプション

PoolType

- HETEROGENEOUSはデフォルトの状態です。異なる認証コンテキストを持つ接続を同じプールに作成できます。このプール・タイプでは、外部認証もサポートされます。

- HOMOGENEOUSは、プール内のすべての接続が、プール作成時に提供されるユーザー名およびパスワードを使用して認証されることを示します。プロキシ接続は作成できません。minConn値とincrConn値が考慮されるのは、これらのHOMOGENEOUSプール内のみです。

- NO_RLBは、接続プールでのランタイム・ロード・バランシングをオフにします。HETEROGENEOUSプールおよびHOMOGENEOUSプールの両方で使用できます。

- USES_EXT_AUTHは、プール内の接続が外部認証をサポートすることを示します。HETEROGENEOUSプールでのみ使用できます。

BusyOption

- WAITは、スレッドが待機し、接続が解放されるまでブロックされることを示します。

- NOWAITの場合はエラーが発生します。

- FORCEGETは、最大接続数がオープンされ、すべての接続がビジーな場合でも、接続が新規に作成されることを示します。

DestroyMode

- DEFAULTでは、まだプール内にアクティブなビジー接続があるとORA-24422エラーが発生します。

- SPD_FORCEは、プール内のビジー接続を強制的に終了し、プールを破棄することを示します。強制終了した接続数に応じたメモリーが破棄されます。

表13-42 StatelessConnectionPoolメソッドの概要

メソッド

説明

getAnyTaggedConnection()

一致するタグの制限なしに接続オブジェクトへのポインタを戻します。

getAnyTaggedProxyConnection()

接続プールからプロキシ接続を戻します。

getBusyConnections()

接続プール内のビジー接続数を戻します。

getBusyOption()

プール内の接続がすべてビジーで最大接続数に達している場合、ステートレスな接続プールの動作を戻します。

getConnection()

Connectionオブジェクトへのポインタを戻します。

getIncrConnections()

接続プール内の増分接続数を戻します。

getMaxConnections()

接続プール内の最大接続数を戻します。

getMinConnections()

接続プール内の最小接続数を戻します。

getOpenConnections()

接続プール内のオープン接続数を戻します。

getPoolName()

接続プールの名前を戻します。

getProxyConnection()

接続プールからプロキシ接続を戻します。

getTimeOut()

接続プール内の接続のタイムアウト間隔を戻します。

releaseConnection()

オプションのタグを指定してプールに接続を解放します。

setBusyOption()

次の場合に、ステートレスな接続プールの動作を指定します。

- プール内の接続がすべてビジーの場合、かつ、

- 最大接続数に達している場合

setPoolSize()

接続プールについて、最大、最小および増分のプール接続数を設定します。

setTimeOut()

接続プール内の接続のタイムアウト間隔を設定します。

terminateConnection()

接続をクローズしてプールから削除します。

getAnyTaggedConnection()

一致するタグの制限なしに接続オブジェクトへのポインタを戻します。

このメソッドは、データベース常駐接続プーリングが有効化された環境で動作します。

このコールの実行時に、最初にプールが指定のタグに基づいて検索されます。指定したタグを持つ接続が存在する場合は、その接続がユーザーに戻されます。一致する接続が使用可能でない場合は、適切な認証を受けたタグなし（NULLタグ付き）の接続が戻されます。日付のない接続が解放されていない場合は、適切な認証を受けた別のタグを持つ接続が戻されます。

Connectionに対するgetTag()のコールにより、接続タグを受信したかどうかが検証されます。

構文

説明

Connection *getAnyTaggedConnection(
string &tag="")=0;

一致するタグの制限なしに、同種ステートレス接続プールから接続オブジェクトへのポインタを戻します（stringのサポートの場合）。

Connection* getAnyTaggedConnection(
const UString &tag)=0;

一致するタグの制限なしに、同種ステートレス接続プールから接続オブジェクトへのポインタを戻します（UStringのサポートの場合）。

Connection *getAnyTaggedConnection(
const string &userNname,
const string &password,
const string &tag="")=0;

一致するタグの制限なしに、異種ステートレス接続プールから接続オブジェクトへのポインタを戻します（stringのサポートの場合）。

Connection* getAnyTaggedConnection(
const UString &userName,
const UString &Password,
const UString &tag)=0 ;

一致するタグの制限なしに、異種ステートレス接続プールから接続オブジェクトへのポインタを戻します（UStringのサポートの場合）。

パラメータ

説明

userName

データベース・ユーザー名を指定します。

password

データベースのパスワードを指定します。

tag

要求する接続のユーザー定義型を指定します。デフォルト接続を要求する場合は、このパラメータを無視できます。

getAnyTaggedProxyConnection()

接続プールからプロキシ接続を戻します。

このメソッドは、データベース常駐接続プーリングが有効化された環境で動作します。

このコールの実行時に、最初にプールが指定のタグに基づいて検索されます。指定したタグを持つ接続が存在する場合は、その接続がユーザーに戻されます。一致する接続が使用可能でない場合は、適切な認証を受けた異なるタグを持つ接続が戻されます。日付のない接続が解放されていない場合は、適切な認証を受けた別のタグを持つ接続が戻されます。

タグの一致という制限は、空のタグの引数パラメータを渡すことで削除できます。

接続に対するgetTag()のコールにより、受信された接続タグが検証されます。

構文

説明

Connection *getAnyTaggedProxyConnection(
const string &name,
string roles[],
unsigned int numRoles,
const string tag="",
Connection::ProxyType
proxyType=Connection::PROXY_DEFAULT);

接続プールからロール指定付きでプロキシ接続を取得します。ロールのサポートとstringのサポートが含まれます。

Connection* getAnyTaggedProxyConnection(
const UString &name,
string roles[],
unsigned int numRoles,
const UString &tag,
Connection::ProxyType
proxyType = Connection::PROXY_DEFAULT);

接続プールからロール指定付きでプロキシ接続を取得します。ロールのサポートとUStringのサポートが含まれます。

Connection *getAnyTaggedProxyConnection(
const string &name,
const string tag="",
Connection::ProxyType       proxyType=Connection::PROXY_DEFAULT);

接続プールからロール指定付きでプロキシ接続を取得します（stringのサポートの場合）。

Connection* getAnyTaggedProxyConnection(
const UString &name,
const UString &tag,
Connection::ProxyType
proxyType = Connection::PROXY_DEFAULT);

接続プールからロール指定付きでプロキシ接続を取得します（UStringのサポートの場合）。

パラメータ

説明

name

ユーザー名を指定します。

roles

データベース・サーバー上でアクティブにするロールを指定します。

numRoles

データベース・サーバー上でアクティブにするロール数を指定します。

tag

接続に関連付けられているユーザー定義タグを指定します。

proxyType

実行するプロキシ認証の種類を指定します。ProxyTypeの定義は、表13-11を参照してください。

getBusyConnections()

接続プール内のビジー接続数を戻します。データベース常駐接続プーリングを使用する場合、この数値は、接続ブローカへの永続的な接続の数となります。

構文

unsigned int getBusyConnections() const=0;

getBusyOption()

プール内の接続がすべてビジーな場合、および最大接続数に達している場合、ステートレスな接続プールの動作を戻します。戻り値の定義については、表13-41のBusyOptionを参照してください。

構文

BusyOption getBusyOption()=0;

getConnection()

StatelessConnectionPoolの接続オブジェクトへのポインタを戻します。

このメソッドは、データベース常駐接続プーリングが有効化された環境で動作します。

構文

説明

Connection *getConnection()=0;

外部認証できる接続を戻します。

Connection *getConnection(
string &tag="")=0;

接続プールのユーザー名およびパスワードを使用して認証済接続を戻します（stringのサポートの場合）。

Connection* getConnection(
const UString &tag)=0;

接続プールのユーザー名およびパスワードを使用して認証済接続を戻します（UStringのサポートの場合）。

Connection *getConnection(
const string &userName,
const string &password,
const string &tag="")=0;

異機種間ステートレス接続プールから接続オブジェクトへのポインタを戻します（stringのサポートの場合）。

Connection* getConnection(
const UString &userName,
const UString &password,
const UString &tag)=0;

異機種間ステートレス接続プールから接続オブジェクトへのポインタを戻します（UStringのサポートの場合）。

Connection *getConnection(
const string &connectionClass,
const Connection::Purity &purity)=0;

データベース常駐接続プールから接続オブジェクトへのポインタを戻します（stringのサポートの場合）。

Connection* getConnection(
const UString &connectionClass,
const Connection::Purity &purity)=0;

データベース常駐接続プールから接続オブジェクトへのポインタを戻します（UStringのサポートの場合）。

Connection *getConnection(
const string &userName,
const string &password,
const string &connectionClass,
const Connection::Purity &purity)=0;

データベース常駐接続プールから接続オブジェクトへのポインタを戻します（ユーザー名およびパスワード認証。stringのサポートの場合）。

Connection* getConnection(
const UString &userName,
const UString &password,
const UString &connectionClass,
const Connection::Purity &purity)=0;

データベース常駐接続プールから接続オブジェクトへのポインタを戻します（ユーザー名およびパスワード認証。UStringのサポートの場合）。

Connection *getConnection(
const string &connectionClass,
const Connection::Purity &purity,
const string &tag)=0;

データベース常駐接続プールからタグ付き接続オブジェクトを戻します（stringのサポートの場合）。

Connection* getConnection(
const UString &connectionClass,
const Connection::Purity &purity,
const UString &tag)=0;

データベース常駐接続プールからタグ付き接続オブジェクトを戻します（UStringのサポートの場合）。

パラメータ

説明

userName

データベース・ユーザー名を指定します。

password

データベースのパスワードを指定します。

tag

接続に関連付けられているユーザー定義タグを指定します。このコール時には、指定のタグに基づいて最初にプールが検索されます。指定したタグを持つ接続が存在する場合はその接続が戻され、それ以外の場合は接続が新規に作成され、戻されます。

connectionClass

データベース常駐接続プールで使用される接続のクラスを指定します。

purity

データベース常駐接続プールで使用される接続の純正値を指定します。SELFまたはNEWのいずれかとなります。

getIncrConnections()

接続プール内の増分接続数を戻します。このコールが役立つのは、同種接続プールの場合のみです。データベース常駐接続プーリングを使用する場合、この数値は、接続ブローカへの永続的な接続の数となります。

構文

unsigned int getIncrConnections() const=0;

getMaxConnections()

接続プール内の最大接続数を戻します。データベース常駐接続プーリングを使用する場合、この数値は、接続ブローカへの永続的な接続の数となります。

構文

unsigned int getMaxConnections() const=0;

getMinConnections()

接続プール内の最小接続数を戻します。データベース常駐接続プーリングを使用する場合、この数値は、接続ブローカへの永続的な接続の数となります。

構文

unsigned int getMinConnections() const=0;

getOpenConnections()

接続プール内のオープン接続数を戻します。データベース常駐接続プーリングを使用する場合、この数値は、接続ブローカへの永続的な接続の数となります。

構文

unsigned int getOpenConnections() const=0;

getPoolName()

接続プールの名前を戻します。

構文

string getPoolName() const=0;

getProxyConnection()

接続プールからプロキシ接続を戻します。

このメソッドは、データベース常駐接続プーリングが有効化された環境で動作します。

構文

説明

Connection *getProxyConnection(
const string &userName,
string roles[],
unsigned int numRoles,
const string& tag="",
Connection::ProxyType
proxyType=Connection::PROXY_DEFAULT)=0;

接続プールからロール指定付きでプロキシ接続を取得します（ロールのサポートとstringのサポートの場合）。

Connection* getProxyConnection(
const UString &userName,
UString roles[],
unsigned int numRoles,
const UString &tag,
Connection::ProxyType
proxyType = Connection::PROXY_DEFAULT);

接続プールからロール指定付きでプロキシ接続を取得します（ロールのサポートとUStringのサポートの場合）。

Connection *getProxyConnection(
const string &userName,
const string &connectionClass,
const Connection::Purity &purity)=0;

データベース常駐接続プールからプロキシ接続を取得します（stringのサポートの場合）。

Connection *getProxyConnection(
const UString &userName,
const UString &connectionClass,
const Connection::Purity &purity)=0;

データベース常駐接続プールからプロキシ接続を取得します（UStringのサポートの場合）。

Connection *getProxyConnection(
const string &userName,
string roles[],
unsigned int numRoles,
const string &connectionClass,
const Connection::Purity &purity)=0;

接続プールからロール指定付きでプロキシ接続を取得します（ロールのサポートおよびデータベース常駐接続プーリング。stringのサポートの場合）。

Connection* getProxyConnection(
const UString &userName,
UString roles[],
unsigned int numRoles,
const UString &connectionClass,
const Connection::Purity &purity)=0;

接続プールからロール指定付きでプロキシ接続を取得します（ロールのサポートおよびデータベース常駐接続プーリング。UStringのサポートの場合）。

Connection *getProxyConnection(
const string &userName,
const string& tag="",
Connection::ProxyType
proxyType=Connection::PROXY_DEFAULT)=0;

接続プールからロール指定なしでプロキシ接続を取得します（stringのサポートの場合）。

Connection* getProxyConnection(
const UString &userName,
const UString &tag,
Connection::ProxyType
proxyType = Connection::PROXY_DEFAULT)

接続プールからロール指定なしでプロキシ接続を取得します（UStringのサポートの場合）。

パラメータ

説明

userName

ユーザー名を指定します。

roles

データベース・サーバー上でアクティブにするロールを指定します。

numRoles

データベース・サーバー上でアクティブにするロール数を指定します。

tag

接続に関連付けられているユーザー定義タグを指定します。このコールの実行時に、最初にプールが指定のタグに基づいて検索されます。指定したタグを持つ接続が存在する場合はその接続が戻され、それ以外の場合は接続が新規に作成され、戻されます。

proxyType

実行するプロキシ認証の種類を指定します。ProxyTypeの定義は、表13-11を参照してください。

connectionClass

データベース常駐接続プールで使用される接続のクラスを指定します。

purity

データベース常駐接続プールで使用される接続の純正値を指定します。SELFまたはNEWのいずれかとなります。

getStmtCacheSize()

文キャッシュのサイズを取得します。

構文

unsigned int getStmtCacheSize() const=0;

getTimeOut()

接続プール内の接続のタイムアウト間隔を戻します。

構文

unsigned int getTimeOut() const=0;

releaseConnection()

オプションのタグを指定してプールに接続を解放します。

このメソッドは、データベース常駐接続プーリングが有効化された環境で動作します。

構文

説明

void releaseConnection(
Connection *connection,
const string& tag="");

stringタグをサポートする場合です。

void releaseConnection(
Connection *connection,
const UString &tag);

UStringタグをサポートする場合です。

パラメータ

説明

connection

解放する接続を指定します。

tag

接続に関連付けられているユーザー定義タグを指定します。このパラメータのデフォルトは""で、接続のタグを削除します。

setBusyOption()

プール内の接続がすべてビジーな場合、および最大接続数に達している場合、ステートレスな接続プールの動作を指定します。

構文

void setBusyOption(
BusyOption busyOption)=0;

パラメータ

説明

busyOption

有効な値の定義は、表13-41のBusyOptionを参照してください。

setPoolSize()

接続プールについて、最大、最小および増分のプール接続数を設定します。

構文

void setPoolSize(
unsigned int maxConn=1,
unsigned int minConn=0,
unsigned int incrConn=1)=0;

パラメータ

説明

maxConn

接続プール内の最大接続数を指定します。

minConn

同種接続プール内に限った最小接続数を指定します。

incrConn

同種接続プール内に限った増分接続数を指定します。

setTimeOut()

接続プール内の接続のタイムアウト間隔を設定します。OCCIは、アイドル時間が指定タイムアウト間隔を超えている、この接続プールに関連している接続を、すべて終了します。

この属性が設定されていない場合、プール領域が必要になると、最も以前に使用された接続がタイムアウトになります。Oracleでは、プールに接続を解放する際に、タイムアウトの接続の有無のみをチェックします。

構文

void setTimeOut(
unsigned int connTimeOut=0)=0;

パラメータ

説明

connTimeOut

タイムアウト間隔を秒数で指定します。

setStmtCacheSize()

文キャッシュを有効化または無効化します。0 (ゼロ)以外の値を指定すると、指定したサイズのキャッシュによる文キャッシュが有効化されます。値0 (ゼロ)を指定すると、キャッシュが無効化されます。

ユーザーが個々の接続のキャッシュ・サイズを変更し、タグを付けてプールに戻した場合、キャッシュ・サイズはプールに対して設定されている値には戻りません。接続のタグを解除すると、キャッシュ・サイズはプールに指定されているキャッシュ・サイズにリセットされます。

構文

void setStmtCacheSize(
unsigned int cacheSize)=0;

パラメータ

説明

cacheSize

文キャッシュのサイズを指定します。

terminateConnection()

接続をクローズしてプールから削除します。

このメソッドは、データベース常駐接続プーリングが有効化された環境で動作します。

構文

void terminateConnection(
Connection *connection)=0;

パラメータ

説明

connection

終了する接続を指定します。

Statementクラス

Statementオブジェクトは、SQL文を実行するために使用します。このSQL文は、結果セットを戻す問合せ文または更新カウントを戻す非問合せ文の場合があります。非問合せSQLには、INSERT文、UPDATE文またはDELETE文があります。非問合せSQL文には、DML文（CREATEやGRANTなど）やストアド・プロシージャ・コールもあります。

INSERT/UPDATE/DELETE文の問合せまたはストアド・プロシージャ・コール文には、INバインド・パラメータを指定できます。一方、ストアド・プロシージャ・コール文には、OUTバインド・パラメータ、またはIN/OUTパラメータと呼ばれるINとOUT両方のバインド・パラメータを指定できます。

Statementクラスのメソッドは、3つのカテゴリに分類されます。

- すべての文に適用可能なStatementメソッド

- INバインド・パラメータ付きでプリコンパイルされたSQL文に適用可能なメソッド

- OUTまたはIN/OUTバインド・パラメータ付きのコール可能文に適用可能なメソッド

表13-43 Statementクラスで使用される列挙値

属性

オプション

Status

- NEEDS_STREAM_DATAは、ストリーム化されたINバインド・パラメータに対して、出力Streamsを書き込む必要があることを示します。複数のトリーム・パラメータがある場合は、getCurrentStreamParam()メソッドをコールして、ストリームが必要なバインド・パラメータを確認します。文が繰り返し実行される場合は、getCurrentIteration()をコールして、繰り返して書込みが必要なストリームを確認します。

- PREPAREDは、Statementオブジェクトが問合せに設定されていることを示します。

- RESULT_SET_AVAILABLEは、getResultSet()メソッドをコールして結果セットを取得する必要があることを示します。

- STREAM_DATA_AVAILABLEは、ストリーム化されたOUTバインド・パラメータに、入力Streamsを読み取る必要があることを示します。複数のトリーム・パラメータがある場合は、getCurrentStreamParam()メソッドをコールして、ストリームが必要なバインド・パラメータを確認します。文が繰り返し実行される場合は、getCurrentIteration()をコールして、繰り返して読取りが必要なストリームを確認します。

- UPREPAREDは、Statementオブジェクトが問合せに設定されていないことを示します。

- UPDATE_COUNT_AVAILABLEは、getUpdateCount()メソッドをコールして更新カウントを確認する必要があることを示します。

表13-44 Statementメソッド

メソッド

説明

addIteration()

実行する反復を追加します。

closeResultSet()

自動リリースを待機せずに、結果セットのデータベースおよびOCCIリソースをただちに解放します。

closeStream()

パラメータstreamによって指定されたストリームをクローズします。

disableCaching()

文キャッシュを使用禁止にします。

execute()

SQL文を実行します。

executeArrayUpdate()

バインド・パラメータにsetDataBuffer()またはストリーム・インタフェースのみを使用するINSERT、UPDATEおよびDELETE文を実行します。

executeQuery()

単一のResultSetを戻すSQL文を実行します。

executeUpdate()

ResultSetを戻さないSQL文を実行します。

getAutoCommit()

現在の自動コミット状態を戻します。

getBatchErrorMode()

バッチ・エラー・モードの状態を戻します。

getBDouble()

IEEE754 DOUBLEの値をBDoubleオブジェクトで戻します。

getBfile()

BFILEの値をBfileオブジェクトで戻します。

getBFloat()

IEEE754 FLOATの値をBfloatオブジェクトで戻します。

getBlob()

BLOBの値をBlobオブジェクトで戻します。

getBytes()

SQL BINARYまたはVARBINARYパラメータの値をBytesで戻します。

getCharSet()

指定されたパラメータに有効なキャラクタ・セットをstringで戻します。

getCharSetUString()

指定されたパラメータに有効なキャラクタ・セットをUStringで戻します。

getClob()

CLOBの値をClobオブジェクトで戻します。

getConnection()

Statementオブジェクトがインスタンス化された元の接続を戻します。

getCurrentIteration()

処理中の現行の反復の反復番号を戻します。

getCurrentStreamIteration()

ストリーム・データの読込みまたは書込みを行う現行の反復を戻します。

getCurrentStreamParam()

読込みまたは書込みが必要な現行の出力ストリームのパラメータ索引を戻します。

getCursor()

OUTパラメータのREF CURSOR値をResultSetで戻します。

getDatabaseNCHARParam()

データがNCHARキャラクタ・セットにあるかどうかを戻します。

getDate()

パラメータの値をDateオブジェクトで戻します。

getBDouble()

パラメータの値をIEEE754のdouble型で戻します。

getDouble()

パラメータの値をC++のdouble型で戻します。

getBFloat()

パラメータの値をIEEE754のfloat型で戻します。

getFloat()

パラメータの値をC++のfloat型で戻します。

getInt()

パラメータの値をC++のint型で戻します。

getIntervalDS()

パラメータの値をIntervalDSオブジェクトで戻します。

getIntervalYM()

パラメータの値をIntervalYMオブジェクトで戻します。

getMaxIterations()

最大反復回数の現在の制限を戻します。

getMaxParamSize()

最大パラメータ・サイズの現在の制限を戻します。

getNumber()

パラメータの値をNumberオブジェクトで戻します。

getObject()

パラメータの値をPObjectオブジェクトで戻します。

getOCIStatement()

Statementに関連付けられているOCI文ハンドルを戻します。

getRef()

REFパラメータの値をRefAnyオブジェクトで戻します。

getResultSet()

現在の結果をResultSetで戻します。

getRowid()

ROWIDパラメータの値をBytesオブジェクトで戻します。

getSQL()

Statementオブジェクトに関連付けられている現行のSQL文字列を戻します。

getSQLUString()

Statementオブジェクトに関連付けられている現行のSQL文字列を戻します。グローバリゼーション対応の場合です。

getStream()

パラメータの値をストリームで戻します。

getString()

パラメータの値を文字列で戻します。

getTimestamp()

パラメータの値をTimestampオブジェクトで戻します。

getUInt()

パラメータの値をC++のunsigned int型で戻します。

getUpdateCount()

非問合せ文に対する現在の結果を更新カウントで戻します。

getUString()

UStringの値を戻します。

getVector()

指定されたパラメータをベクターで戻します。

getVectorOfRefs()

現行の位置の列をREFのベクターで戻します。

isNull()

パラメータがNULLかどうかをチェックします。

isTruncated()

値が切り捨てられているかどうかをチェックします。

preTruncationLength()

切捨て前のパラメータの実際の長さを戻します。

registerOutParam()

OUTパラメータの型と最大サイズを登録します。

setAutoCommit()

自動コミット・モードを指定します。

setBatchErrorMode()

バッチ・エラー処理モードを使用可能または使用禁止にします。

setBDouble()

パラメータをIEEEのdouble型の値に設定します。

setBfile()

パラメータをBfile値に設定します。

setBFloat()

パラメータをIEEEのfloat型の値に設定します。

setBinaryStreamMode()

列をバイナリ・ストリームで戻すように指定します。

setBlob()

パラメータをBlob値に設定します。

setBytes()

パラメータをBytes配列に設定します。

setCharacterStreamMode()

列をキャラクタ・ストリームで戻すように指定します。

setCharSet()

キャラクタ・セットをstringで指定します。

setCharSetUString()

キャラクタ・セットをUStringで指定します。

setClob()

パラメータをClob値に設定します。

setDate()

パラメータをDate値に設定します。

setDatabaseNCHARParam()

データがデータベースのNCHARキャラクタ・セットにある場合はtrueを、デフォルトをリストアする場合はfalseを設定します。

setDataBuffer()

読込みまたは書込み可能なデータがあるデータ・バッファを指定します。

setDataBufferArray()

読込みまたは書込み可能なデータがあるデータ・バッファの配列を指定します。

setDouble()

パラメータをC++のdouble型の値に設定します。

setErrorOnNull()

NULL値の読込みに対する例外を使用可能または使用禁止にします。

setErrorOnTruncate()

切捨てが発生する際の例外を使用可能または使用禁止にします。

setFloat()

パラメータをC++のfloat型の値に設定します。

setInt()

パラメータをC++のint型の値に設定します。

setIntervalDS()

パラメータをIntervalDS値に設定します。

setIntervalYM()

パラメータをIntervalYM値に設定します。

setMaxIterations()

DML文に対して行われる起動の最大数を設定します。

setMaxParamSize()

パラメータとの間で受渡しできるデータの最大量を設定します。

setNull()

パラメータをSQLのNULLに設定します。

setNumber()

パラメータをNumber値に設定します。

setObject()

オブジェクトを使用してパラメータの値を設定します。

setPrefetchMemorySize()

サーバーへの各ラウンドトリップでフェッチしたデータを格納するために、OCCIによって繰り返し使用されるメモリー・サイズを設定します。

setPrefetchRowCount()

サーバーへの各ラウンドトリップで、OCCIによって繰り返しフェッチされる行数を設定します。

setRef()

パラメータの値を参照に設定します。

setRowid()

バインドの位置に対して、ROWIDバイト配列を設定します。

setSQL()

新規SQL文字列をStatementオブジェクトに関連付けます。

setSQLUString()

新規SQL文字列をStatementオブジェクトに関連付けます。グローバリゼーション対応の場合です。

setString()

指定された索引のパラメータを設定します。

setTimestamp()

パラメータをTimestamp値に設定します。

setUInt()

パラメータをC++のunsigned int型の値に設定します。

setUString()

指定された索引のパラメータを設定します。グローバリゼーション対応の場合です。

setVector()

パラメータをunsigned int型のベクターに設定します。

setVectorOfRefs()

パラメータをベクターに設定します。このメソッドは、型がREFのコレクション型の場合に必要です。

status()

文の現在のステータスを戻します。このステータスは、書き込むストリーム・データがある場合に役立ちます。

addIteration()

設定パラメータを指定した後、実行する反復を追加します。

構文

void addIteration();

closeResultSet()

結果セットが必要ない場合、指定されたresultSetのデータベースおよびOCCIリソースをただちに解放します。

構文

void closeResultSet(
ResultSet *resultSet);

パラメータ

説明

resultSet

クローズする結果セットを指定します。現行の文でgetResultSet()、executeQuery()またはgetCursor()メソッドをコールした結果、またはこの文の別の結果セットのgetCursor()コールによる結果を指定できます。

closeStream()

パラメータstreamによって指定されたストリームをクローズします。

構文

void closeStream(
Stream *stream);

パラメータ

説明

stream

クローズするストリームを指定します。

disableCaching()

文キャッシュを使用禁止にします。文をキャッシュせずに破棄する必要がある場合に使用します。文キャッシュが使用可能になっている場合にのみ有効です。

構文

void disableCaching();

execute()

結果セットまたは更新カウントのいずれかを戻すSQL文を実行します。この文には、書き込む必要がある読込み可能なストリームが含まれている場合があります。この場合の実行結果は、すぐに使用できない場合があります。戻り値Statusは、表13-43の定義を参照してください。

出力ストリームがOUTバインド変数に使用されている場合、その出力ストリームは順に従って完全に読み込む必要があります。getCurrentStreamParam()メソッドは、読み取る必要があるストリームを示します。同様に、getCurrentIteration()は、データの準備ができている反復を示します。

構文

説明

Status execute(
const string &sql="");

SQL文を実行します。

Status execute(
const UString &sql);

SQL文を実行します。グローバリゼーション対応の場合です。

パラメータ

説明

sql

実行するSQL文を指定します。executeArrayUpdate()メソッドを使用してSQLと文を関連付けた場合は、NULLを指定できます。

executeArrayUpdate()

バインド・パラメータにsetDataBuffer()またはストリーム・インタフェースのみを使用するINSERT/UPDATE/DELETE文を実行します。このバインド・パラメータは、サイズ配列であるarrayLengthパラメータです。この文には、書き込む必要がある書込み可能なストリームが含まれている場合があります。戻り値Statusは、表13-43の定義を参照してください。

出力ストリームがOUTバインド変数に使用されている場合、その出力ストリームは順に従って完全に読み込む必要があります。getCurrentStreamParam()メソッドは、読み取る必要があるストリームを示します。同様に、getCurrentIteration()は、データの準備ができている反復を示します。

配列実行は、問合せ文またはコール可能文に対しては実行できません。

構文

Status executeArrayUpdate(
unsigned int arrayLength);

パラメータ

説明

arrayLength

バインド変数の各バッファに指定する要素数を指定します。

executeQuery()

ResultSetを戻すSQL文を実行します。ストリーム・パラメータを持つ問合せではない文に対しては、コールしないでください。問合せによって作成されたデータが含まれたResultSetを戻します。

構文

説明

ResultSet* executeQuery(
const string &sql="");

単一のResultSetを戻すSQL文を実行します。

ResultSet* executeQuery(
const UString &sql);

単一のResultSetを戻すSQL文を実行します。グローバリゼーション対応の場合です。

パラメータ

説明

sql

実行するSQL文を指定します。executeArrayUpdate()メソッドを使用してSQLと文を関連付けた場合は、NULLを指定できます。

executeUpdate()

SQLのINSERT文、UPDATE文、DELETE文などの非問合せ文、CREATE/ALTERなどのDDL文またはストアド・プロシージャ・コールを実行します。INSERT、UPDATEまたはDELETEの場合は行カウントを、戻りがないSQL文の場合は0（ゼロ）を戻します。

構文

説明

unsigned int executeUpdate(
const string &sql="");

非問合せ文を実行します。

unsigned int executeUpdate(
const UString &sql);

非問合せ文を実行します。グローバリゼーション対応の場合です。

パラメータ

説明

sql

実行するSQL文を指定します。executeArrayUpdate()メソッドを使用してSQLと文を関連付けた場合は、NULLを指定できます。

getAutoCommit()

現在の自動コミット状態を戻します。

構文

bool getAutoCommit() const;

getBatchErrorMode()

バッチ・エラー・モードの状態を戻します。有効な場合にはTRUEが、無効な場合はFALSEが戻されます。

構文

bool getBatchErrorMode() const;

getBDouble()

OUTバインドとして定義されているIEEE754のDOUBLE列の値を取得します。値がSQLのNULLの場合、結果は0（ゼロ）です。

構文

BDouble getBDouble(
unsigned int paramIndex) = 0;

パラメータ

説明

paramIndex

パラメータの索引を、第1パラメータは1、第2パラメータは2のように指定します。

getBfile()

BFILEパラメータの値をBfileオブジェクトで戻します。

構文

Bfile getBfile(
unsigned int paramIndex);

パラメータ

説明

paramIndex

パラメータの索引を、第1パラメータは1、第2パラメータは2のように指定します。

getBFloat()

OUTバインドとして定義されているIEEE754のFLOAT列の値を取得します。値がSQLのNULLの場合、結果は0（ゼロ）です。

構文

BFloat getBFloat(
unsigned int paramIndex) = 0;

パラメータ

説明

paramIndex

パラメータの索引を、第1パラメータは1、第2パラメータは2のように指定します。

getBlob()

BLOBパラメータの値をBlobで戻します。

構文

Blob getBlob(
unsigned int paramIndex);

パラメータ

説明

paramIndex

パラメータの索引を、第1パラメータは1、第2パラメータは2のように指定します。

getBytes()

SQL BINARYまたはVARBINARYパラメータの値をBytesで戻します。値がSQLのNULLの場合、結果はNULLです。

構文

Bytes getBytes(
unsigned int paramIndex);

パラメータ

説明

paramIndex

パラメータの索引を、第1パラメータは1、第2パラメータは2のように指定します。

getCharSet()

指定されたパラメータに有効なキャラクタ・セットをstringで戻します。

構文

string getCharSet(
unsigned int paramIndex) const;

パラメータ

説明

paramIndex

パラメータの索引を、第1パラメータは1、第2パラメータは2のように指定します。

getCharSetUString()

指定されたパラメータに有効なキャラクタ・セットをUStringで戻します。

構文

UString getCharSetUString(
unsigned int paramIndex) const;

パラメータ

説明

paramIndex

パラメータの索引を、第1パラメータは1、第2パラメータは2のように指定します。

getClob()

CLOBパラメータの値をClobオブジェクトで取得します。パラメータの値を戻します。

構文

Clob getClob(
unsigned int paramIndex);

パラメータ

説明

paramIndex

パラメータの索引を、第1パラメータは1、第2パラメータは2のように指定します。

getConnection()

Statementオブジェクトがインスタンス化された元の接続を戻します。

構文

Connection* getConnection() const;

getCurrentIteration()

プリコンパイルされたSQL文に出力Streamsがない場合、このメソッドは、OCCIで処理中の文の現在の反復を戻します。一連の反復ですべてのコールが処理された後に、このメソッドがコールされた場合は、0（ゼロ）を戻します。処理中の現行の反復の反復番号を戻します。最初の反復の番号は1、2回目の反復の番号は2のようになります。文の実行が終了した場合は、0（ゼロ）を戻します。

構文

unsigned int getCurrentIteration() const;

getCurrentStreamIteration()

データの準備ができている現在のパラメータ・ストリームを戻します。

構文

unsigned int getCurrentStreamIteration() const;

getCurrentStreamParam()

書込みが必要な現行の出力Streamパラメータのパラメータ索引を戻します。プリコンパイルされたSQL文に出力Streamパラメータがある場合、このメソッドは書込みが必要な現行の出力Streamのパラメータ索引を戻します。出力Streamへの書込みが不要な場合、またはプリコンパイルされたSQL文に出力Streamパラメータがない場合、このメソッドは0 (ゼロ)を戻します。

構文

unsigned int getCurrentStreamParam() const;

getCursor()

OUTパラメータのREF CURSOR値をResultSetで取得します。この結果セットからデータをフェッチできます。OUTパラメータは、registerOutParam()メソッドを使用してCURSORとして登録する必要があります。OUTパラメータの値に対してResultSetを1つ戻します。

バッチ・コールのために戻されるREF CURSORが複数ある場合は、カーソルからのデータを完全にフェッチしてから次のREF CURSORを取得してフェッチを開始するようにする必要があります。

構文

ResultSet * getCursor(
unsigned int paramIndex);

パラメータ

説明

paramIndex

パラメータの索引を、第1パラメータは1、第2パラメータは2のように指定します。

getDatabaseNCHARParam()

データがNCHARキャラクタ・セットにあるかどうかを戻します。

構文

bool getDatabaseNCHARParam(
unsigned int paramIndex) const;

パラメータ

説明

paramIndex

パラメータの索引を、第1パラメータは1、第2パラメータは2のように指定します。

getDate()

SQL DATEパラメータの値をDateオブジェクトで取得します。パラメータの値を戻します。値がSQLのNULLの場合、結果はNULLです。

構文

Date getDate(
unsigned int paramIndex) const;

パラメータ

説明

paramIndex

パラメータの索引を、第1パラメータは1、第2パラメータは2のように指定します。

getDouble()

DOUBLEパラメータの値をC++のdouble型で取得します。パラメータの値を戻します。値がSQLのNULLの場合、結果は0（ゼロ）です。

構文

double getDouble(
unsigned int paramIndex);

パラメータ

説明

paramIndex

パラメータの索引を、第1パラメータは1、第2パラメータは2のように指定します。

getFloat()

FLOATパラメータの値をC++のfloat型で取得します。パラメータの値を戻します。値がSQLのNULLの場合、結果は0（ゼロ）です。

構文

float getFloat(
unsigned int paramIndex);

パラメータ

説明

paramIndex

パラメータの索引を、第1パラメータは1、第2パラメータは2のように指定します。

getInt()

INTEGERパラメータの値をC++のint型で取得します。パラメータの値を戻します。値がSQLのNULLの場合、結果は0（ゼロ）です。

構文

unsigned int getInt(
unsigned int paramIndex);

パラメータ

説明

paramIndex

パラメータの索引を、第1パラメータは1、第2パラメータは2のように指定します。

getIntervalDS()

パラメータの値をIntervalDSオブジェクトで取得します。

構文

IntervalDS getIntervalDS(
unsigned int paramIndex);

パラメータ

説明

paramIndex

パラメータの索引を、第1パラメータは1、第2パラメータは2のように指定します。

getIntervalYM()

パラメータの値をIntervalYMオブジェクトで取得します。

構文

IntervalYM getIntervalYM(
unsigned int paramIndex);

パラメータ

説明

paramIndex

パラメータの索引を、第1パラメータは1、第2パラメータは2のように指定します。

getMaxIterations()

最大反復回数の現在の制限を取得します。デフォルトは1です。現在の最大反復回数を戻します。

構文

unsigned int getMaxIterations() const;

getMaxParamSize()

maxParamSize制限（バイト数）は、受け渡すパラメータの値の最大データ量です。文字型およびバイナリ型に対してのみ適用されます。制限を超過すると、超過した分のデータは暗黙的に廃棄されます。maxパラメータ・サイズの現在の制限を戻します。

構文

unsigned int getMaxParamSize(
unsigned int paramIndex) const;

パラメータ

説明

paramIndex

パラメータの索引を、第1パラメータは1、第2パラメータは2のように指定します。

getNumber()

NUMERICパラメータの値をNumberオブジェクトで取得します。パラメータの値を戻します。値がSQLのNULLの場合、結果はNULLです。

構文

Number getNumber(
unsigned int paramIndex);

パラメータ

説明

paramIndex

パラメータの索引を、第1パラメータは1、第2パラメータは2のように指定します。

getObject()

パラメータの値をPObjectオブジェクトで取得します。このメソッドはregisterOutParam()を使用して、このパラメータに登録されたSQLの型に対応する型のPObjectを戻します。OUTパラメータの値を保持しているPObjectを1つ戻します。

このメソッドは、データベース固有の抽象データ型を読み取るために使用できます。

構文

PObject * getObject(
unsigned int paramIndex);

パラメータ

説明

paramIndex

パラメータの索引を、第1パラメータは1、第2パラメータは2のように指定します。

getOCIStatement()

Statementに関連付けられているOCI文ハンドルを取得します。

構文

OCIStmt * getOCIStatement() const;

getRef()

REFパラメータの値をRefAnyオブジェクトで取得します。パラメータの値を戻します。

構文

RefAny getRef(
unsigned int paramIndex);

パラメータ

説明

paramIndex

パラメータの索引を、第1パラメータは1、第2パラメータは2のように指定します。

getResultSet()

現在の結果をResultSetで戻します。

構文

ResultSet * getResultSet();

getRowid()

rowidパラメータの値をBytesで取得します。

構文

Bytes getRowid(
unsigned int paramIndex);

パラメータ

説明

paramIndex

パラメータの索引を、第1パラメータは1、第2パラメータは2のように指定します。

getSQL()

Statementオブジェクトに関連付けられている現行のSQL文字列を戻します。

構文

string getSQL() const;

getSQLUString()

Statementオブジェクトに関連付けられている現行のSQL UStringを戻します。グローバリゼーション対応の場合です。

構文

UString getSQLUString() const;

getStream()

パラメータの値をストリームで戻します。

構文

Stream * getStream(
unsigned int paramIndex);

パラメータ

説明

paramIndex

パラメータの索引を、第1パラメータは1、第2パラメータは2のように指定します。

getString()

CHAR、VARCHARまたはLONGVARCHARパラメータの値を文字列で取得します。パラメータの値を戻します。値がSQLのNULLの場合、結果は空の文字列です。

構文

string getString(
unsigned int paramIndex);

パラメータ

説明

paramIndex

パラメータの索引を、第1パラメータは1、第2パラメータは2のように指定します。

getTimestamp()

SQL TIMESTAMPパラメータの値をTimestampオブジェクトで取得します。パラメータの値を戻します。値がSQLのNULLの場合、結果はNULLです。

構文

Timestamp getTimestamp(
unsigned int paramIndex);

パラメータ

説明

paramIndex

パラメータの索引を、第1パラメータは1、第2パラメータは2のように指定します。

getUInt()

BIGINTパラメータの値をC++のunsigned int型で取得します。パラメータの値を戻します。値がSQLのNULLの場合、結果は0（ゼロ）です。

構文

unsigned int getUInt(
unsigned int paramIndex);

パラメータ

説明

paramIndex

パラメータの索引を、第1パラメータは1、第2パラメータは2のように指定します。

getUpdateCount()

現在の結果を更新カウントで戻します。

構文

unsigned int getUpdateCount() const;

getUString()

値をUStringで戻します。

このメソッドをコールする必要があるのは、環境のキャラクタ・セットがUTF16の場合、またはUTF16データを明示的に取得するためにsetCharset()メソッドがコールされている場合のみです。

構文

UString getUString(
unsigned int paramIndex);

パラメータ

説明

paramIndex

パラメータの索引を、第1パラメータは1、第2パラメータは2のように指定します。

getVector()

現行の位置の列をベクターで戻します。位置の列は、索引で指定し、コレクション型（VARRAYまたはネストした表）であることが必要です。コレクション内の要素のSQL型は、ベクターの型との互換性が必要です。

構文

説明

void getVector(
Statement *stmt,
unsigned int paramIndex,
std::vector<UString> &vect);

UString Classのベクターに使用します。グローバリゼーション対応の場合です。

void getVector(
Statement *stmt,
unsigned int paramIndex,
vector<BDouble> &vect);

BDoubleのベクターに使用します。

void getVector(
Statement *stmt,
unsigned int paramIndex,
vector<BFile> &vect);

Bfileクラスのベクターに使用します。

void getVector(
Statement *stmt,
unsigned int paramIndex,
vector<BFloat> &vect);

BFloatのベクターに使用します。

void getVector(
Statement *stmt,
unsigned int paramIndex,
vector<Blob> &vect);

Blobクラスのベクターに使用します。

void getVector(
Statement *stmt,
unsigned int paramIndex,
vector<Clob> &vect);

Clobのベクターに使用します。

void getVector(
Statement *stmt,
unsigned int paramIndex,
vector<Date> &vect);

Dateクラスのベクターに使用します。

void getVector(
Statement *stmt,
unsigned int paramIndex,
vector<double> &vect);

doubleクラスのベクターに使用します。

void getVector(
Statement *stmt,
unsigned int paramIndex,
vector<float> &vect);

floatクラスのベクターに使用します。

void getVector(
Statement *stmt,
unsigned int paramIndex,
vector<int> &vect);

intクラスのベクターに使用します。

void getVector(
Statement *stmt,
unsigned int paramIndex,
vector<IntervalDS> &vect);

IntervalDSクラスのベクターに使用します。

void getVector(
Statement *stmt,
unsigned int paramIndex,
vector<IntervalYM> &vect);

IntervalYMクラスのベクターに使用します。

void getVector(
Statement *stmt,
unsigned int paramIndex,
vector<Number> &vect);

Numberクラスのベクターに使用します。

void getVector(
Statement *stmt,
unsigned int paramIndex,
vector<RefAny> &vect);

RefAnyクラスのベクターに使用します。

void getVector(
Statement *stmt,
unsigned int paramIndex,
vector<string> &vect);

stringクラスのベクターに使用します。

void getVector(
Statement *stmt,
unsigned int paramIndex,
vector<T *> &vect);

この構文は、関数テンプレートの一部の順序付けがサポートされているプラットフォームで使用します。

void getVector(
Statement *stmt,
unsigned int paramIndex,
vector<T> &vect);

この構文は、Windows NTおよびz/OSなど、関数テンプレートの一部の順序付けがサポートされていないプラットフォームで使用します。OUTバインド用です。

void getVector(
Statement *stmt,
unsigned int paramIndex,
vector<Timestamp> &vect);

Timestampクラスのベクターに使用します。

void getVector(
Statement *stmt,
unsigned int paramIndex,
vector<u <Ref<T> > &vect);

この構文は、関数テンプレートの一部の順序付けがサポートされているプラットフォームでのみ使用できます。

void getVector(
Statement *stmt,
unsigned int paramIndex,
vector<unsigned int> &vect);

unsigned intクラスのベクターに使用します。

パラメータ

説明

stmt

文を指定します。

paramIndex

パラメータ索引を指定します。

vect

値が取得されるベクター（OUTパラメータ）への参照を指定します。

getVectorOfRefs()

このメソッドは、現行の位置の列をREFのベクターで戻します。列はREFのコレクション型（VARRAYまたはネストした表）であることが必要です。OUTバインドで使用します。

構文

void getVectorOfRefs(
Statement *stmt,
unsigned int colIndex,
vector< Ref<T> > &vect);

パラメータ

説明

stmt

文オブジェクトを指定します。

colIndex

列の索引を、第1列は1、第2列は2のように指定します。

vect

REFのベクター（OUTパラメータ）への参照を指定します。Ref<T>に対しては、特化した関数のgetVector()ではなく、getVectorOfRefs()の使用をお薦めします。

isNull()

OUTパラメータには、SQLのNULLの値が含まれる場合があります。isNull()は、最後の値の読込みで、この特別な値があったかどうかをレポートします。最初に、パラメータでgetxxx()をコールしてこの値を読み込み、次に、isNull()をコールして、値がSQLのNULLかどうかを確認する必要があります。最後のパラメータ読込みがSQLのNULLの場合はTRUEを戻します。

構文

bool isNull(
unsigned int paramIndex ) const;

パラメータ

説明

paramIndex

パラメータの索引を、第1パラメータは1、第2パラメータは2のように指定します。

isTruncated()

このメソッドは、パラメータの値が切り捨てられているかどうかをチェックします。パラメータの値が切り捨てられている場合はTRUEを、それ以外の場合はFALSEを戻します。

構文

bool isTruncated(
unsigned int paramIndex) const;

パラメータ

説明

paramIndex

パラメータの索引を、第1パラメータは1、第2パラメータは2のように指定します。

preTruncationLength()

切捨て前のパラメータの実際の長さを戻します。

構文

int preTruncationLength(
unsigned int paramIndex) const;

パラメータ

説明

paramIndex

パラメータの索引を、第1パラメータは1、第2パラメータは2のように指定します。

registerOutParam()

このメソッドは、PL/SQLストアド・プロシージャの各outパラメータのtypeを登録します。PL/SQLストアド・プロシージャを実行する前に、このメソッドを明示的にコールして各outパラメータのtypeを登録する必要があります。このメソッドは、outパラメータに対してのみコールします。IN/OUTパラメータの場合はsetxxx()メソッドを使用します。

- outパラメータの値を読み取る場合は、登録されているパラメータのSQL型に対応するgetxxx()メソッドを使用する必要があります。たとえば、指定されている型がOCCIINTまたはOCCINumberの場合は、getIntまたはgetNumberを使用します。

- PL/SQLストアド・プロシージャにROWID型のoutパラメータがある場合、このメソッドに指定するtypeにはOCCISTRINGを指定します。outパラメータの値は、getString()メソッドをコールして取得できます。

- PL/SQLストアド・プロシージャにROWID型のIN/OUTパラメータがある場合は、setString()メソッドとgetString()メソッドをコールして、型を設定し、IN/OUTパラメータの値を取得します。

構文

説明

void registerOutParam(
unsigned int paramIndex,
Type type,
unsigned int maxSize=0,
const string &sqltype="");

PL/SQLストアド・プロシージャの各outパラメータのtypeを登録します。

void registerOutParam(
unsigned int paramIndex,
Type type,
unsigned int maxSize,
const string typName,
const string &schName);

PL/SQLストアド・プロシージャの各outパラメータのtypeを登録します（stringのサポートの場合）。

void registerOutParam(
unsigned int paramIndex,
Type type,
unsigned int maxSize,
const UString &typName,
const UString &schName);

PL/SQLストアド・プロシージャの各outパラメータのtypeを登録します。グローバリゼーション対応またはUStringのサポートの場合です。

パラメータ

説明

paramIndex

パラメータの索引を、第1パラメータは1、第2パラメータは2のように指定します。

type

typeによって定義されるSQL型コードです。DateやBytesなどのOCCIデータ型に対応するデータ型のみです。

maxSize

取得する値の最大サイズを指定します。OCCIBYTES型およびOCCISTRING型の場合、maxSizeは0 (ゼロ)より大きい値です。

sqltype

データベースの型名を指定します（CREATE TYPEで作成した型を使用します）。

typName

型の名前を指定します。

schName

スキーマ名を指定します。

setAutoCommit()

Statementを自動コミット・モードにできます。この場合、実行済の文も自動的にコミットされます。デフォルトでは、自動コミットモードはオフです。

構文

void setAutoCommit(
bool autoCommit);

パラメータ

説明

autoCommit

TRUEは自動コミット使用可能、FALSEは自動コミット使用禁止です。

setBatchErrorMode()

バッチ・エラー処理モードを使用可能または使用禁止にします。

構文

virtual void setBatchErrorMode(
bool batchErrorMode);

パラメータ

説明

batchErrorMode

TRUEによりバッチ・エラー処理が使用可能になり、FALSEにより使用禁止になります。

setBDouble()

IEEE754のdouble型を、paramIndex属性で指定された位置にあるStatementオブジェクトへのバインド値として設定します。

構文

void setBDouble(
unsigned int paramIndex,
const BDouble &dval);

パラメータ

説明

paramIndex

パラメータの索引を、第1パラメータは1、第2パラメータは2のように指定します。

dval

パラメータの値を指定します。

setBfile()

パラメータをBfile値に設定します。

構文

void setBfile(
unsigned int paramIndex,
const Bfile &val);

パラメータ

説明

paramIndex

パラメータの索引を、第1パラメータは1、第2パラメータは2のように指定します。

val

パラメータの値を指定します。

setBFloat()

IEEE754のfloat型を、paramIndex属性で指定された位置にあるStatementオブジェクトへのバインド値として設定します。

構文

void setBFloat(
unsigned int paramIndex,
const BFloat &fval);

パラメータ

説明

paramIndex

パラメータの索引を、第1パラメータは1、第2パラメータは2のように指定します。

fval

パラメータの値を指定します。

setBinaryStreamMode()

列をバイナリ・ストリームで戻すように定義します。

構文

説明

void setBinaryStreamMode(
unsigned int colIndex,
unsigned int size);

バイナリ・ストリームで戻す列を設定します。

void setBinaryStreamMode(
unsigned int colIndex,
unsigned int size
bool inArg);

バイナリ・ストリームで戻す列を設定します。バインド位置にPL/SQLのINまたはIN/OUT引数がある場合に使用します。

パラメータ

説明

colIndex

列の索引を、第1列は1、第2列は2のように指定します。

size

バイナリStreamで読み取られたり、戻されるデータ量を指定します。

inArg

バインド位置がPL/SQLのINまたはIN/OUT引数の場合はTRUEを渡します。

setBlob()

パラメータをBlob値に設定します。

構文

void setBlob(
unsigned int paramIndex,
const Blob &val);

パラメータ

説明

paramIndex

パラメータの索引を、第1パラメータは1、第2パラメータは2のように指定します。

val

パラメータの値を指定します。

setBytes()

パラメータをBytes配列に設定します。

構文

void setBytes(
unsigned int paramIndex,
const Bytes &val);

パラメータ

説明

paramIndex

パラメータの索引を、第1パラメータは1、第2パラメータは2のように指定します。

val

パラメータの値を指定します。

setCharacterStreamMode()

列をキャラクタ・ストリームで戻すように定義します。

構文

説明

void setCharacterStreamMode(
unsigned int colIndex,
unsigned int size);

キャラクタ・ストリームで戻す列を設定します。

void setCharacterStreamMode(
unsigned int colIndex,
unsigned int size,
bool inArg);

キャラクタ・ストリームで戻す列を設定します。バインド位置にPL/SQLのINまたはIN/OUT引数がある場合に使用します。

パラメータ

説明

colIndex

列の索引を、第1列は1、第2列は2のように指定します。

size

キャラクタStreamで読み取られたり、戻されるデータ量を指定します。

inArg

バインド位置がPL/SQLのINまたはIN/OUT引数の場合はTRUEを渡します。

setCharSet()

指定されたパラメータのデフォルトのキャラクタ・セットを上書きします。データは、指定されたキャラクタ・セットにあるとみなされ、データベース・キャラクタ・セットに変換されます。OUTバインドの場合、これは、データベース・キャラクタの変換先のキャラクタ・セットを指定します。

構文

void setCharSet(
unsigned int paramIndex,
string &charSet);

パラメータ

説明

paramIndex

パラメータの索引を、第1パラメータは1、第2パラメータは2のように指定します。

charSet

選択したキャラクタ・セットを文字列で指定します。

setCharSetUString()

指定されたパラメータのデフォルトのキャラクタ・セットを上書きします。データは、指定されたキャラクタ・セットにあるとみなされ、データベース・キャラクタ・セットに変換されます。OUTバインドの場合、これは、データベース・キャラクタの変換先のキャラクタ・セットを指定します。

構文

void setCharSetUString(
unsigned int paramIndex,
const UString& charSet);

パラメータ

説明

paramIndex

パラメータの索引を、第1パラメータは1、第2パラメータは2のように指定します。

charSet

選択したキャラクタ・セットをUStringで指定します。

setClob()

パラメータをClob値に設定します。

構文

void setClob(
unsigned int paramIndex,
const Clob &val);

パラメータ

説明

paramIndex

パラメータの索引を、第1パラメータは1、第2パラメータは2のように指定します。

val

パラメータの値を指定します。

setDate()

パラメータをDate値に設定します。

構文

void setDate(
unsigned int paramIndex,
const Date &val);

パラメータ

説明

paramIndex

パラメータの索引を、第1パラメータは1、第2パラメータは2のように指定します。

val

パラメータの値を指定します。

setDatabaseNCHARParam()

データベースのNCHARキャラクタ・セットのデータが含まれている列にパラメータを挿入する場合は、TRUE値を渡すことによって、そのことをOCCIに通知する必要があります。デフォルトをリストアするには、FALSEを渡します。戻り値によって、指定されたパラメータに有効なキャラクタ・セットが戻されます。

構文

void setDatabaseNCHARParam(
unsigned int paramIndex,
bool isNCHAR);

パラメータ

説明

paramIndex

パラメータの索引を、第1パラメータは1、第2パラメータは2のように指定します。

isNCHAR

このパラメータに、データベースのNCHARキャラクタ・セットのデータが含まれている場合はTRUEを、それ以外の場合はFALSEを戻します。

setDataBuffer()

データが使用可能なデータ・バッファを指定します。コール可能文のOUTバインド・パラメータにも使用されます。

このbufferパラメータは、ユーザーが割り当てたデータ・バッファへのポインタです。データの現在の長さをlengthパラメータに指定する必要があります。データ量は、sizeパラメータを超えないようにします。typeには、データのデータ型を指定します。

すべてのtypeがバッファに指定できるわけではありません。たとえば、OCCIに割り当てられているすべての型（BytesやDateなど）はsetDataBuffer()インタフェースでは指定できません。同様に、C++標準ライブラリ文字列は、setDataBuffer()インタフェースでは提供できません。typeは、VARCHAR2、CSTRING、CHARZなどのOCIデータ型にできます。

反復実行や配列実行で、setDataBuffer()を使用してデータを指定する場合は、最初の反復のみで1回のみコールする必要があります。後続の反復で、OCCIは、データの位置をbuffer +(i*size)（iは反復番号）であるとみなします。同様に、データの長さは、(length+i)とみなされます。

構文

void setDataBuffer(
unsigned int paramIndex,
void *buffer,
Type type,
sb4 size,
ub2 *length,
sb2 *ind = NULL,
ub2 *rc= NULL);

パラメータ

説明

paramIndex

パラメータの索引を、第1パラメータは1、第2パラメータは2のように指定します。

buffer

ユーザーが割り当てたバッファへのポインタを指定します。反復実行または配列実行が行われる場合、バッファにはnumIterations()でのsizeのバイト数が必要です。配列フェッチが行われる場合、バッファにはnumRows * sizeのバイト数が必要です。収集または分散のバインドおよび定義が行われる場合、この構造には、OCIIOVecのアドレスおよびそのアドレスで開始されるOCIIOVec要素の数が格納されます。

type

バッファに入る（取得する）データの型を指定します。

size

データ・バッファのサイズを指定します。反復実行や配列実行の場合、このサイズはデータ項目の各要素のサイズです。収集または分散のバインドおよび定義の場合、このサイズはbufferが指すOCIIOVecArrayのサイズです。modeはIOVECに設定する必要があります。

length

バッファのデータ長へのポインタを指定します。反復実行や配列実行の場合、データ長は各バッファ要素に対する長さデータの配列です。配列のサイズはarrayLength()と等しくしてください。

ind

インジケータを指定します。反復実行および配列実行の場合、インジケータはすべてのバッファ要素に対するものです。

rc

コードを戻します。反復実行および配列実行の場合、リターン・コードはすべてのバッファ要素に対するものです。

setDataBufferArray()

読込みまたは書込み可能なデータがあるデータ・バッファの配列を指定します。配列パラメータの読込み/書込みを行うストアド・プロシージャのIN、OUTおよびIN/OUTバインド・パラメータに使用します。

- ストアド・プロシージャは、IN、IN/OUTまたはOUTパラメータの値の配列を保持できます。この場合、パラメータはsetDataBufferArray()メソッドを使用して指定する必要があります。配列は、反復実行や配列実行に対するsetDataBuffer()メソッドと同じように指定されますが、配列の要素数は*arrayLengthパラメータによって決まります。

- OUTおよびIN/OUTパラメータの場合、配列の最大要素数は、arraySizeパラメータで指定されます(戻されます)。クライアントは、bufferにsize *arraySize分のバイトが割り当てられていることを確認する必要があります。プリコンパイルされた反復SQL文の場合、配列の要素数は反復回数によって決まります。配列実行の場合の配列の要素数は、executeArrayUpdate()メソッドのarrayLengthパラメータによって決まります。ただし、ストアド・プロシージャの配列パラメータの場合、配列の要素数は、setDataBufferArray()メソッドのarrayLengthパラメータで指定する必要があります。これは、各パラメータに異なるサイズの配列がある場合があるためです。

- この指定方法はプリコンパイルされたSQL文の場合と異なります。反復実行および配列実行の場合、各パラメータの配列の要素数は同じであり、要素の数は文の反復数によって決まります。しかし、コール可能文は1回のみ実行され、それぞれのパラメータは、長さの異なる可変長の配列である可能性があります。

構文

void setDataBufferArray(
unsigned int paramIndex,
void *buffer,
Type type,
ub4 arraySize,
ub4 *arrayLength,
sb4 elementSize,
ub2 *elementLength,
sb2 *ind = NULL,
ub2 *rc = NULL);

パラメータ

説明

paramIndex

パラメータの索引を、第1パラメータは1、第2パラメータは2のように指定します。

buffer

ユーザーが割り当てたバッファへのポインタを指定します。バッファにはsize * arraySize分のバイトが必要です。収集または分散のバインドおよび定義が行われる場合、この構造には、OCIIOVecのアドレスおよびそのアドレスで開始されるOCIIOVec要素の数が格納されます。

type

バッファに入る（取得する）データの型を指定します。

arraySize

配列の最大要素数を指定します。

arrayLength

配列の現行の要素数へのポインタを指定します。

elementSize

各要素に対するデータ・バッファのサイズを指定します。反復実行および配列実行の場合、このサイズはデータ項目の各要素のサイズです。収集または分散のバインドおよび定義を使用する場合、このサイズはOCIIOVecArrayのサイズです。モードはIOVECに設定する必要があります。

elementLemgth

長さの配列へのポインタを指定します。elementLength[i]は、配列内のi番目の要素の現在の長さです。

ind

インジケータの配列へのポインタを指定します。これは、すべてのバッファ要素に対するインジケータです。

rcs

リターン・コードの配列へのポインタを指定します。

setDouble()

パラメータをC++のdouble型の値に設定します。

構文

void setDouble(
unsigned int paramIndex,
double val);

パラメータ

説明

paramIndex

パラメータの索引を、第1パラメータは1、第2パラメータは2のように指定します。

val

パラメータの値を指定します。

setErrorOnNull()

文のparamIndexパラメータで、NULL値の読込みに対する例外を使用可能/使用禁止にします。例外を使用可能にして、paramIndexパラメータでgetxxx()をコールすると、パラメータの値がNULLの場合は、結果がSQLExceptionになります。このコールは、例外を使用禁止にする際にも使用できます。

構文

void setErrorOnNull(
unsigned int paramIndex,
bool causeException);

パラメータ

説明

paramIndex

パラメータの索引を、第1パラメータは1、第2パラメータは2のように指定します。

causeException

TRUEの場合、例外は使用可能です。FALSEの場合は使用禁止です。

setErrorOnTruncate()

このメソッドは、切捨てが発生する際の例外を使用可能/使用禁止にします。

構文

void setErrorOnTruncate(
unsigned int paramIndex,
bool causeException);

パラメータ

説明

paramIndex

パラメータの索引を、第1パラメータは1、第2パラメータは2のように指定します。

causeException

TRUEの場合、例外は使用可能です。FALSEの場合は使用禁止です。

setFloat()

パラメータをC++のfloat型の値に設定します。

構文

void setFloat(
unsigned int paramIndex,
float val);

パラメータ

説明

paramIndex

パラメータの索引を、第1パラメータは1、第2パラメータは2のように指定します。

val

パラメータの値を指定します。

setInt()

パラメータをC++のint型の値に設定します。

構文

void setInt(
unsigned int paramIndex,
int val);

パラメータ

説明

paramIndex

パラメータの索引を、第1パラメータは1、第2パラメータは2のように指定します。

val

パラメータの値を指定します。

setIntervalDS()

パラメータをIntervalDS値に設定します。

構文

void setIntervalDS(
unsigned int paramIndex,
const IntervalDS &val);

パラメータ

説明

paramIndex

パラメータの索引を、第1パラメータは1、第2パラメータは2のように指定します。

val

パラメータの値を指定します。

setIntervalYM()

パラメータをInterval値に設定します。

構文

void setIntervalYM(
unsigned int paramIndex,
const IntervalYM &val);

パラメータ

説明

paramIndex

パラメータの索引を、第1パラメータは1、第2パラメータは2のように指定します。

val

パラメータの値を指定します。

setMaxIterations()

DML文に対して行われる起動の最大数を設定します。プリコンパイルされたSQL文にパラメータが設定される前にコールする必要があります。反復数を大きくすると、1回のラウンドトリップでサーバーに送信されるパラメータ数が多くなります。ただし、数を大きくすると、すべてのパラメータに対して、より多くのメモリーが確保されます。この設定は、単に最大制限です。実質的な反復数は、addIteration()のコール数に依存します。

構文

void setMaxIterations(
unsigned int maxIterations);

パラメータ

説明

maxIterations

この文に対して許可する最大の反復回数を指定します。

setMaxParamSize()

このメソッドは、指定されたパラメータに関して受渡しされるデータの最大量を設定します。文字とバイナリ・データに対してのみ適用されます。最大量を超過すると、超過したデータは廃棄されます。このメソッドは、LONG列を取り扱う場合に大変有効です。文字列またはBytesデータ型に読込みまたは書込みを行って、LONG列の切捨てを行う際に使用できます。

getSQL()メソッドまたはsetBytes()メソッドが、PL/SQLプロシージャのIN/OUTパラメータに値をバインドするためにコールされていて、OUTの値のサイズがINの値のサイズを超過することが予想される場合は、setMaxParamSize()をコールする必要があります。

構文

void setMaxParamSize(
unsigned int paramIndex,
unsigned int maxSize);

パラメータ

説明

paramIndex

パラメータの索引を、第1パラメータは1、第2パラメータは2のように指定します。

maxSize

新規の最大パラメータ・サイズ制限（>0）を指定します。

setNull()

パラメータをSQLのNULLに設定します。パラメータのSQL型を指定する必要があります。

構文

説明

void setNull(
unsigned int paramIndex,
Type type);

オブジェクトを使用してパラメータの値をNULLに設定します。

void setNull(
unsigned int paramIndex,
Type type,
const string &typeName,
const string &schemaName = "")

オブジェクト型およびコレクション型のOCCIPOBJECTおよびOCCIVECTORについて、パラメータ値をNULLに設定します。オブジェクト型またはコレクション型の該当するスキーマおよび型名を使用します。stringをサポートする場合です。

void setNull(
unsigned int paramIndex,
Type type,
UString &typeName,
UString &schemaName);

オブジェクト型およびコレクション型のOCCIPOBJECTおよびOCCIVECTORについて、パラメータ値をNULLに設定します。オブジェクト型またはコレクション型の該当するスキーマおよび型名を使用します。UStringをサポートする場合です。

パラメータ

説明

paramIndex

パラメータの索引を、第1パラメータは1、第2パラメータは2のように指定します。

type

SQL型を指定します。

typeName

オブジェクトまたはコレクションの型名を指定します。

schemaName

オブジェクトまたはコレクションが定義されているスキーマの名前を指定します。

setNumber()

パラメータをNumber値に設定します。

構文

void setNumber(
unsigned int paramIndex,
const Number &val);

パラメータ

説明

paramIndex

パラメータの索引を、第1パラメータは1、第2パラメータは2のように指定します。

val

パラメータの値を指定します。

setObject()

オブジェクトを使用してパラメータの値を設定します。整数値に対してC++言語に相当するオブジェクトを使用します。OCCI仕様によって、C++のObject型からSQL型への標準マッピングが指定されます。指定されたパラメータのC++オブジェクトは、データベースに送信される前に対応するSQL型に変換されます。

構文

void setObject(
unsigned int paramIndex,
PObject* val);

パラメータ

説明

paramIndex

パラメータの索引を、第1パラメータは1、第2パラメータは2のように指定します。

val

入力パラメータの値が含まれているオブジェクトを指定します。

sqltyp

設定するオブジェクトのSQL型名を指定します。

setPrefetchMemorySize()

サーバーへの各ラウンドトリップでフェッチしたデータを格納するために、OCCIによって繰り返し使用されるメモリー・サイズを設定します。0（ゼロ）の値は、ラウンドトリップ中にフェッチしたデータの量がFetchRowCountパラメータによって制限されることを意味します。両方のパラメータが0（ゼロ）でない場合、2つのうち量の少ないほうが使用されます。

構文

void setPrefetchMemorySize(
unsigned int bytes);

パラメータ

説明

bytes

各サーバーのラウンドトリップ中にフェッチされたデータの格納に使用するバイト数を指定します。

setPrefetchRowCount()

サーバーへの各ラウンドトリップで、OCCIによって繰り返しフェッチされる行数を設定します。0（ゼロ）の値は、ラウンドトリップ中にフェッチしたデータの量がFetchMemorySizeパラメータによって制限されることを意味します。両方のパラメータが0（ゼロ）でない場合、2つのうち量の少ないほうが使用されます。両方のパラメータが0（ゼロ）の場合、行カウントが内部的に1行にデフォルト設定され、これが、getFetchRowCount()メソッドから戻る値となります。

構文

void setPrefetchRowCount(
unsigned int rowCount);

パラメータ

説明

rowCount

サーバーへの各ラウンドトリップでフェッチする行数を指定します。

setRef()

パラメータの値を参照に設定します。Ref<T>インスタンスは、このコール中に暗黙的にRefAnyオブジェクトに変換されます。

構文

説明

void setRef(
unsigned int paramIndex,
const RefAny &refAny);

パラメータの値を参照に設定します。

void setRef(
unsigned int paramIndex,
const RefAny &refAny,
const string &typName,
const string &schName = "");

パラメータの値を参照に設定します。Statementがコール可能PL/SQLメソッドを表す場合、Refによって表されているスキーマ名およびオブジェクトの型名を渡します。stringをサポートする場合です。

void setRef(
unsigned int paramIndex,
const RefAny &refAny,
const UString &typName,
const UString &schName);

パラメータの値を参照に設定します。Statementがコール可能PL/SQLメソッドを表す場合、Refによって表されているスキーマ名およびオブジェクトの型名を渡します。UStringをサポートする場合です。

パラメータ

説明

paramIndex

パラメータの索引を、第1パラメータは1、第2パラメータは2のように指定します。

refAny

参照を指定します。

typName

オブジェクトの型を指定します（オプション）。

schName

オブジェクト型が定義されているスキーマを指定します（オプション）。

setRowid()

バインドの位置に対して、Rowidバイト配列を設定します。

構文

void setRowid(
unsigned int paramIndex,
const Bytes &val);

パラメータ

説明

paramIndex

パラメータの索引を、第1パラメータは1、第2パラメータは2のように指定します。

val

パラメータの値を指定します。

setSQL()

このコールを使用して、新規SQL文字列をStatementオブジェクトに関連付けることができます。前のSQL文に関連付けられているリソースは解放されます。特に、前に取得した結果セットは無効になります。Statementの作成時に空のSQL文字列""が使用された場合は、最初に適切なSQL文字列を使用してsetSQLメソッドを実行する必要があります。

構文

void setSQL(
const string &sql);

パラメータ

説明

sql

SQL文を指定します。

setSQLUString()

このオブジェクトにSQL文を関連付けます。Unicodeサポート: クライアントのEnvironmentをOCCIUTIF16モードで初期化する必要があります。

構文

void setSQLUString(
const UString &sql);

パラメータ

説明

sql

SQL文を文の接続元と同じキャラクタ・セットで指定します。

setString()

指定された索引のパラメータを設定します。

構文

void setString(
unsigned int paramIndex,
const string &val);

パラメータ

説明

paramIndex

パラメータの索引を、第1パラメータは1、第2パラメータは2のように指定します。

val

パラメータの値を指定します。

setTimestamp()

パラメータをTimestamp値に設定します。

構文

void setTimestamp(
unsigned int paramIndex,
const Timestamp &val);

パラメータ

説明

paramIndex

パラメータの索引を、第1パラメータは1、第2パラメータは2のように指定します。

val

パラメータの値を指定します。

setUInt()

パラメータをC++のunsigned int型の値に設定します。

構文

void setUInt(
unsigned int paramIndex,
unsigned int val);

パラメータ

説明

paramIndex

パラメータの索引を、第1パラメータは1、第2パラメータは2のように指定します。

val

パラメータの値を指定します。

setUString()

指定された索引のパラメータを設定します。グローバリゼーション対応の場合です。

構文

void setUString(
unsigned int paramIndex,
const UString &val);

パラメータ

説明

paramIndex

パラメータの索引を、第1パラメータは1、第2パラメータは2のように指定します。

val

パラメータの値を指定します。

setVector()

パラメータをベクターに設定します。このメソッドは、型がコレクション型、VARRAYまたはネストした表の場合に必要です。コレクション内の要素のSQL型は、ベクターの型との互換性が必要です。たとえば、コレクションがVARCHAR2のVARRAYの場合は、vector<string>を使用します。

構文

説明

void setVector(
Statement *stmt,
unsigned int paramIndex,
const vector< T > &vect,
const string &schemaName,
const string &typeName);

この構文は、Windows NTおよびz/OSなど、関数テンプレートの一部の順序付けがサポートされていないプラットフォームで使用します。これはマルチバイト・サポート用です。

void setVector(
Statement *stmt,
unsigned int paramIndex,
const vector<T* > &vect,
const string &schemaName,
const string &typeName);

この構文は、関数テンプレートの一部の順序付けがサポートされているプラットフォームで使用します。これはマルチバイト・サポート用です。

void setVector(
Statement *stmt,
unsigned int paramIndex,
const vector<BDouble> &vect
const string &sqltype);

BDoubleのベクターを設定します。

void setVector(
Statement *stmt,
unsigned int paramIndex,
const vector<Bfile> &vect,
const string &schemaName,
const string &typeName);

const Bfileのベクターを設定します。マルチバイト・サポートの場合です。

void setVector(
Statement *stmt,
unsigned int paramIndex,
const vector<Bfile> &vect,
const UString &schemaName,
const UString &typeName);

const BFileのベクターを設定します。UTF16サポートの場合です。

void setVector(
Statement *stmt,
unsigned int paramIndex,
const vector<BFloat> &vect
const string &sqltype);

BFloatのベクターを設定します。

void setVector(
Statement *stmt,
unsigned int paramIndex,
const vector<Blob> &vect,
const string &schemaName,
const string &typeName);

const Blobのベクターを設定します。マルチバイト・サポートの場合です。

void setVector(
Statement *stmt,
unsigned int paramIndex,
const vector<Blob> &vect,
const UString &schemaName,
const UString &typeName);

const Blobのベクターを設定します。UTF16サポートの場合です。

void setVector(
Statement *stmt,
unsigned int paramIndex,
const vector<Clob> &vect,
const string &schemaName,
const string &typeName);

const Clobのベクターを設定します。マルチバイト・サポートの場合です。

void setVector(
Statement *stmt,
unsigned int paramIndex,
const vector<Clob> &vect,
const UString &schemaName,
const UString &typeName);

const Clobのベクターを設定します。UTF16サポートの場合です。

void setVector(
Statement *stmt,
unsigned int paramIndex,
const vector<Date> &vect,
const string &schemaName,
const string &typeName);

const Dateのベクターを設定します。マルチバイト・サポートの場合です。

void setVector(
Statement *stmt,
unsigned int paramIndex,
const vector<Date> &vect,
const UString &schemaName,
const UString &typeName);

const Dateのベクターを設定します。UTF16サポートの場合です。

void setVector(
Statement *stmt,
unsigned int paramIndex,
const vector<double> &vect,
const string &schemaName,
const string &typeName);

const doubleのベクターを設定します。マルチバイト・サポートの場合です。

void setVector(
Statement *stmt,
unsigned int paramIndex,
const vector<double> &vect,
const UString &schemaName,
const UString &typeName);

const doubleのベクターを設定します。UTF16サポートの場合です。

void setVector(
Statement *stmt,
unsigned int paramIndex,
const vector<float> &vect,
const string &schemaName,
const string &typeName);

const floatのベクターを設定します。マルチバイト・サポートの場合です。

void setVector(
Statement *stmt,
unsigned int paramIndex,
const vector<float> &vect,
const UString &schemaName,
const UString &typeName);

const floatのベクターを設定します。UTF16サポートの場合です。

void setVector(
Statement *stmt,
unsigned int paramIndex,
const vector<int> &vect,
const string &schemaName,
const string &typeName);

const intのベクターを設定します。マルチバイト・サポートの場合です。

void setVector(
Statement *stmt,
unsigned int paramIndex,
const vector<int> &vect,
const UString &schemaName,
const UString &typeName);

const intのベクターを設定します。UTF16サポートの場合です。

void setVector(
Statement *stmt,
unsigned int paramIndex,
const vector<IntervalDS> &vect,
const string &schemaName,
const string &typeName);

const IntervalDSのベクターを設定します。マルチバイト・サポートの場合です。

void setVector(
Statement *stmt,
unsigned int paramIndex,
const vector<IntervalDS> &vect,
const UString &schemaName,
const UString &typeName);

const IntervalDSのベクターを設定します。UTF16サポートの場合です。

void setVector(
Statement *stmt,
unsigned int paramIndex,
const vector<IntervalYM> &vect,
const string &schemaName,
const string &typeName);

const IntervalYMのベクターを設定します。マルチバイト・サポートの場合です。

void setVector(
Statement *stmt,
unsigned int paramIndex,
const vector<IntervalYM> &vect,
const UString &schemaName,
const UString &typeName);

const IntervalYMのベクターを設定します。UTF16サポートの場合です。

void setVector(
Statement *stmt,
unsigned int paramIndex,
const vector<Number> &vect,
const string &schemaName,
const string &typeName);

const Numberのベクターを設定します。マルチバイト・サポートの場合です。

void setVector(
Statement *stmt,
unsigned int paramIndex,
const vector<Number> &vect,
const UString &schemaName,
const UString &typeName);

const Numberのベクターを設定します。UTF16サポートの場合です。

void setVector(
Statement *stmt,
unsigned int paramIndex,
const vector<RefAny> &vect,
const string &schemaName,
const string &typeName);

const RefAnyのベクターを設定します。マルチバイト・サポートの場合です。

void setVector(
Statement *stmt,
unsigned int paramIndex,
const vector<RefAny> &vect,
const UString &schemaName,
const UString &typeName);

const RefAnyのベクターを設定します。UTF16サポートの場合です。

void setVector(
Statement *stmt,
unsigned int paramIndex,
const vector<string> &vect,
const string &schemaName,
const string &typeName);

const stringのベクターを設定します。マルチバイト・サポートの場合です。

void setVector(
Statement *stmt,
unsigned int paramIndex,
const vector<string> &vect,
const UString &schemaName,
const UString &typeName);

const stringのベクターを設定します。UTF16サポートの場合です。

void setVector(
Statement *stmt,
unsigned int paramIndex,
const vector<Timestamp> &vect,
const string &schemaName,
const string &typeName);

const Timestampのベクターを設定します。マルチバイト・サポートの場合です。

void setVector(
Statement *stmt,
unsigned int paramIndex,
const vector<Timestamp> &vect,
const UString &schemaName,
const UString &typeName);

const Timestampのベクターを設定します。UTF16サポートの場合です。

void setVector(
Statement *stmt,
unsigned int paramIndex,
const vector<unsigned int> &vect,
const string &schemaName,
const string &typeName);

const unsigned intのベクターを設定します。マルチバイト・サポートの場合です。

void setVector(
Statement *stmt,
unsigned int paramIndex,
const vector<unsigned int> &vect,
const UString &schemaName,
const UString &typeName);

const unsigned intのベクターを設定します。UTF16サポートの場合です。

void setVector(
Statement *stmt,
unsigned int paramIndex,
vector<Bfile> &vect,
string &sqltype);

Bfileのベクターを設定します。

void setVector(
Statement *stmt,
unsigned int paramIndex,
vector<Blob> &vect,
string &sqltype);

Blobのベクターを設定します。

void setVector(
Statement *stmt,
unsigned int paramIndex,
vector<Clob> &vect,
string &sqltype);

Clobのベクターを設定します。

void setVector(
Statement *stmt,
unsigned int paramIndex,
vector<Date> &vect,
string &sqltype);

Dateのベクターを設定します。

void setVector(
Statement *stmt,
unsigned int paramIndex,
vector<double> &vect,
string &sqltype);

doubleのベクターを設定します。

void setVector(
Statement *stmt,
unsigned int paramIndex,
vector<float> &vect,
string &sqltype);

floatのベクターを設定します。

void setVector(
Statement *stmt,
unsigned int paramIndex,
vector<int> &vect,
string &sqltype);

intのベクターを設定します。

void setVector(
Statement *stmt,
unsigned int paramIndex,
vector<IntervalDS> &vect,
string &sqltype);

IntervalDSのベクターを設定します。

void setVector(
Statement *stmt,
unsigned int paramIndex,
vector<IntervalYM> &vect,
string &sqltype);

IntervalYMのベクターを設定します。

void setVector(
Statement *stmt,
unsigned int paramIndex,
vector<Number> &vect,
string &sqltype);

Numberのベクターを設定します。

void setVector(
Statement *stmt,
unsigned int paramIndex,
vector<RefAny> &vect,
string &sqltype);

RefAnyのベクターを設定します。

void setVector(
Statement *stmt,
unsigned int paramIndex,
vector<string> &vect,
string &sqltype);

stringのベクターを設定します。

void setVector(
Statement *stmt,
unsigned int paramIndex,
vector<Timestamp> &vect,
string &sqltype);

Timestampのベクターを設定します。

void setVector(
Statement *stmt,
unsigned int paramIndex,
vector<unsigned int> &vect,
string &sqltype);

unsigned intのベクターを設定します。

template <class T>
void setVector(
Statement *stmt,
unsigned int paramIndex,
const vector< T* > &vect,
const string &sqltype);

この構文は、関数テンプレートの一部の順序付けがサポートされていないプラットフォームで使用します。

template <class T>
void setVector(
Statement *stmt,
unsigned int paramIndex,
const vector<T> &vect,
const string &sqltype);

この構文は、関数テンプレートの一部の順序付けがサポートされているプラットフォームで使用します。

template <class T>
void setVector(
Statement *stmt,
unsigned int paramIndex,
vector<Ref<T>> &vect,
string &sqltype);

この構文は、関数テンプレートの一部の順序付けがサポートされているプラットフォームでのみ使用できます。かわりにsetVectorOfRefs()を使用できます。

パラメータ

説明

stmt

パラメータを設定する文を指定します。

paramIndex

パラメータの索引を、第1パラメータは1、第2パラメータは2のように指定します。

vect

設定するベクターを指定します。

sqltype

データベース内のコレクションのSQL型を指定します。たとえば、CREATE TYPE num_coll AS VARRAY OF NUMBERの場合を考えてみます。列/パラメータの型はnum_collとします。この場合、SQL型はnum_collになります。

schemaName

使用するスキーマの名前を指定します。

typeName

型

setVectorOfRefs()

パラメータをベクターに設定します。型がREFのコレクション型またはREFのネストした表の場合に必要です。

構文

説明

template  <class T> void setVectorOfRefs(
Statement *stmt, unsigned int paramIndex,
const vector<Ref<T> > &vect,
const string &sqltype);

パラメータをベクターに設定します。型がREFのコレクション型(REFのVARRAYまたはネストした表)の場合に必要です。

template  <class T>  void setVectorOfRefs(
Statement *stmt,
unsigned int paramIndex,
const vector<Ref<T> > &vect,
const string &sqltype);

マルチバイト・サポート用に使用します。

template  <class T> void setVectorOfRefs(
Statement *stmt,
unsigned int paramIndex,
const vector<Ref<T>> &vect,
const string &schemaName,
const string &typeName);

マルチバイト・サポート用に使用します。

template  <class T> void setVectorOfRefs(
Statement *stmt,
unsigned int paramIndex,
const vector<Ref<T> &vect,
const UString &schemaName,
const UString &typeName);

この構文は、Windows NTおよびz/OSなど、関数テンプレートの一部の順序付けがサポートされていないプラットフォームでUTF16をサポートする場合に使用します。

template <class T>  void setVector(
Statement *stmt,
unsigned int paramIndex,
const vector<T* > &vect,
const UString &schemaName,
const UString &typeName);

この構文は、関数テンプレートの一部の順序付けがサポートされているプラットフォームでUTF16をサポートする場合に使用します。

パラメータ

説明

stmt

パラメータを設定する文を指定します。

paramIndex

パラメータの索引を、第1パラメータは1、第2パラメータは2のように指定します。

vect

設定するベクターを指定します。

sqltype

パラメータまたは列のSQL型を指定します。Ref<T>に対しては、特化した関数のsetVector()ではなく、setVectorOfRefs()を使用してください。

schemaName

使用するスキーマの名前を指定します。

typeName

型

status()

文の現在のステータスを戻します。書き込む（または読み込む）ストリーム・データがある場合に役に立ちます。getCurrentStreamParam()やgetCurrentIteration()などの他のメソッドをコールすると、書き込む必要があるストリーム・パラメータおよび反復実行や配列実行の現在の反復数を確認できます。このstatus()メソッドは、実行のステータスを確認するために繰り返しコールできます。

戻り値Statusについては、表13-43を参照してください。

構文

Status status() const;

Streamクラス

Streamを使用してストリーム・データ（通常はLONG）を読込みまたは書込みします。

- 読込み可能なStreamは、結果セットからストリーム・データを取得するため、またはストアド・プロシージャ・コールからOUTバインド変数を取得するために使用されます。読込み可能なStreamは、データの最後に達するまで完全に読み取る必要があります。そうでない場合は、クローズして、不要なデータを廃棄する必要があります。

- 書込み可能なStreamは、ストリーム・データ（通常はLONG）を、コール可能文を含むパラメータ化された文に提供するために使用されます。

表13-45 Streamクラスで使用される列挙値

属性

オプション

Status

- READY_FOR_READは、Streamの読込み操作の準備ができていることを示します。

- READY_FOR_WRITEは、Streamの書込み操作の準備ができていることを示します。

- INACTIVEは、Streamが準備または書込み操作に利用できないことを示します。

表13-46 Streamメソッドの概要

メソッド

概要

readBuffer()

ストリームを読み込み、Streamオブジェクトから読み込んだデータ量を戻します。

readLastBuffer()

ストリームから最後のバッファを読み込みます。

writeBuffer()

バッファからストリームにデータを書き込みます。

writeLastBuffer()

バッファからストリームに最後のデータを書き込みます。

status()

ストリームの現在のステータスを戻します。

readBuffer()

Streamからデータを読み込みます。sizeパラメータによって、読み込むバイト文字の最大数が指定されます。Streamオブジェクトから読み込んだデータ量を戻します。-1は、ストリームのデータの終了を意味します。

構文

virtual int readBuffer(
char *buffer,
unsigned int size) = 0;

パラメータ

説明

buffer

データ・バッファのポインタを指定します。ポインタは、コール元で割当ておよび解放する必要があります。

size

読み取るバイト数を指定します。

readLastBuffer()

Streamから最後のバッファを読み込みます。読み込まないデータを廃棄するためにコールすることもできます。sizeパラメータによって、読み込むバイト文字の最大数が指定されます。Streamオブジェクトから読み取ったデータ量を戻します。-1は、ストリームのデータの終了を意味します。

構文

virtual int readLastBuffer(
char *buffer,
unsigned int size) = 0;

パラメータ

説明

buffer

データ・バッファのポインタを指定します。ポインタは、コール元で割当ておよび解放する必要があります。

size

読み取るバイト数を指定します。

writeBuffer()

バッファからストリームにデータを書き込みます。データ量は、サイズによって決まります。

構文

virtual void writeBuffer(
char *buffer,
unsigned int size) = 0;

パラメータ

説明

buffer

データ・バッファへのポインタを指定します。

size

書き込むchars数を指定します。

writeLastBuffer()

このメソッドは、バッファからストリームに最後のデータを書き込みます。データの最後のチャンクを書き込むためにコールすることもできます。書き込まれるデータ量は、サイズによって決まります。

構文

virtual void writeLastBuffer(
char *buffer,
unsigned int size) = 0;

パラメータ

説明

buffer

データ・バッファへのポインタを指定します。

size

書き込むバイト数を指定します。

status()

現在のStatusを戻します。表13-45の定義を参照してください。

構文

virtual Status status() const;

Subscriptionクラス

Subscriptionクラスは、通知に対するサブスクライバの登録に必要な情報と操作をカプセル化します。

表13-47 Subscriptionクラスで使用される列挙値

属性

オプション

Presentation

- PRES_DEFAULTは、イベント通知がデフォルトの形式であることを示します。

- PRES_XMLは、イベント通知がXML形式であることを示します。

Protocol

- PROTO_CBKは、クライアントが、デフォルトのシステム・プロトコルによりイベント通知を受信することを示します。

- PROTO_MAILは、クライアントが、xyz@oracle.comなどの電子メール経由でイベント通知を受信することを示します。データベースでは、この電子メール・アドレスが有効かどうかはチェックされません。

- PROTO_SERVERは、クライアントが、schema.procedureなどのデータベースの起動済PL/SQLプロシージャ経由でイベント通知を受信することを示します。サブスクライバには、プロシージャに対する適切なパーミッションが必要です。

- PROTO_HTTPは、クライアントが、http://www.oracle.com:80などのHTTP URL経由でイベント通知を受信することを示します。データベースでは、このURLが有効かどうかはチェックされません。

Namespace

- NS_ANONYMOUSは、登録が匿名ネームスペースで行われることを示します。

- NS_AQは、登録がOracle Streams Advanced Queuingのネームスペースで行われることを示します。

表13-48 Subscriptionメソッドの概要

メソッド

概要

Subscription()

Subscriptionクラスのコンストラクタです。

getCallbackContext()

コールバックのコンテキストを取り出します。

getDatabaseServersCount()

クライアントが登録する可能性のあるデータベース・サーバーの数を取得します。

getDatabaseServerNames()

クライアントが通知対象を登録した全データベース・サーバーの名前を戻します。

getNotifyCallback()

登録済コールバック関数へのポインタを戻します。

getPayload()

ポスティング前にSubscriptionオブジェクトで設定されていたペイロードを取り出します。

getSubscriptionName()

Subscriptionの名前を取り出します。

getSubscriptionNamespace()

Subscriptionのネームスペースを取り出します。

getRecipientName()

Subscription受信者の名前を取り出します。

getPresentation()

通知表示モードを取り出します。

getProtocol()

通知プロトコルを取り出します。

isNull()

SubscriptionがNULLかどうかを確認します。

operator=()

Subscriptionの代入演算子です。

setCallbackContext()

OCIプロトコル用のコールバック関数を登録します。

setDatabaseServerNames()

クライアントに通知を送信するデータベース・サーバーの識別名を指定します。

setNotifyCallback()

ユーザー・コールバックに渡されるコンテキストを指定します。

setNull()

SubscriptionオブジェクトをNULLに設定し、このオブジェクトに関連付けられているメモリーを解放します。

setSubscriptionName()

サブスクリプションの名前を指定します。

setSubscriptionNamespace()

サブスクリプションが使用されるネームスペースを指定します。

setPayload()

通知のバッファの内容を指定します。

setRecipientName()

通知受信者の名前を指定します。

setPresentation()

クライアントで通知の受信に使用する表示モードを指定します。

setProtocol()

クライアントで通知の受信に使用するプロトコルを指定します。

setSubscriptionName()

サブスクリプションの名前を指定します。

setSubscriptionNamespace()

サブスクリプションが使用されるネームスペースを指定します。

setRecipientName()

通知受信者の名前を指定します。

Subscription()

Subscriptionクラスのコンストラクタです。

構文

説明

Subscription (
const Environment *env );

指定されたEnvironment内でSubscriptionを作成します。

Subscription(
const Subscription& sub);

コピー・コンストラクタです。

構文

Subscription(const Subscription& sub);

パラメータ

説明

env

Environmentを指定します。

sub

元のSubscriptionです。

getCallbackContext()

コールバックのコンテキストを取り出します。

構文

void* getCallbackContext() const;

getDatabaseServersCount()

クライアントが登録する可能性のあるデータベース・サーバーの数を取り出します。

構文

unsigned int getDatabaseServersCount() const;

getDatabaseServerNames()

クライアントが通知対象を登録した全データベース・サーバーの名前を戻します。

構文

vector<string> getDatabaseServerNames() const;

getNotifyCallback()

このSubscriptionの登録済コールバック関数へのポインタを戻します。

構文

unsigned int (*getNotifyCallback() const)(
Subscription& sub,
NotifyResult *nr);

パラメータ

説明

sub

Subscriptionを指定します。

nr

NotifyResultを指定します。

getPayload()

ポスティング前にSubscriptionオブジェクトで設定されていたペイロードを取り出します。

構文

Bytes getCPayload() const;

getSubscriptionName()

サブスクリプションの名前を取り出します。

構文

string getSubscriptionName() const;

getSubscriptionNamespace()

サブスクリプションのネームスペースを取得します。サブスクリプション名には、ネームスペースとの一貫性が必要です。有効なNamespace値は、NS_AQおよびNS_ANONYMOUSです。表13-47の定義を参照してください。

構文

Namespace getSubscriptionNamespace() const;

getRecipientName()

通知受信者の名前を取得します。可能な戻り値は、プロトコルに応じて電子メール・アドレス、HTTPのURLおよびPL/SQLプロシージャです。

構文

string getRecipientName() const;

getPresentation()

クライアントで通知の受信に使用する表示モードを取得します。有効なPresentation値は、表13-47の定義を参照してください。

構文

Presentation getPresentation() const;

getProtocol()

クライアントで通知の受信に使用するプロトコルを取得します。有効なProtocol値は、表13-47の定義を参照してください。

構文

Protocol getProtocol() const;

isNull()

SubscriptionがNULLの場合はTRUEを、それ以外の場合はFALSEを戻します。

構文

bool isNull() const;

operator=()

Subscriptionの代入演算子です。

構文

void operator=(
const Subscription& sub);

パラメータ

説明

sub

元のSubscriptionです。

setCallbackContext()

プロトコルがPROTO_CBKの場合に通知のコールバック関数を登録します。表13-47の定義を参照してください。このコールにはコンテキスト登録も含まれます。

構文

void setCallbackContext(
void *ctx);

パラメータ

説明

ctx

設定するコンテキストを指定します。

setDatabaseServerNames()

クライアントに通知を送信するデータベース・サーバーの識別名のリストを指定します。

構文

void setDatabaseServerNames(
const vector<string>& dbsrv);

パラメータ

説明

dbsrv

データベース識別名のリストを指定します。

setNotifyCallback()

クライアントでユーザー・コールバックに渡すコンテキストを設定します。プロトコルがPROTO_CBKに設定されているか未指定の場合、サブスクリプション・ハンドルを登録する前に、この属性を設定する必要があります。

構文

void setNotifyCallback(
unsigned int (*callback)(
Subscription& sub,
NotifyResult *nr));

パラメータ

説明

callback

ユーザー・コールバック関数を指定します。

sub

Subscriptionオブジェクトを指定します。

nr

NotifyResultオブジェクトを指定します。

setNull()

SubscriptionオブジェクトをNULLに設定し、このオブジェクトに関連付けられているメモリーを解放します。

構文

void setNull();

setPayload()

Subscriptionにポストされるペイロードに対応するバッファの内容を設定します。

構文

void setPayload(
const Bytes& payload);

パラメータ

説明

payload

通知の内容を指定します。

setPresentation()

クライアントで通知の受信に使用する表示モードを設定します。

構文

void setPresentation(
Presentation pres);

パラメータ

説明

pres

表示モードは、表13-47の定義を参照してください。

setProtocol()

クライアントでイベント通知の受信に使用するProtocolを設定します。表13-47の定義を参照してください。

構文

void setProtocol(
Protocol prot);

パラメータ

説明

prot

プロトコルのモードを指定します。

setSubscriptionName()

サブスクリプションの名前を設定します。すべてのサブスクリプションはサブスクリプション名で識別され、サブスクリプション名は指定の長さのバイト・シーケンスで構成されます。

ネームスペースがNS_AQの場合、サブスクリプション名は次のようになります。

- シングル・コンシューマ・キューで登録する場合はSCHEMA.QUEUE

- マルチ・コンシューマ・キューで登録する場合はSCHEMA.QUEUE:CONSUMER_NAME

構文

void setSubscriptionName(
const string& name);

パラメータ

説明

name

サブスクリプション名を指定します。

setSubscriptionNamespace()

サブスクリプションが使用されるネームスペースを指定します。サブスクリプション名には、ネームスペースとの一貫性が必要です。デフォルト値はNS_AQです。

構文

void setSubscriptionNamespace(
Namespace nameSpace);

パラメータ

説明

nameSpace

サブスクリプションが使用されるネームスペースを指定します。表13-47の定義を参照してください。

setRecipientName()

通知受信者の名前を設定します。

構文

void setRecipientName(
const string& name);

パラメータ

説明

name

通知受信者の名前を指定します。

Timestampクラス

このクラスは、SQLの標準TIMESTAMP WITH TIME ZONE型とTIMESTAMP WITHOUT TIME ZONE型をサポートしており、すべてのデータベースのTIMESTAMP型(TIMESTAMP、TIMESTAMP WITH TIME ZONEおよびTIMESTAMP WITH LOCAL TIME ZONE)で動作します。

時、分、秒、小数秒など、Timestampの時間コンポーネントはTimestampに対して指定されたタイム・ゾーンのものです。これはリリース10gの新しい動作であり、以前のバージョンでは時間コンポーネントのGMT値がサポートされていました。時間コンポーネントは、データベースへの格納時にTimestampで指定されたタイム・ゾーンにのみ変換されました。たとえば、次のTimestamp()のコールでは、Timestamp値13-Nov 2003 17:24:30.0がタイム・ゾーン+5:30で作成されます。

Timestamp ts(env, 2003, 11, 13, 17, 24, 30, 0, 5, 30);

以前のリリースの場合、このコールの動作ではタイムスタンプ・コンポーネントがGMTとして解析され、タイム・ゾーン+5:30のタイムスタンプ値13-Nov 2003 11:54:30.0が作成されていました。コンストラクタをコールする前に、このタイムスタンプをGMTに変換する必要がありました。GMTタイム・ゾーンの場合、時と分はどちらも0 (ゼロ)です。

この動作変更は、setDate()メソッドとsetTime()メソッドにも適用されます。

表13-49は、Timestampクラスのフィールドとその有効範囲を示しています。パラメータが範囲外の場合はSQLExceptionが発生します。

表13-49 Timestampのフィールドとその有効範囲

フィールド

型

最小値

最大値

year

int

-4713

9999

month

unsigned int

1

12

day

unsigned int

1

31

hour

unsigned int

0

23

min

unsigned int

0

59

sec

unsigned int

0

61

tzhour

int

-12

14

tzmin

int

-59

59

表13-50 Timestampメソッドの概要

メソッド

概要

Timestamp()

Timestampクラスのコンストラクタです。

fromText()

文字列で指定されている値からタイムスタンプを設定します。

getDate()

Timestampオブジェクトから日付を取得します。

getTime()

TimeStampオブジェクトから時刻を取得します。

getTimeZoneOffset()

タイム・ゾーンの時および分のオフセット値を戻します。

intervalAdd()

値（タイムスタンプの値+時間隔）が設定されたTimestampオブジェクトを戻します。

intervalSub()

値（タイムスタンプの値-時間隔）が設定されたTimestampオブジェクトを戻します。

isNull()

TimestampがNULLかどうかをチェックします。

operator=()

単純割当てを行います。

operator==()

aとbが等しいかどうかをチェックします。

operator!=()

aとbが等しくないかどうかをチェックします。

operator>()

aがbを超えているかどうかをチェックします。

operator>=()

aがb以上かどうかをチェックします。

operator<()

aがb未満かどうかをチェックします。

operator<=()

aがb以下かどうかをチェックします。

setDate()

このタイムスタンプの年、月、日のコンポーネントを設定します。

setNull()

Timestampの値をNULLに設定します。

setTime()

このタイムスタンプの日、時、分、秒および小数秒の要素を設定します。

setTimeZoneOffset()

タイム・ゾーンの時および分のオフセットを設定します。

subDS()

タイムスタンプの値-valを示すIntervalDSを戻します。

subYM()

タイムスタンプの値-valを示すIntervalYMを戻します。

toText()

タイムスタンプを示すstringを、指定された書式で戻します。

Timestamp()

Timestampクラスのコンストラクタです。

構文

説明

Timestamp(
const Environment *env,
int year=1,
unsigned int month=1,
unsigned int day=1,
unsigned int hour=0,
unsigned int min=0,
unsigned int sec=0,
unsigned int fs=0,
int tzhour=0,
int tzmin=0);

デフォルトのTimestampオブジェクトを戻します。時間コンポーネントは指定したタイム・ゾーンのものと認識されます。

Timestamp();

NULLのTimestampオブジェクトを戻します。NULLのタイムスタンプは、fromText()メソッドを割り当てるか、コールすることによって初期化できます。NULLのTimestampオブジェクトに対してコールできるメソッドは、setNull()、isNull()およびoperator=()です。

Timestamp(
const Environment *env,
int year,
unsigned int month,
unsigned int day,
unsigned int hour,
unsigned int min,
unsigned int sec,
unsigned int fs,
const string &timezone);

これはマルチバイト・サポート用です。タイム・ゾーンは、リージョンUS/EasternまたはGMTからのオフセット+05:30として渡すことができます。空の文字列を渡すと、時刻は現行のセッションのタイム・ゾーンによるものとみなされます。この構文は、TIMESTAMP WITH LOCAL TIME ZONE型の値の作成に使用します。

Timestamp(
const Environment *env,
int year,
unsigned int month,
unsigned int day,
unsigned int hour,
unsigned int min,
unsigned int sec,
unsigned int fs,
const UString &timezone);

UTF16（UString）のサポート用です。タイム・ゾーンは、リージョンUS/EasternまたはGMTからのオフセット+05:30として渡すことができます。空の文字列を渡すと、時刻は現行のセッションのタイム・ゾーンによるものとみなされます。この構文は、TIMESTAMP WITH LOCAL TIME ZONE型の値の作成に使用します。

Timestamp(
const Timestamp &src);

コピー・コンストラクタです。

パラメータ

説明

year

年のコンポーネントを指定します。

month

月のコンポーネントを指定します。

day

日のコンポーネントを指定します。

hour

時のコンポーネントを指定します。

minute

分のコンポーネントを指定します。

second

秒のコンポーネントを指定します。

fs

小数秒のコンポーネントを指定します。

tzhour

タイム・ゾーンの時差のコンポーネントを指定します。

tzmin

タイム・ゾーンの分の違いのコンポーネントを指定します。

src

元のTimezoneです。

例13-11 デフォルトのTimestampコンストラクタの使用

この例では、デフォルト・コンストラクタによるNULL値の作成と、TimestampにNULL以外の値を割り当て、それに基づいて操作を実行する方法が示されています。

Environment *env = Environment::createEnvironment();

//create a null timestamp
Timestamp ts;
if(ts.isNull())
cout << "\n ts is Null";

//assign a non null value to ts
Timestamp notNullTs(env, 2000, 8, 17, 12, 0, 0, 0, 5, 30);
ts = notNullTs;

//now all operations are valid on ts
int yr;
unsigned int mth, day;
ts.getDate(yr, mth, day);

例13-12 NULLのTimestampインスタンスを初期化するためのfromText()メソッドの使用

次のコード例では、NULLのタイムスタンプを初期化するためにfromText()メソッドを使用する方法が示されています。

Environment *env = Environment::createEnvironment();

Timestamp ts1;
ts1.fromText("01:16:17.12 04/03/1825", "hh:mi:ssxff dd/mm/yyyy", "", env);

例13-13 データベースに格納されているタイムスタンプの比較

次のコード例では、結果セットからタイムスタンプ列を取得してタイムスタンプがNULLかどうかをチェックし、文字列フォーマットでタイムスタンプの値を取得して2つのタイムスタンプの差異を判断する方法が示されています。

Timestamp reft(env, 2001, 1, 1);
ResultSet *rs=stmt->executeQuery(
"select order_date from orders where customer_id=1");
rs->next();

//retrieve the timestamp column from result set
Timestamp ts=rs->getTimestamp(1);

//check timestamp for null
if(!ts.isNull())
{
string tsstr=ts.toText(           //get the timestamp value in string format
"dd/mm/yyyy hh:mi:ss [tzh:tzm]",0);
if(reft<ts                        //compare timestamps
IntervalDS ds=reft.subDS(ts);  //get difference between timestamps
}

fromText()

文字列で指定されている値からタイムスタンプを設定します。文字列は指定された書式であることが必要です。nlsParamが指定されている場合は、この指定によって、変換に使用されるNLSパラメータが決まります。nlsParamが指定されていない場合、NLSパラメータは指定された環境から選択されます。環境が指定されていない場合、グローバリゼーション・サポート・パラメータはインスタンスに関連付けられている環境から選択されます（関連付けられている場合）。

TimestampオブジェクトをstringまたはUStringが表す値に設定します。

値はfmtおよびnlsParamパラメータに基づいて解析されます。nlsParamが渡されない場合は、envpパラメータのグローバリゼーション・サポート設定が使用されます。

関連項目
TO_DATEの詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

構文

説明

void fromText(
const string &timestmpStr,
const string &fmt,
const string &nlsParam = "",
const Environment *env = NULL);

Timestampオブジェクトをstringが表す値に設定します。

void fromText(
const UString &timestmpStr,
const UString &fmt,
const UString &nlsParam,
const Environment *env = NULL);

TimestampオブジェクトをUStringが表す値に設定します。これはグローバリゼーション対応の場合です。

パラメータ

説明

timestmpStr

Timestampオブジェクトに変換するタイムスタンプのstringまたはUStringを指定します。

fmt

書式文字列を指定します。

nlsParam

NLSパラメータ文字列を指定します。nlsParamが指定されている場合は、この指定によって、変換に使用されるNLSパラメータが決まります。nlsParamが指定されていない場合は、NLSパラメータがenvpから選択されます。

env

OCCI環境を指定します。グローバリゼーション対応バージョンのメソッドでは、timestampStrの解析に使用するNLS_CALENDARの判別に使用します。envを渡されなければ、オブジェクトに関連付けられている環境により設定が制御されます。NULLのTimestampオブジェクトでコールする場合は、NULL以外の値にします。

getDate()

Timestampの年、月および日の値を戻します。

構文

void getDate(
int &year,
unsigned int &month,
unsigned int &day) const;

パラメータ

説明

year

年のコンポーネントを指定します。

month

月のコンポーネントを指定します。

day

日のコンポーネントを指定します。

getTime()

時、分、秒および小数秒のコンポーネントを戻します。

構文

void getTime(
unsigned int &hour,
unsigned int &minute,
unsigned int &second,
unsigned int &fs) const;

パラメータ

説明

hour

時のコンポーネントを指定します。

minute

分のコンポーネントを指定します。

second

秒のコンポーネントを指定します。

fs

小数秒のコンポーネントを指定します。

getTimeZoneOffset()

タイム・ゾーン・オフセットを時および分で戻します。

構文

void getTimeZoneOffset(
int &hour,
int &minute) const;

パラメータ

説明

hour

タイム・ゾーンの時を指定します。

minute

タイム・ゾーンの分を指定します。

intervalAdd()

タイムスタンプに時間隔を加算します。

構文

説明

const Timestamp intervalAdd(
const IntervalDS& val) const;

タイムスタンプにIntervalDSの時間隔を加算します。

const Timestamp intervalAdd(
const IntervalYM& val) const;

タイムスタンプにIntervalYMの時間隔を加算します。

パラメータ

説明

val

加算する時間隔を指定します。

intervalSub()

タイムスタンプから時間隔を減算し、その結果をタイムスタンプで戻します。Timestampをタイムスタンプの値- valの値で戻します

構文

説明

const Timestamp intervalSub(
const IntervalDS& val) const;

タイムスタンプからIntervalDSの時間隔を減算します。

const Timestamp intervalsUB(
const IntervalYM& val) const;

タイムスタンプからIntervalYMの時間隔を減算します。

パラメータ

説明

val

減算する時間隔を指定します。

isNull()

TimestampがNULLの場合はTRUEを、それ以外の場合はFALSEを戻します。

構文

bool isNull() const;

operator=()

指定されたTimestampオブジェクトをこのオブジェクトに割り当てます。

構文

Timestamp & operator=(
const Timestamp &src);

パラメータ

説明

src

割り当てる値を指定します。

operator==()

指定した2つのタイムスタンプを比較します。2つのタイムスタンプが等しい場合はTRUEを、それ以外の場合はFALSEを戻します。aまたはbがNULLの場合は、FALSEを戻します。

構文

bool operator==(
const Timestamp &first,
const Timestamp &second);

パラメータ

説明

first

比較対象の最初のタイムスタンプを指定します。

second

比較対象の第2のタイムスタンプを指定します。

operator!=()

指定した2つのタイムスタンプを比較します。2つのタイムスタンプが等しくない場合はTRUEを、それ以外の場合はFALSEを戻します。どちらかのタイムスタンプがNULLの場合はFALSEを戻します。

構文

bool operator!=(
const Timestamp &first,
const Timestamp &second);

パラメータ

説明

first

比較対象の最初のタイムスタンプを指定します。

second

比較対象の第2のタイムスタンプを指定します。

operator>()

firstがsecondより後の場合はTRUEを、それ以外の場合はFALSEを戻します。どちらかのタイムスタンプがNULLの場合はFALSEを戻します。

構文

bool operator>(
const Timestamp &first,
const Timestamp &second);

パラメータ

説明

first

比較対象の最初のタイムスタンプを指定します。

second

比較対象の第2のタイムスタンプを指定します。

operator>=()

指定した2つのタイムスタンプを比較します。firstタイムスタンプがsecondタイムスタンプ以降の場合はTRUEを、それ以外の場合はFALSEを戻します。どちらかのタイムスタンプがNULLの場合はFALSEを戻します。

構文

bool operator>=(
const Timestamp &first,
const Timestamp &second);

パラメータ

説明

first

比較対象の最初のタイムスタンプを指定します。

second

比較対象の第2のタイムスタンプを指定します。

operator<()

firstがsecondより前の場合はTRUEを、それ以外の場合はFALSEを戻します。aまたはbがNULLの場合は、FALSEを戻します。

構文

bool operator<(
const Timestamp &first,
const Timestamp &second);

パラメータ

説明

first

比較対象の最初のタイムスタンプを指定します。

second

比較対象の第2のタイムスタンプを指定します。

operator<=()

指定した2つのタイムスタンプを比較します。firstタイムスタンプがsecondタイムスタンプ以前の場合はTRUEを、それ以外の場合はFALSEを戻します。どちらかのタイムスタンプがNULLの場合はFALSEを戻します。

構文

bool operator<=(
const Timestamp &first,
const Timestamp &second);

パラメータ

説明

first

比較対象の最初のタイムスタンプを指定します。

second

比較対象の第2のタイムスタンプを指定します。

setDate()

このタイムスタンプの年、月、日の要素を設定します。

構文

void setDate(
int year,
unsigned int month,
unsigned int day);

パラメータ

説明

year

年のコンポーネントを指定します。有効な値は、-4713〜9999です。

month

月のコンポーネントを指定します。有効な値は、1〜12です。

day

日のコンポーネントを指定します。有効な値は、1〜31です。

setNull()

タイムスタンプをNULLに設定します。

構文

void setNull();

setTime()

このタイムスタンプの日、時、分、秒および小数秒の要素を設定します。

構文

void setTime(
unsigned int hour,
unsigned int minute,
unsigned int second,
unsigned int fs);

パラメータ

説明

hour

時のコンポーネントを指定します。有効な値は、0〜23です。

minute

分のコンポーネントを指定します。有効な値は、0〜59です。

second

秒のコンポーネントを指定します。有効な値は、0〜59です。

fs

小数秒のコンポーネントを指定します。

setTimeZoneOffset()

タイム・ゾーンの時および分のオフセットを設定します。

構文

void setTimeZoneOffset(
int hour,
int minute);

パラメータ

説明

hour

タイム・ゾーンの時を指定します。有効な値は、-12〜12です。

minute

タイム・ゾーンの分を指定します。有効な値は、-59〜59です。

subDS()

このタイムスタンプと指定されたタイムスタンプとの差を計算し、その差をIntervalDSで戻します。

構文

const IntervalDS subDS(
const Timestamp& val) const;

パラメータ

説明

val

減算するタイムスタンプを指定します。

subYM()

2つのタイムスタンプの値の差を計算し、その差をIntervalYMで戻します。

構文

const IntervalYM subYM(
const Timestamp& val) const;

パラメータ

説明

val

減算するTimestampを指定します。

toText()

タイムスタンプを表すstringまたはUStringを、指定された書式で戻します。

nlsParamが指定されている場合は、この指定によって、変換に使用されるNLSパラメータが決まります。nlsParamが指定されていない場合は、NLSパラメータがインスタンスに関連付けられている環境から選択されます（関連付けられている場合）。

関連項目
TO_DATEの詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

構文

説明

string toText(
const string &fmt,
unsigned int fsprec,
const string &nlsParam = "") const;

タイムスタンプを示すstringを、指定された書式で戻します。

UString toText(
const UString &fmt,
unsigned int fsprec,
const UString &nlsParam) const;

タイムスタンプを表すUStringを、指定された書式で戻します。グローバリゼーション対応の場合です。

パラメータ

説明

fmt

書式文字列を指定します。

fsprec

Timestampの小数秒コンポーネントの精度を指定します。

nlsParam

NLSパラメータ文字列を指定します。nlsParamが指定されている場合は、この指定によって、変換に使用されるNLSパラメータが決まります。nlsParamが指定されていない場合は、NLSパラメータがenvpから選択されます。

索引

A  B  C  D  E  F  H  I  L  M  N  O  P  Q  R  S  T  U  V  X

A

ADR, 12.7

ADRCユーティリティ, 12.7.2

ベースの位置, 12.7.1

ADRコマンド・インタープリタ, 12.7 ADRCI, 12.7, 12.7.2 Agentクラス, 13

メソッド, 13

AnyDataクラス, 13

メソッド, 13

サポートされているデータ型, 13

使用例, 13

アプリケーションによるデータ・バッファの管理, 12.3 アプリケーション対応のシリアライズ, 12.2.3.2 連想アクセス

概要, 4.6

アトミックnull, 4.9.2 属性, 1.5 自動診断リポジトリ（ADR）, 12.7 自動シリアライズ, 12.2.3.1

B

BatchSQLException

メソッド, 13

BatchSQLExceptionクラス, 13 Bfileクラス, 13

メソッド, 13

BFILE

外部データ型, 5.3.1.1

バインド操作

INバインド操作, 1.4

OUTバインド操作, 1.4

Blobクラス, 13

メソッド, 13

BLOB

外部データ型, 5.3.1.4

Bytesクラス, 13

メソッド, 13

C

コール可能文, 3.4.3

配列をパラメータとして指定, 3.4.3.1

CASE OTTパラメータ, 8.4.3.2 CHAR

外部データ型, 5.3.1.5

クラス

Agentクラス, 13

AnyDataクラス, 13

BatchSQLExceptionクラス, 13

Bfileクラス, 13

Blobクラス, 13

Bytesクラス, 13

Clobクラス, 13

Connectionクラス, 13

ConnectionPoolクラス, 13

Consumerクラス, 13

Dateクラス, 13

Environmentクラス, 13

IntervalDSクラス, 13

IntervalYMクラス, 13

Listenerクラス, 13

Mapクラス, 13

Messageクラス, 13

Metadataクラス, 13

NotifyResultクラス, 13

Numberクラス, 13

PObjectクラス, 13

Producerクラス, 13

Refクラス, 13

RefAnyクラス, 13

ResultSetクラス, 3.5.1, 13

SQLExceptionクラス, 13

StatelessConnectionPoolクラス, 13

Statementクラス, 13

Streamクラス, 13

Subscriptionクラス, 13

Timestampクラス, 13

クライアントの結果キャッシュ, 12.8

ヒント, 12.8

Clobクラス, 13

メソッド, 13

CLOB

外部データ型, 5.3.1.7

CODE OTTパラメータ, 8.4.3.3 コレクション

操作, 4.9

トランザクションのコミット, 3.7 複合オブジェクト検索

複合オブジェクト, 4.8

ネスト・レベル, 4.8

実装, 4.8.1

概要, 4.8

プリフェッチ制限, 4.8

ルート・オブジェクト, 4.8

複合オブジェクト, 4.8

プリフェッチ, 4.8.2

検索, 4.8.1

CONFIG OTTパラメータ, 8.4.3.4 構成ファイル

OTTユーティリティ, 8.4

データベースへの接続, 3.1 Connectionクラス, 13

メソッド, 13

接続プール

createConnectionPoolメソッド, 3.2.1.1

作成, 3.2.1, 3.2.1.1

接続プーリング, 3.2

透過的アプリケーション・フェイルオーバー, 12.1.3

ConnectionPoolクラス, 13

メソッド, 13

Consumerクラス, 13

メソッド, 13

制御文, 1.2.2

D

データ・バッファ, 12.3

データ変換

Date, 5.4.2

DATEデータ型, 5.4.2

内部データ型, 5.4, 5.4

間隔, 5.4.2

INTERVALデータ型, 5.4.2

LOBデータ型, 5.4.1

LOB, 5.4.1

Timestamp, 5.4.2

TIMESTAMPデータ型, 5.4.2

データ型

AnyData, 13

外部データ型, 5.1, 5.3

内部データ型, 5.2

内部データ型, 5.1

OTTマッピング, 8.6

概要, 5.1

データ型, 5 データベース

接続, 3.1

データベース常駐接続プーリング, 3.2.3

管理, 3.2.3.1

使用, 3.2.3.2

DATE

外部データ型, 5.3.1.8

データ変換, 5.4.2

Dateクラス, 13

メソッド, 13

使用例, 13

DDL文

実行, 3.3

ネスト・レベル, 4.8 DML文

実行, 3.3

E

要素, 1.1.4

埋込みオブジェクト, 4.2.1

作成, 4.2.1

フェッチ, 4.9.1

プリフェッチ, 4.9.1

Environmentクラス, 13

メソッド, 13

ERRTYPE OTTパラメータ, 8.4.3.6 例

Dateクラス, 13

IntervalDSクラス, 13

IntervalYMクラス, 13

Numberクラス, 13

例外処理, 3.9 SQL問合せの実行, 3.5 文の動的実行, 3.6 外部データ型, 5.3.1

BFILE, 5.3.1.1

BLOB, 5.3.1.4

CHAR, 5.3.1.5

CHARZ, 5.3.1.6

CLOB, 5.3.1.7

DATE, 5.3.1.8

FLOAT, 5.3.1.9

INTEGER, 5.3.1.10

INTERVAL DAY TO SECOND, 5.3.1.11

INTERVAL YEAR TO MONTH, 5.3.1.12

LONG, 5.3.1.13

LONG RAW, 5.3.1.14

LONG VARCHAR, 5.3.1.15

LONG VARRAW, 5.3.1.16

NCLOB, 5.3.1.17

NUMBER, 5.3.1.18

OCCI BFILE, 5.3.1.19

OCCI BLOB, 5.3.1.20

OCCI BYTES, 5.3.1.21

OCCI CLOB, 5.3.1.22

OCCI DATE, 5.3.1.23

OCCI INTERVALDS, 5.3.1.24

OCCI INTERVALYM, 5.3.1.25

OCCI NUMBER, 5.3.1.26

OCCI POBJECT, 5.3.1.27

OCCI REF, 5.3.1.28

OCCI REFANY, 5.3.1.29

OCCI STRING, 5.3.1.29

OCCI TIMESTAMP, 5.3.1.31

OCCI VECTOR, 5.3.1.32

RAW, 5.3.1.33

REF, 5.3.1.34

ROWID, 5.3.1.35

STRING, 5.3.1.36

TIMESTAMP, 5.3.1.37

TIMESTAMP WITH LOCAL TIME ZONE, 5.3.1.38

TIMESTAMP WITH TIME ZONE, 5.3.1.39

UNSIGNED INT, 5.3.1.40

VARCHAR, 5.3.1.41

VARCHAR2, 5.3.1.41

VARNUM, 5.3.1.43

VARRAW, 5.3.1.44

F

障害診断

無効化, 12.7.3

障害診断, 12.7 フィールド

IntervalDSクラス, 13

IntervalYMクラス, 13

Timestampフィールド, 13

FLOAT

外部データ型, 5.3.1.9

H

HFILE OTTパラメータ, 8.4.3.7

I

索引構成表, 5.2.2

Instant Client, 2.4

利点, 2.4.1

接続名, 2.4.6

データベース接続, 2.4.6

環境変数, 2.4.7

Solaris, 2.4.7

Windows, 2.4.7

インストール, 2.4.2 ライブラリ, 2.4.4

データ共有ライブラリ, 2.4.5

パッチ, 2.4.4

再生成, 2.4.5

パッチのライブラリ, 2.4.4 SDK, 2.4.2.1.1 使用, 2.4.3 Instant Client Light (English), 2.5

キャラクタ・セット, 2.5.1

エラー, 2.5.1

グローバリゼーション設定, 2.5.1

インストール, 2.5.3

Client Admin Install, 2.5.3.2

Oracle Universal Installer, 2.5.3.3

OTNダウンロード, 2.5.3.1

使用, 2.5.2 INTEGER

外部データ型, 5.3.1.10

内部データ型, 5.2

CHAR, 5.2.1

LONG, 5.2.1

LONG RAW, 5.2.1

RAW, 5.2.1

VARCHAR2, 5.2.1

INTERVAL DAY TO SECOND

外部データ型, 5.3.1.11

INTERVAL YEAR TO MONTH

外部データ型, 5.3.1.12

IntervalDSクラス, 13

フィールド, 13

メソッド, 13

使用例, 13

IntervalYMクラス, 13

フィールド, 13

メソッド, 13

使用例, 13

INTYPEファイル

構造, 8.5.2

INTYPE OTTパラメータ, 8.4.3.8

L

Listenerクラス, 13

メソッド, 13

LOB

外部データ型

データ変換, 5.4.1

LONG

外部データ型, 5.3.1.13

LONG RAW

外部データ型, 5.3.1.14

LONG VARCHAR

外部データ型, 5.3.1.15

M

オブジェクト属性の操作, 4.7.3

Mapクラス, 13

メソッド, 13, 13

Messageクラス, 13

メソッド, 13

メタデータ

引数属性および結果属性, 6.3.12

属性のグループ化, 6.2

引数属性および結果属性, 6.2

コレクション属性, 6.2

列属性, 6.2

データベース属性, 6.2

リスト属性, 6.2

パッケージ属性, 6.2

パラメータ属性, 6.2, 6.2

プロシージャ、ファンクションおよびサブプログラムの属性, 6.2

スキーマ属性, 6.2

順序属性, 6.2

シノニム属性, 6.2

表およびビューの属性, 6.2

型属性の属性, 6.2

型属性, 6.2

型メソッド属性, 6.2

属性, 6.3 コード例, 6.2.1 コレクション属性, 6.3.8 列属性, 6.3.11 データベース属性, 6.3.15 データベース・オブジェクトの記述, 6.2 リスト属性, 6.3.13 概要, 6.1 パッケージ属性, 6.3.4 パラメータ属性, 6.3.1 プロシージャ、ファンクションおよびサブプログラムの属性, 6.3.3 スキーマ属性, 6.3.14 順序属性, 6.3.10 シノニム属性, 6.3.9 表およびビューの属性, 6.3.2 型属性の属性, 6.3.6 型属性, 6.3.5 型メソッド属性, 6.3.7 MetaDataクラス, 13

メソッド, 13

メソッド, 1.5

Agentメソッド, 13

AnyDataメソッド, 13

BatchSQLExceptionメソッド, 13

Bfileメソッド, 13

Blobメソッド, 13

Bytesメソッド, 13

Clobメソッド, 13

Connectionメソッド, 13

ConnectionPoolメソッド, 13

Consumerメソッド, 13

createConnectionメソッド, 3.1.2, 3.1.2

createConnectionPoolメソッド, 3.2.1.1

createEnvironmentメソッド, 3.1.1

createProxyConnectionメソッド, 3.2.1.2, 3.2.1.2

createStatementメソッド, 3.3.1

Dateメソッド, 13

Environmentクラス, 13

executeメソッド, 3.3.2

executeArrayUpdateメソッド, 3.3.2, 12.3.2

executeQueryメソッド, 3.3.2

IntervalDSメソッド, 13

IntervalYMクラス, 13

Listenerメソッド, 13

Mapメソッド, 13, 13

Messageメソッド, 13

MetaDataクラス, 13

NotifyResultメソッド, 13

Numberクラス, 13

PObjectメソッド, 13

Producerメソッド, 13

Refメソッド, 13

RefAnyメソッド, 13

ResultSetメソッド, 13

setDataBufferメソッド, 12.3.1

SQLExceptionメソッド, 13

StatelessConnectionPool, 13

Statement, 13

Streamメソッド, 13

Subscriptionメソッド, 13

terminateConnectionメソッド, 3.1.2, 3.1.2

terminateEnvironmentメソッド, 3.1.2

terminateStatementメソッド, 3.3.4

Timestampメソッド, 13

行変更の反復, 12.5

N

ナビゲーショナル・アクセス

概要, 4.7

NCLOB

外部データ型, 5.3.1.17

NEEDS_STREAM_DATAステータス, 3.6.1, 3.6.1.5 非手続き型要素, 1.1.4 参照不可能オブジェクト, 4.2.1 NotifyResultクラス, 13

メソッド, 13

NULL, 4.9.2 NUMBER

外部データ型, 5.3.1.18

Numberクラス, 13

メソッド, 13

使用例, 13

O

オブジェクト・キャッシュ, 4.4.2.1, 4.4.2.3

フラッシュ, 4.4.2.4

オブジェクト・モード, 4.4.2.1 オブジェクト・プログラミング

概要, 4.1

OCCIの使用, 4

オブジェクト参照

使用, 4.10

「REF」を参照

オブジェクト型トランスレータ・ユーティリティ

「OTTユーティリティ」を参照

オブジェクト型, 1.5 オブジェクト

SQLによるアクセス, 4.6.1

属性, 1.5

クライアント側, 1.5.1

使用済, 4.7.5

環境, 1.5.2

フラッシュ, 4.7.4

解放, 4.10

OCCI, 4.2

挿入, 4.6.2

インタフェース, 1.5.3

連想, 1.5.3

ナビゲーショナル, 1.5.3

属性の操作, 4.7.3 マーク, 4.7.4 メタデータ・クラス, 1.5.5 メソッド, 1.5 変更, 4.6.2 オブジェクト・キャッシュ, 1.5.1 オブジェクト型, 1.5 確保, 4.7.2 確保, 4.4.2.2, 4.7.2, 4.7.2 データベースへの変更の記録, 4.7.6 ランタイム環境, 1.5.2 透過的アプリケーション・フェイルオーバー, 12.1.2 OCCI

利点, 1.1.1

アプリケーションの構築, 1.1.2

機能, 1.1.3

オブジェクト・モード, 4.4.2.1

概要, 1.1

SQLの特殊用語, 1.4

OCCIクラス

Agentクラス, 13

AnyDataクラス, 13

BatchSQLExceptionクラス, 13

Bfileクラス, 13

Blobクラス, 13

Bytesクラス, 13

Clobクラス, 13

Connectionクラス, 13

ConnectionPoolクラス, 13

Consumerクラス, 13

Dataクラス, 13

Environmentクラス, 13

IntervalDSクラス, 13

IntervalYMクラス, 13

Listenerクラス, 13

Mapクラス, 13

Messageクラス, 13

MetaDataクラス, 13

NotifyResultクラス, 13

Numberクラス, 13

PObjectクラス, 13

Producerクラス, 13

Refクラス, 13

RefAnyクラス, 13

ResultSetクラス, 13

SQLExceptionクラス, 13

StatelessConnectionPoolクラス, 13

Statementクラス, 13

Streamクラス, 13

Subscriptionクラス, 13

Timestampクラス, 13

OCCI環境

接続プール, 3.2.1

作成, 3.1.1, 3.1.1

接続のオープン, 3.1.1, 3.1.2

有効範囲, 3.1.1, 3.1.1

終了, 3.1, 3.1.1

OCCIプログラム

サンプル, 4.13

OCCIプログラムの開発, 4.4

操作のフロー, 4.4.2

プログラム構造, 4.4.1

OCCI型

データ変換, 5.1.1

パフォーマンスの最適化, 3.5.3

プリフェッチ・カウントの設定, 3.5.3

OTTパラメータTRANSITIVE, 8.4.3.13 OTTパラメータ

CASE, 8.4.3.2

CODE, 8.4.3.3

CONFIG, 8.4.3.4

ERRTYPE, 8.4.3.6

HFILE, 8.4.3.7

INTYPE, 8.4.3.8

OUTTYPE, 8.4.3.11

SCHEMA_NAMES, 8.4.3.12

USERID, 8.4.3.15, 8.4.3.16

表示される場所, 8.4.4

OTTユーティリティ

利点, 1.5.6

データベースでの型の作成, 8.3

デフォルトの名前のマッピング, 8.6.1

説明, 1.5.6

パラメータ, 8.4.3

使用, 8.2

OUTバインド変数, 1.3 OUTTYPE OTTパラメータ, 8.4.3.11

P

パラメータ化された文, 3.4.2

パフォーマンス

最適化

executeArrayUpdateメソッド, 12.3.2

setDataBufferメソッド, 12.3.1

パフォーマンスのチューニング, 12

アプリケーションによるデータ・バッファの管理, 12.3

next()メソッドを使用した配列フェッチ, 12.4

接続の共有, 12.2

データ・バッファ, 12.3

複数のLOBの読込みと書込み, 7.4.5

共有サーバー環境, 12.2.1

スレッド・セーフティ, 12.2.1

スレッド・セーフティ, 12.2.1 透過的アプリケーション・フェイルオーバー, 12.1 永続オブジェクト, 4.2, 4.2.1

作成, 4.3.1

スタンドアロン・オブジェクト, 4.2.1

型

埋込みオブジェクト, 4.2.1

参照不可能オブジェクト, 4.2.1

参照可能オブジェクト, 4.2.1

スタンドアロン・オブジェクト, 4.2.1

オブジェクトの確保, 4.4.2.2, 4.7.2 PL/SQL

OUTバインド変数, 1.3

概要, 1.3

PObjectクラス, 13

メソッド, 13

プリフェッチ・カウント

設定, 3.5.3

プリフェッチ制限, 4.8 PREPAREDステータス, 3.6.1, 3.6.1.2 手続き型要素, 1.1.4 Producerクラス, 13

メソッド, 13

プロキシ接続, 3.2.1.2

createProxyConnectionメソッドの使用, 3.2.1.2

Q

問合せ, 1.2.4

指定方法, 3.5.2

R

RAW

外部データ型, 5.3.1.33, 5.3.1.33

REF

外部データ型, 5.3.1.34

オブジェクトへの参照の取出し

Refクラス, 13

メソッド, 13

RefAnyクラス, 13

メソッド, 13

参照可能オブジェクト, 4.2.1 リレーショナル・プログラミング

OCCIの使用, 3

RESULT_SET_AVAILABLEステータス, 3.6.1, 3.6.1.3 ResultSetクラス, 3.5.1, 13

メソッド, 13

ルート・オブジェクト, 4.8 ROWID

外部データ型, 5.3.1.35

行

反復的な変更, 12.5

変更, 12.5

S

SCHEMA_NAMES OTTパラメータ, 8.4.3.12

共有された接続

使用, 12.2

共有サーバー環境

アプリケーション対応のシリアライズ, 12.2.3.2

自動シリアライズ, 12.2.3.1

同時実行性, 12.2.3.2

スレッド・セーフティ, 12.2.1

実装, 12.2.2

SQL文

制御文, 1.2.2

DML文, 1.2.3

処理, 1.2

問合せ, 1.2.4

型

コール可能文, 3.4, 3.4.3

パラメータ化された文, 3.4, 3.4.2

標準的な文, 3.4, 3.4.1

SQLExceptionクラス, 13

メソッド, 13

sqlnet.ora, 12.7.3 スタンドアロン・オブジェクト, 4.2.1

作成, 4.2.1

標準的な文, 3.4.1 StatelessConnectionPoolクラス, 13

メソッド, 13

文キャッシュ, 3.8 Statementクラス, 13

メソッド, 13

文ハンドル

作成, 3.3.1, 3.3.1, 3.3.2

再利用, 3.3.3

終了, 3.3.4

ステータス

NEEDS_STREAM_DATA, 3.6.1, 3.6.1.5

PREPARED, 3.6.1, 3.6.1.2

RESULT_SET_AVAILABLE, 3.6.1, 3.6.1.3

STREAM_DATA_AVAILABLE, 3.6.1, 3.6.1.6

UNPREPARED, 3.6.1, 3.6.1.1

UPDATE_COUNT_AVAILABLE, 3.6.1, 3.6.1.4

Streamクラス, 13

メソッド, 13

STREAM_DATA_AVAILABLEステータス, 3.6.1, 3.6.1.6 ストリーム読込み, 3.4.4 ストリーム書込み, 3.4.4 STRING

外部データ型, 5.3.1.36

Subscriptionクラス, 13

メソッド, 13

代用性, 4.12.1

T

表

索引構成, 5.2.2

スレッド・セーフティ, 12.2.1

実装, 12.2.2

TIMESTAMP

外部データ型, 5.3.1.37

Timestampクラス

メソッド, 13

TIMESTAMP WITH LOCAL TIME ZONE

外部データ型, 5.3.1.38

TIMESTAMP WITH TIME ZONE

外部データ型, 5.3.1.39

一時オブジェクト, 4.2, 4.2.2

作成, 4.2.2, 4.3.1

TRANSITIVE OTTパラメータ, 8.4.3.13 透過的アプリケーション・フェイルオーバー, 12.1

接続プーリング, 12.1.3

オブジェクト, 12.1.2

使用, 12.1.1

型の継承, 4.12, 4.12.3, 4.12.4

U

UNPREPAREDステータス, 3.6.1, 3.6.1.1

UNSIGNED INT

外部データ型, 5.3.1.40

UPDATE_COUNT_AVAILABLEステータス, 3.6.1, 3.6.1.4 USERID OTTパラメータ, 8.4.3.15, 8.4.3.16

V

値

このマニュアル, 4.2.3

オブジェクト・アプリケーション, 4.2.3

VARCHAR

外部データ型, 5.3.1.41

VARCHAR2

外部データ型, 5.3.1.41

VARNUM

外部データ型, 5.3.1.43

VARRAW

外部データ型, 5.3.1.16, 5.3.1.44

X

XAライブラリ, 11

Copyright © 1999, 2013, Oracle and/or its affiliates. All rights reserved.