ヘッダーをスキップ

Oracle® Databaseプラットフォーム共通日本語README
10g リリース1(10.1)

 
Go To Table Of Contents
目次

Previous Next

Pro*C/C++ README

原典情報: $ORACLE_HOME/precomp/doc/proc/readme.doc

目次

1 互換性と移行の問題点

2 新機能

3 Pro*C/C++リリース10.1.0.2.0の既知の不具合

4 このリリースで修正された不具合

5 Pro*C/C++ 10.1.0.2.0の制限事項

6 Pro*C/C++ 8.1.6の制限事項

7 『Pro*C/C++ Precompiler プログラマーズ・ガイド』の補足事項

8 その他の問題

1 互換性と移行の問題点

1.1 V6互換動作のサポートの中止

Oracle7には、Oracle7アプリケーションを開発するアプリケーション開発者がOracle6の動作をエミュレートできるように、バージョン6[V6]互換性フラグが用意されていました。Oracleリリース8.0.3からは、すべてのOracle8製品(PL/SQL8、すべてのOracleプリコンパイラ、Oracle8 Oracle Call Interface、SQL*ModuleおよびSQL*Plusなど)でバージョン6互換性フラグのサポートが即時に中止されることを示す警告が表示されます。V6互換性フラグのサポート中止は、あるバージョン・リリースから別のバージョン・リリースへのアップグレード間で下位互換性と動作をサポートするというオラクル社の方針と一貫しています。つまり、Oracle6からOracle7へのアップグレードについてはサポートされますが、複数のバージョン・リリースのアップグレードについてはサポートされません。

特に、V6互換性フラグでは、Oracle7でOracle6の動作の次の側面がエミュレートされていました。

Oracle8では、V6互換性フラグのサポート中止に伴い、これらの動作のサポートがすべて中止となります。

1.2 Oracle 8.1 OCIを使用するためのSQLLIBの移行

リリース8.1からは、SQLLIBではデータベースとの通信にV8OCIが使用されます。この変更に伴い、次の互換性の問題が発生します。

o すべてのホスト変数は、PL/SQLブロックの実行前に初期化する必要があります。これは、PL/SQLからみた変数の基盤となるモード(IN、IN/OUT、OUT)に関係なく該当します。この要件は、埋込みPL/SQLの実行時パフォーマンスを改善することを意図したものでした。

o OCIの相互運用性関数sqlcda()およびsqlcur()(SQLCDAFromResultSetCursorおよびSQLCDAToResultSetCursor)を使用するアプリケーションでは、埋込みSQLを介して接続を確立した直後にsqllda()またはsqlld2()(SQLLDAGetCurrentまたはSQLLDAGetNamed)をコールする必要があります。次に例を示します。

    sql_cursor curvar;
    Lda_Def lda;
    Cda_Def cda;
  
    EXEC SQL CONNECT :uid IDENTIFIED BY :pwd;
    /* This function must be executed immediately after connecting */
    
    SQLLDAGetCurrent(&lda);
    /* Continue with logic to allocate, open a fetch using curvar */
  
    EXEC SQL ALLOCATE :curvar;
    EXEC SQL EXECUTE
    BEGIN
    open :curvar for select ename from emp order by empno;
    END;
    END-EXEC;
    
    EXEC SQL FETCH :curvar INTO :name;
    sqlcda(&cda, (dvoid *)&curvar, &code);
    ofetch(&cda);

これにより、接続がバージョン7モードになるため、プリコンパイラのカーソル変数とバージョン7のCda_Defの間の変換が可能になります。接続がバージョン7モードの場合は、ユニバーサルROWID(OCIRowid *)を使用できないことに注意してください。

暗黙的にバージョン7モードの処理を示すsqlldaのコールは、暗黙的にバージョン8の処理を示すSQLSvcCtxGetや他のコールと混在できないことに注意してください。sqlldaのサポートは、下位互換性のためにのみ提供されます。

o ROWID
ROWID列に対するDESCRIBE (EXEC SQL DESCRIBE SELECT LIST . . .)は、SQLT_RID型ではなくSQLT_RDD型を戻します。

通常、プログラマはすべての新規開発にユニバーサルROWID(OCIRowid *型)を使用する必要があります。これにより、アプリケーション・コードを変更せずに、基礎となる表をヒープ表から索引構成表に移行できます。

o NULLのフェッチ時に標識変数が存在する場合、対応するホスト変数の内容は変更されません。標識変数の値をチェックして、NULL/NOT NULLステータスを判断する必要があります。

o 対応する標識変数のないホスト変数にNULLが選択またはフェッチされる場合、問合せ処理は停止しません。以降の各行も引き続きユーザー・ホスト変数に取り出され、処理済行数には選択またはフェッチされた行の総数が反映されます。どの行にNULL値が含まれているかの判別には使用できません。

1.3 32ビット実装と64ビット実装の間の互換性

32ビット実装と64ビット実装の両方をサポートするプラットフォームでは、64ビット・バイナリとリンクする前に、EXEC SQL INCLUDE文を介してsqlcaをインクルードするアプリケーションを再度プリコンパイルする必要があります。#includeプリプロセッサ文を介してsqlca.hをインクルードするアプリケーションの場合は、64ビット・バイナリと再リンクする前に再コンパイルして、64ビットのsqlca.hをインクルードする必要があります。

将来は、実装間で生成コードの互換性をサポートするために、32ビット・バイナリと64ビット・バイナリの両方をサポートするポートでは、1バージョン、つまり64ビット・バージョンのsqlca.hのみが提供される可能性があります。

2 新機能

2.1 リリース8.0.3と8.0.5の間に導入された新規の非オブジェクト機能

a. パスワードの期限切れ

このリリースのPro*C/C++では、埋込みSQL CONNECT文への構文拡張を介して、アプリケーションで実行時にユーザーのパスワードを変更できます。

b. 構造体の配列

構造体の配列と構造体の配列へのポインタが、埋込みSQLのホスト変数および標識変数としてサポートされるようになりました。

c. ラージ・オブジェクト(LOB)とBFILEのサポート

ホスト変数を特定のLOBロケータ型として宣言することで、BLOB、CLOB、NCLOBおよびBFILEを操作できます。これらのホスト変数を埋込みSQLで使用し、サーバー上でLOBを参照できます。

d. NCHARデータのサポート

NCHARデータがカーネルにより完全にサポートされるようになりました。以前のリリースのプリコンパイラでは、このデータ型はNLS_LOCALオプションを使用してサポートされていました。新規アプリケーションの場合は、データベース・サポートに依存し、それに従ってプリコンパイル時にNLS_LOCAL=NOに設定することをお薦めします。

e. ユーザー・コール可能なSQLLIB関数

既存のユーザー・コール可能なSQLLIB関数には、より説明的な長い名前が使用されていました。互換性を維持するため、従来の名前も引き続き使用できます。すべての新規アプリケーションには、新規の名前を使用することをお薦めします。

f. ユーザー設定可能なランタイム・コンテキスト・オプション

ランタイム・コンテキストにオプションがあり、作成して割り当てるとデフォルト値に設定されます。特定のランタイム・コンテキスト値を設定するための汎用メカニズムが導入されています。ただし、現在サポートされているオプションは少数です。

g. SYSDBAおよびSYSOPER接続モードのサポート

以前のリリースのOracleでは、次のように指定してSYSDBA権限で接続できました。

     EXEC SQL CONNECT :<uid> IDENTIFIED BY :<pwd> ;

この場合<uid>はSYSを含むホスト変数、<pwd>はCHANGE_ON_INSTALLを含むホスト変数です。デフォルトでは、前述の構文ではSYSDBA権限を使用できなくなったため、Pro*C/C++では埋込みCONNECT文のオプションのIN MODE句がサポートされるようになり、この句にSYSDBAまたはSYSOPERモードを指定できます。

h. 新規のWHENEVERアクションDO CONTINUE

DO CONTINUEアクションの動作は、DO BREAKに似ています。後者の場合は、明示的なBREAK文が発行されます。DO CONTINUEアクションの場合は、CONTINUE文が生成されます。これは、単にプログラムが続行されるCONTINUEアクションとは異なります。

2.2 リリース8.1.5の新規の非オブジェクト機能

a. 埋込みSQL LOBインタフェース

簡単で使いやすい埋込みSQL LOBインタフェースが用意されており、アプリケーション開発者にとってはLOBのサポートが拡張されます。これは、Oracle OCI APIやPL/SQL DBMS_LOBパッケージの場合と同じ機能のサポートがLOBに関して提供されることを意味します。

b. ANSIの動的SQLインタフェース

Pro*C/C++には、ANSI規格から導出された動的SQLの新規実装が用意されています。ANSIの動的SQLインタフェースは、Oracleの動的SQLメソッド4のインタフェースよりも強化されています。また、このインタフェースでは、オブジェクト、構造体の配列、カーソル変数およびLOBなど、すべてのOracleのタイプがサポートされます。

c. DML RETURN句

Pro*C/C++では、INSERT、UPDATEおよびDELETEの各埋込みSQL DML文でDML RETURN句の使用がサポートされるようになりました。

d. ユニバーサルROWIDのサポート

このリリースのPro*C/C++には、物理ROWID(ヒープ表に関連付けられたROWID)と論理ROWID(索引構成表に関連付けられたROWID)の両方と互換性のあるROWID記述子をALLOCATEおよびFREEにするメカニズムが用意されています。ROWID記述子はOCIRowid *として宣言します。この種の記述子は、埋込みSQL文でホスト変数として使用できます。すべての新規開発では、ROWID記述子を使用することをお薦めします。

e. ランタイム・コンテキストのサポート拡張

埋込みCONTEXT USE文の拡張により、開発者は特定のランタイム・コンテキストを指定するか、かわりにデフォルトのグローバルなSQLLIBランタイム・コンテキストに設定できるようになりました。

f. 外部プロシージャのサポート

Pro*C/C++で記述された外部プロシージャをPL/SQLからコールできるようになりました。REGISTER CONNECT埋込みSQL文が導入されています。この新しい文を外部プロシージャでCONNECT文のかわりに使用し、グローバルなSQLLIBランタイム・コンテキストに対して現行の名前のない接続を定義します。

g. プリフェッチのサポート

Oracleでは、問合せの実行時に行数のプリフェッチ指定がサポートされます。これにより、以降に行がフェッチされるときにサーバーのラウンドトリップが不要になり、パフォーマンスが向上します。Pro*C/C++でプリフェッチを使用可能にするには、新規のコマンドライン・オプションPREFETCH = 0 .. 65535を使用します。PREFETCH値は、問合せの実行時にプリフェッチされる行数を示します(0はプリフェッチが使用禁止であることを意味します)。このオプションは、構成ファイル、コマンドラインまたはインラインで使用できます。

h. Javaストアド・プロシージャのコール

Pro*C/C++リリース8.1.4には、新規の埋込みSQL CALL文が導入されています。この文を使用すると、アプリケーション開発者は埋込みPL/SQL無名ブロックを使用せずにJava(およびPL/SQL)ストアド・プロシージャを直接コールできます。

i. プリコンパイル済ヘッダー機能

リリース8.1.5以上のPro*C/C++では、ヘッダー・ファイルをプリコンパイルし、そのプリコンパイル内容を特殊なバイナリ・ファイルに格納できます。このファイルは、通常のPro*C/C++プログラムまたは他のヘッダー・ファイルのプリコンパイル時に#includeディレクティブを介してインクルードするときに、実際にヘッダー・ファイルをプリコンパイルするかわりにインスタンス化できます。新規のプリコンパイル済ヘッダー・メカニズムを使用可能にし、バイナリ・ファイルの生成時と検索時に使用するファイル拡張子を指定できるように、新規コマンドライン・オプション(header)が用意されています。

2.3 リリース8.1.6の新規の非オブジェクト機能

a. 完全に統合されたデバッグ機能

リリース8.1.6以上では、LINES={YES|NO}オプションの動作が変更されています。現在は、LINES=YESを指定すると、出力プログラムでは生成コードの各行の後に#lineプリプロセッサ・ディレクティブが生成されます。これにより、GDBやMicrosoft Visual Studio for C++のようなIDEなどのデバッガを使用する開発者は、生成されたコードをステップ実行するかわりに、Pro*C/C++のソース・プログラムを表示してアプリケーション・プログラムをデバッグできます。

2.4 リリース9.0.1の新規の非オブジェクト機能

a. Unicodeのサポート

Pro*C/C++ 8iには、UCS2/UTF16エンコーディングを使用するアプリケーション向けにUnicode変数(UTF16)が導入されています。ただし、変数をバインドできるのはデータベースのCHAR型のみで、バインド/定義バッファは暗黙的にサーバー側データベース・キャラクタ・セットに変換されます。

Oracle9iのデータベースの「信頼性の高いUnicodeデータ型サポート」を使用すると、Pro*C/C++のUTF16データをCHAR列とNCHAR列の両方にバインドできます。

Pro*C/C++ 9iでは、ターゲット列がNCHARの場合のデータ消失の可能性を回避するために、NCHARがUnicode(UTF16)データのデフォルトのキャラクタ・セット・フォームとして使用されます。CHARと併用すると、わずかながらパフォーマンスに影響すると予想されます。

Pro*C/C++ 9iには、パフォーマンスと下位互換性のためにUnicode(UTF16)変数と併用できるように、新規のプリコンパイラ・オプションUTF16_CHARSETが導入されます。

UTF16_CHARSET

目的

Unicode(UTF16)変数で使用するキャラクタ・セット・フォームを指定します。

構文

UTF16_CHARSET={NCHAR_CHARSET|DB_CHARSET}

デフォルト

NCHAR_CHARSET

使用方法

コマンドラインと構成ファイル内でのみ使用できます。インラインでは使用できません。

UTF16_CHARSET=NCHAR_CHARSET(デフォルト)を指定すると、Unicode(UTF16)のバインド/定義バッファはサーバー側の各国対応キャラクタ・セットに従って変換されます。ターゲット列がCHARの場合は、パフォーマンスに影響する可能性があります。

UTF16_CHARSET=DB_CHARSETを指定すると、Unicode(UTF16)のバインド/定義バッファはサーバー側のデータベース・キャラクタ・セットに従って変換されます。ターゲット列がNCHARの場合は、データ消失の可能性があることに注意する必要があります。

9i以上では、NLS_NCHAR環境変数を指定しないと、NCHARデータには定義済のキャラクタ・セットまたはNLS_LANGにより間接的に定義されているキャラクタ・セットが使用されます。詳細は、『Oracle Application Server 10g グローバリゼーション・ガイド』を参照してください。

b. 日時

リリース9.0.1では、Pro*Cの日時サポートがすべての日時機能に拡張されます。

c. バージョン8のOCIのXAサポート

リリース9.0.1では、XAとOracle 8のOCIとの相互運用性が標準となります。
XAを介して接続し、その接続をSQLLIBで再登録し、それと同じ接続をSQLEnvGetおよびSQLSvcCtxGetを介して取得できる必要があります。さらに重要なのは、XAユーザーから分離されていたリリース8iの機能がXAで完全にサポートされるようになったことです。これには、すべてのオブジェクト/ナビゲーションのサポート、LOB、DMLの戻りなどが含まれます。

sqlldaとhstdefsに対するサポートは、このリリースで廃止になります。

2.5 リリース9.2.0の新規の非オブジェクト機能

a. Pro*C/C++でのスクロール可能カーソルのサポート

リリース9.2.0のPro*C/C++では、スクロール可能カーソルを使用してデータをランダムにフェッチできます。

b. Pro*C/C++での接続プーリングのサポート

リリース9.2.0のPro*C/C++では、接続プール・オプションを使用してPro*C/C++アプリケーションのパフォーマンスを最適化できます。デフォルトでは、接続プール・オプションは使用禁止になっています。

c. Pro*C/C++デモを作成するための新規Makeファイル

リリース9.2.0のPro*C/C++をインストールすると、demo_proc.mk Makeファイルとともに2つ以上のMakeファイル、viz.、demo_proc32.mkおよびdemo_proc64.mkが作成されます。この新規Makeファイルは、追加の32/64ビット・サポートが必要な場合に使用します。

たとえば、プラットフォームxがデフォルトで64ビットであるのみでなく、32ビットのリンクもサポートされる場合、demo_proc.mkでは64ビットの実行可能ファイルが作成され、demo_proc32.mkを使用して32ビットの実行可能ファイルが作成されます。この例では、demo_proc64.mkとdemo_proc.mkの機能は同じです。

2.6 リリース10.1.0.2.0の新規の非オブジェクト機能

a. システム固有のfloat/doubleのサポート

リリース10.1.0.2.0のPro*C/C++では、新規データ型であるシステム固有のfloat型とdouble型がサポートされます。この2つのデータ型は、単精度と倍精度の浮動小数点値を表します。どちらもシステム固有の方法、つまり、ホスト・システムの浮動小数点書式で表されます。

次の表に、リリース9.2.0の『Pro*C/C++ Precompiler プログラマーズ・ガイド』の表15-1の補足事項を示します。

内部Oracle
データ型
コード
BINARY_FLOAT
100
BINARY_DOUBLE
101

次の表に、リリース9.2.0の『Pro*C/C++ Precompiler プログラマーズ・ガイド』の表15-2の補足事項を示します。

外部データ型 コード Cデータ型
SQLT_BFLOAT
21
float
SQLT_BDOUBLE
22
double

2.7 Pro*C/C++リリース8.0.3〜8.0.5の新規のオブジェクト機能

a. オブジェクト型のサポート

Pro*C/C++では、埋込みSQLおよびPL/SQL文を介してオブジェクト型のホスト変数の操作がサポートされます。OTT(Object Type Translator)を実行して、Oracle8データベースに定義されている特定の型のC構造体のtypedefを生成し、Pro*C/C++アプリケーション・プログラム内でこれらの型(または型へのポインタ)の変数を宣言して、Oracle8データベース内のオブジェクト・インスタンスに対応付ける必要があります。

b. OTTにより生成される型ファイルの使用

コマンドラインで追加のPro*C/C++入力ファイルであるINTYPEファイルを指定し、オブジェクト型に関して必要な情報をプリコンパイラに提供します。このファイルは、Oracle8データベースのオブジェクト型をC構造体のtypedefに変換するときに、OTTにより生成されます。

c. ナビゲーション操作のサポート

オブジェクトの作成、オブジェクト参照の操作、オブジェクト属性の設定および取得の各操作を提供するのみでなく、オブジェクト・キャッシュ内のオブジェクトの確保と確保解除を制御するナビゲーショナル・アクセス用インタフェースが提供されています。

注意: REFは、それが戻されるすべてのインスタンス内で割り当てる必要があります。特に、RETURNING REFを使用するEXEC SQL OBJECT CREATEのコールでは、RETURNING REF INTOに続くホスト変数に(EXEC SQL ALLOCATE :hvを介して)割当済のREFを含める必要があります。

2.8 Pro*C/C++リリース8.1.5の新規のオブジェクト機能

a. リリース8.0.3では、オブジェクト型のLOB属性およびCollection属性の取得および設定機能を組み込むためにナビゲーショナル・アクセス用インタフェースが導入されましたが、リリース8.1.5ではこのインタフェースが拡張されています。EXEC SQL OBJECT DEREF文のオプションのFOR UPDATE句も、オプションのNOWAITを使用して拡張されています。

b. コレクションのサポートの拡張
コレクションの個々の要素にアクセスし、変更および更新できるように、新しい埋込みSQLインタフェースが用意されています。このインタフェースは、OCI APIで現在提供されている便利で使いやすい埋込みSQLスタイルと同様の機能サポートを、コレクションに対して提供することを意図しています。

2.9 Pro*C/C++リリース9iの新規のオブジェクト機能

a. 継承

Oracle9iのオブジェクト型サポートの一部として、プリコンパイラのオブジェクト・サポートに継承のサポートが組み込まれました。

Pro*C/C++リリース9iでは、次のSQL演算子を使用してオブジェクト型の継承がサポートされます。

   * IS OF type
   * TREAT

b. マルチレベル・コレクション

リリース9iのコレクション・オブジェクト型サポートが拡張され、複数レベルでネストした表およびVARRAYを含むコレクションが許可されるようになりました。

2.10 Pro*C/C++リリース8.1.6プログラムとOracle8 OCI APIの相互運用

a. 新規のOCI相互運用性機能

リリース8.1.6のPro*C/C++プログラムとリリース8.1のOCIとの相互運用をサポートするために、新規のライブラリ・ルーチンSQLEnvGet()およびSQLSvcCtxGet()が導入されています。前述のルーチンを使用すると、Pro*C/C++で確立されたデータベース接続について、リリース8.1のOCI環境ハンドルとリリース8.1のOCIのサービス・コンテキスト・ハンドルを取得できます。

リリース8.0.3〜8.1.6の間でPro*C/C++に導入されたほとんどの新機能のデモ・プログラムは、関連SQLスクリプトとともにPro*C/C++のdemoディレクトリにあります。次に例を示します。

前述のプログラムのコードは$ORACLE_HOME/precomp/demo/procディレクトリにあり、関連SQLスクリプトは$ORACLE_HOME/precomp/demo/sqlディレクトリにあります。

3 Pro*C/C++リリース10.1.0.2.0の既知の不具合

Bug#1466269    プリコンパイル後にEXPLAIN PLANのヒントが消える

Bug#1323304    SPLIT文中のバックスラッシュが正常にエスケープされない

Bug#658837      SQLCHECK=FULLを指定してもUPDATE WHERE CURRENT OF文の無効な列が検出されない

4 このリリースで修正された不具合

4.1 リリース9.2.0〜10.1.0.2.0で修正された不具合

Bug#2861151     カーソルFETCH後にORACAに正しい更新メッセージが表示されない

カーソルFETCH後にORACAで不正なメッセージが生成されていました。
修正により、FETCHがORACAに保存されていないことを示す正しいORACAメッセージが表示されます。

Bug#2838237     リテラルで三重バックスラッシュが使用されている場合にPROCでエラーが生成される

引用符付き文字列リテラルに三重バックスラッシュ(??/)が使用されていると、PROCでプリコンパイラ・エラーが生成されていました。

次に例を示します。
    printf( "??/"Hello world.??/"??/n" );
    
    printf( "??/"Hello ??/
    
    world.??/"??/n" );
    
    printf( "???/"Hello world.??/"?????/n" );
修正により、引用符付きリテラル文字列に使用されている場合にでも、三重バックスラッシュは正常に処理されます。

Bug#2838079    三重バックスラッシュと改行についてPROCでエラーが生成される

ソース・プログラムで三重バックスラッシュ(??/)と改行が使用されていると、PROCでプリコンパイラ・エラーが生成されていました。次に例を示します。
  /* trigraph test program */
  
    ??=if !defined(__BOGUS1__) && ??/
  
    !defined(__BOGUS2__)
  
    typedef int xint;
  
    ??=endif
  
    ??=if !defined(__BOGUS1__) && ??/
  
    !defined(__BOGUS2__)
  
    typedef int yint;
  
    ??=endif

修正により、三重バックスラッシュと改行は正常に処理されます。

Bug#2765286    配列挿入を使用するとORA-01458が生成される

テストケースで配列挿入を使用すると、実行時にORA-01458エラーが生成されました。

次のコードでは、最初にCnt=1、次にCnt=5でORA-01458が生成されました。

    EXEC SQL FOR :Cnt INSERT INTO TTGM0011 (COMPANY_CODE)
    VALUES ( :stTTGM0011_ARR INDICATOR :stTTGM0011_ARR_IND ) ;

Bug#2717317    EXEC SQL CONTEXT ALLOCATEを使用するとメモリー・リークが発生した

EXEC SQL CONTEXT ALLOCATEをループ内で使用すると、メモリー・リークが発生しました。修正により、メモリー・リークは発生しなくなりました。

Bug#2688989    ループ内でsize=0を指定してsqlald()を使用するとメモリー・リークが発生した

ループ内でsize=0を指定してsqlald()を使用するとメモリー・リークが発生しました。テストケースでは、size=0を指定してループ内でsqlald()をsqlclu()とともに使用したところ、実行時にメモリー・リークが発生しました。

Bug#2672965    動的4 SQLまたは他のカーソルを使用するProcアプリケーションでコア・ダンプが発生した

動的メソッド4のSQLおよび他の暗黙カーソルまたは明示カーソルを使用するProcアプリケーションでは、動的メソッド3の文のコア・ダンプが発生しました。

Bug#2668683    PL/SQLにバインド変数の配列を使用すると、フェッチするデータがないことを示すエラーまたはORA-01458が生成される

PL/SQLブロックでバインド変数の配列が使用されると、アプリケーションでフェッチするデータがないことを示すエラーまたはORA-01458が生成されます。

Bug#2657920    マルチスレッド化されたPro*C/XAアプリケーションでローカルORACAを使用するとスタックが破損する

マルチスレッド化されたPro*C/XAプログラムでローカルORACAを使用すると、スタックが破損し、ロールバック/コミット時にセグメンテーション・エラーになり、この不具合が発生します。

Bug#2630986    65536以上の要素を持つ配列、コレクションは失敗する

アプリケーションで配列またはコレクションに65536以上の要素が使用されていた場合、正しい数の要素が処理されず、メッセージは表示されません。

Bug#2601507    SQLコマンドの関数コードが正常に戻らない

Prepareの後にチェックすると、sqlgls、SQLStmtGetTextは正しい関数を戻しませんでした。

Bug#2513269    #elif内で\の後に空白を使用するとPROCでエラーが生成される

#elifプリプロセッサ・ディレクティブで\の後に1つ以上の空白を使用すると、PROCでプリコンパイラ・エラーが生成されました。ほとんどの(すべてではなく)Cコンパイラは、この構文を受け入れません。ただし、今回の修正によりPROCではテストケースが正常にプリコンパイルされており、この構文がサポートされない場合にはコンパイラ側でエラー・フラグが設定されます。

Bug#2460104    UPDATE文に対してORA-24391が生成された

一部のプラットフォームでは、DML文(UPDATEなど)で暗黙カーソルがスクロール可能であると誤って想定され、ORA-24391エラーが生成されました。修正により、DML文の場合、カーソルはスクロール可能として扱われません。

Bug#2447771    pls-s306を使用するとCALL文のプリコンパイルに失敗する

sqlcheck=semanticsを指定してPROCアプリケーションをプリコンパイルすると、pls-s-306では、バインド変数として配列を取るプロシージャを含むCALL文が失敗します。PL/SQLブロック内でコールすると、同じ条件で正常に動作します。

Bug#2438825    PROCデモcpdemo2.pcが断続的に停止する

PROC接続プーリングのデモ・プログラムcpdemo2.pcは断続的に停止します。

Bug#2419715   構成ファイルで"INCLUDE AND SYS_INCLUDE"オプションを指定すると失敗する

CONFIGファイル内のオプションは、引用符を使用すると予期したとおりに動作しません。

Bug#2403646    Pro*Cアプリケーションがエラー(ORA-01722)の後で低速になる

「数値が無効です。」などのエラーが発生した後は、アプリケーションのパフォーマンスが低下しました。

Bug#2391185    不正なエラー・メッセージORA-00001が戻された

不正なエラー・メッセージORA-00001が戻されました。エラー発生時に記録されなかったORA-01012が戻されるかわりに、不正なエラーORA-00001が戻されました。

Bug#2377393    #includeの後にC++スタイルのコメントがあるとPROCプリコンパイラ・エラーが生成された

ソース・コードで#includeの後にC++スタイルのコメントが使用されていると、PROCでコンパイラ・エラーが生成されました。
次に例を示します。

    #define X <stdio.h>

    #include X // ...,...

これは、C99規格による新規の要件です。

Bug#2322384    EXEC SQL OBJECT GETでメモリー・リークが発生した

ループ内でOBJECT GETが実行されると、メモリー・リークが発生しました。修正により、メモリー・リークは発生しなくなりました。

Bug#2300956    カーソル変数を使用したSQL文のコア・ダンプが発生した

カーソル変数を使用するSQL文で、カーソル変数の前に他のバインド変数も含まれていると、実行時にコア・ダンプが発生します。

Bug#2296922    大きいSQL文が実行時に失敗してエラーORA-00972が戻された

大きいSQL文の実行がエラーになると、次に大きいSQL文は失敗し、「識別子が長すぎます。」というエラー(ORA-00972)が戻されます。

Bug#2296498    プロンプトに対して対話形式でパスワードを入力すると、PROCでコア・ダンプが発生する場合がある

プロンプトに対して対話形式でパスワードを入力すると、PROCでコア・ダンプが発生する場合がありました。修正により、コア・ダンプは発生しなくなりました。

Bug#2245086    非常に大きいバインド構造体を含むソース・コードをプリコンパイルするとPro*Cがクラッシュする

バインド変数または標識変数の詳細を保持するために割り当てられた一時バッファが小さすぎるために、100個以上のバインド変数または標識変数があると、内部のバインド/標識IDを保持できません。

Bug#2191497    エラー発生時に暗黙カーソルがクローズされない

release_cursor=yesを指定して暗黙カーソルを使用すると、エラーがあってもカーソルはクローズされませんでした。

4.2 9iリリース1(9.0.1)〜9iリリース2(9.2)で修正された不具合

Bug#2093437    埋込みSQL文に新規のSQL構文を使用するとPROCでプリコンパイラ・エラーが生成された

埋込みSQL文でWAIT nやCASE ... WHEN ...などの新規SQL構文を使用すると、PROCでプリコンパイラ・エラーが生成されました。今回の修正以外にも、この問題は適切な動的SQLメソッドを使用してテストケースで処理されています。

Bug#2093408    *CASE WHEN*または*FOR UPDATE OF ... WAIT ..*を指定してSELECTをコンパイルすると失敗する

Bug#2083243    データベースの再起動後に記述子を割り当てるとコア・ダンプが発生した

アプリケーションで記述子の割当てまたは割当て解除の実行中にデータベースが停止され再起動されると、記述子の割当て中にコア・ダンプが発生します。

Bug#1991925    NCHARについて記述子項目を取得すると不正な値が戻される

ANSIの動的SQLを使用してNCHAR列からデータを選択すると、LENGTH、RETURNED_LENGTH、OCTET_LENGTHについて不正な値が示され、8進の長さが戻されました。

Bug#1923593    32ビット静的ライブラリでLOBDEMO1実行可能ファイルを実行するとコア・ダンプが発生する

lobdemo1を実行すると、常にバッファのオーバーフローが発生します。バッファcurdateが小さすぎて14バイトのデータをコピーできません。そのため、curdateの長さを大きくしました。

Bug#1754786    LOBロケータの配列に戻るDMLでコア・ダンプが発生した

DMLのRETURN句を使用してLOBロケータの配列に値を戻すと、コア・ダンプが発生しました。

Bug#1192868    名前付き接続の後に記述子を割り当てると失敗し、エラーORA-01012が戻された

名前付き接続を使用して接続し、記述子を割り当てようとすると、割当てに失敗してエラーORA-01012が戻されました。

4.3 リリース8.1.7〜リリース9iで修正された不具合

Bug#1576145    不要な定義が原因でリリース8.0に比べてリリース8.1のパフォーマンスが低下した

ループに1つFETCH文がある場合、リリース8.0に比べてリリース8.1のパフォーマンスが低下しました。これは、すべての反復でホスト変数ごとに不要なDEFINEがコールされるためでした。修正により、すべてのホスト変数が解析され定義された後の同じFETCH文では、次の反復時にはDEFINEがコールされません。

Bug#1410679    標識変数がない場合に配列フェッチのパフォーマンスが低下した

標識変数を使用しない配列フェッチの場合は1行に対してフェッチが実行され、リリース8iではデータのフェッチを目的としたサーバーへのラウンドトリップ回数が増加していました。
修正により、FETCHのコール回数がリリース8.0.6と同じになっています。

Bug#1410582    ループ内でオブジェクトの割当てと解放が実行されるとメモリー・リークが発生した

ループ内でオブジェクトの割当てと解放が実行されると、メモリー・リークが発生しました。修正により、メモリー・リークは発生しなくなりました。

Bug#1390597    ORA-00001でエラー・メッセージとともに列名が出力されない

有効なエラー・メッセージORA-00001が生成される場合は、次のように列名のないエラー・メッセージが出力されていました。

    ORA-00001: 一意制約(.)に反しています。

修正により、エラー・メッセージは次のように出力されるようになりました。

    ORA-00001: 一意制約(SCOTT.SYS_C002621)に反しています。

Bug#1239856    sizeofを使用するとPROCでプリコンパイル・エラーが生成された

ホスト変数の型を解決するときにsizeofが使用されると、PROCでプリコンパイラ・エラーが生成されました。修正により、同じホスト変数についてsizeof式が実際には評価されないことを示す警告が生成されます。
次に例を示します。

    char dst[1024] ;
    char dyn_statement[sizeof(dst)];
    EXEC SQL VAR dyn_statement IS STRING(1024);

次の警告メッセージが生成されます。

    Semantic error at line 61, column 27, file t1239856.pc:
    char dyn_statement[sizeof(dst)];
    ..........................1
    PCC-W-02314: 定数のSIZEOF式を評価できません。

注意: 使用例によっては、アプリケーションが意図したとおり動作しない場合があります。そのため、ホスト変数の型にはsizeofを使用しないことをお薦めします。

Bug#1175132    INSERTに不要な解析が実行されるためパフォーマンスが低下した

INSERT文が原因でORA-00001エラーが発生するたびに、INSERT文の再解析がトリガーされ、パフォーマンスが低下します。ORA-01403、ORA-01405およびORA-01406の場合にのみ、再解析は実行されませんでした。修正により、解析エラーが発生しないかぎり再解析は実行されません。

Bug#897697    Pro*C/C++でUSING句を含む関数を変換できない

変換関数にUSING句を使用すると、Pro*C/C++ではプリコンパイル時にPCC-S-02201エラーが発生しました。

Bug#746347    動的SQLメソッド4で不正なsqlerrd[4]値が生成された

動的SQLメソッド4で、エラーがある列の番号を指す不正なsqlerrd[4]値が生成されました。修正により、sqlerrd[4]に正しい値が割り当てられます。

4.4 リリース8.1.5〜リリース8.1.6で修正された不具合

Bug#927164    RELEASE_CURSOR=YES HOLD_CURSOR=NOを指定するとORA-02103が発生した

RELEASE_CURSOR=YESおよびHOLD_CURSOR=NOオプションを使用してアプリケーションを作成すると、実行時にORA-02103が発生しました。このエラーの原因は、再利用しようとしているときにカーソルの一部の要素を解放したことです。この問題を修正するために、適切な条件が設定されました。

Bug#922250    生成されたファイルに行の継続を表す\がない

Pro*C/C++では、行継続文字\のない不正コードが生成される場合がありました。

Bug#909074    大文字のファイル名を使用して小文字のインクルード・ファイルをオープンできない

Pro*C/C++では、実際には小文字のインクルード・ファイルをオープンするときに大文字のファイル名を使用すると、「PCC-S-02015: 挿入ファイルをオープンできません。」というエラーが生成されました。

Bug#872814    NCLOBデータに対してEXEC SQL READを実行するとORA-24806エラーが戻される

埋込みSQL LOB READ(およびWRITE)文でNCLOBを使用すると、アプリケーションで「ORA-24806: LOBのフォームが一致しません。」が生成されました。

Bug#850965    ポインタ/非ポインタのホスト/標識構造体が混在する問題

Pro*C/C++では、対応する非ポインタのホスト構造体と混在しているポインタの標識構造体を処理できません。次に例を示します。

     typedef struct { .. } hst;
     typedef struct { .. } ind;
     hst h;
     ind i, *ip = &i;
     EXEC SQL SELECT .. INTO :h:ip FROM ..;

ホスト/標識構造体のペアが混在し、一方がポインタで他方がポインタでないと、セマンティクス・プリコンパイル・エラーになります。

Bug#826057    64ビットのポートではANSIの動的SQLオプションtype_codeが失敗する

64ビット・プラットフォームでは、TYPE_CODEオプションを値ANSIに設定してANSI動的SQLで使用すると、不正な結果が戻されました。

Bug#821874    AT句を使用するとSQLUS.MSBに余分なファイル記述子が使用された

CONNECT文にAT句を使用すると、SQLUS.MSBメッセージ・ファイルがオープンされますが、これは不要です。修正により、エラーが発生するまでSQLUS.MSBのオープンは遅延するようになりました。

Bug#791384    NULLのLOBにLOBを追加すると、説明的でないエラー・メッセージが戻される

NULLのLOBに対するLOBのAPPENDはエラーです。ただし、SQLLIBから戻されるエラー・メッセージには、この状況が正しく記述されませんでした。

Bug#764996    INSERT文で表の別名を使用できない

INSERT文で表の別名を使用すると構文エラーになります。次に例を示します。

    EXEC SQL INSERT INTO persons p VALUES ..
    RETURNING .. INTO .. ;

表の別名pはPro*C/C++に受け入れられず、構文エラーとなります。

Bug#761892    Pro*C/C++で接続修飾子が認識されない

Pro*C/C++では、表の参照に使用されている接続修飾子を解析できませんでした。次に例を示します。

    EXEC SQL SELECT .. INTO .. FROM sys.dual@v7bug.world@q1;

この場合、接続修飾子を示す@が使用されているため構文エラーとなります。

Bug#693939    ANSIの動的SQLでは空白埋め文字列型が埋められない

文字列型、ANSIの可変文字列型およびANSIの固定文字列型は、ANSI動的プログラムで使用されると空白で埋められませんでした。修正により空白で埋められるようになり、戻される長さフィールドは不定です。

Bug#690984    Pro*C/C++では、長さを16進値で指定するとホスト・フィールドの長さが0(ゼロ)とみなされる

Pro*C/C++では、16進(または8進)定数を使用して宣言されたCHARまたはVARCHARホスト変数の長さが正しく処理されませんでした。たとえば、変数の長さchar x [ 0 x 40 ] は値0(ゼロ)として計算されるため、SQL文中で使用されると失敗しました。

Bug#606462    CHARFと等価のCHAR変数に長さ1が使用されない

1つのCHAR変数と等価の型をCHARFに割り当てると(つまり、char x に続いてexec sql var x is charf;を使用 -- 長さ指定がないことに注意)、ホスト変数に長さ1ではなく0(ゼロ)が誤って割り当てられ、埋込みSQL文に使用された場合は不正データとなりました。

Bug#319566    ANSIスタイルの複数行のコメント(--)があると失敗してPCC-S-2201が戻される

埋込みSQL文にANSIスタイルの複数のSQLヒントを使用すると、構文エラーになりました。次に例を示します。

     EXEC SQL SELECT --+ hint comment 1
     --+ hint comment 2
     ... INTO ... FROM ...;

この例は、プリコンパイル時に構文エラー・メッセージが生成されます。回避策は、かわりに/*+ .. */ヒント書式を使用することでした。

Bug#701934    Pro*Cでオブジェクトとともに不適切な標識変数を使用するとコア・ダンプが発生する

Pro*Cでは、Object Type Translatorで型が生成されていない標識変数を、なんらかのObject型のホスト変数(つまり、OTTにより型が生成されたホスト変数)とともに使用すると、コア・ダンプが発生します。

4.5 リリース8.0.5〜リリース8.1.5で修正された不具合

Bug#544522    Pro*Cがバインド変数内の算術式を受け入れない

Pro*Cは、算術式の使用に関係したバインド変数式を受け入れません。次に例を示します。

    EXEC SQL UPDATE tab SET col = :x [ i + 1];

Pro*Cでは、i+1の式で式の型が使用方法と一致しないことを示すエラーが発生します。

修正により、Pro*Cは、+、-、*、/および%演算子のみが使用されている場合、一定の算術式を受け入れるようになりました。

Bug#692782    SQL_CURSOR変数へのポインタがALLOCATEまたはFREEで機能しない

EXEC SQL ALLOCATE文またはFREE文にSQL_CURSOR *型のホスト変数を使用すると、実行時にセグメンテーション・エラーになります。この2つの文で正常に動作するのは、非ポインタのSQL_CURSORホスト変数のみです。FETCHやCLOSEなど、他の文にSQL_CURSOR *型のホスト変数を使用すると、問題なく動作することに注意してください。

Bug#692548    Pro*Cで配列を含む構造体へのポインタを処理できない

SELECT文またはFETCH文で配列を含む構造体へのポインタがホスト変数として使用されると、配列サイズに関係なく1行しか取得されません。このため、SELECT文の場合は「SQL-02112: SELECT..INTOが戻す行が多すぎます。」が戻ります。FETCHの場合はFOR句を使用すると問題を回避できますが、SELECT文にはFOR句を使用できません。次に例を示します。

    struct foobar { int empno[14]; } a, *b;
    b = &a;
    EXEC SQL SELECT empno INTO :b FROM emp;

この場合はSQL-02112エラーとなります。:aにSELECTすると正常に動作します。構造体が名前付きであるという事実が関係していることに注意してください。名前のない構造体を使用するとエラーは発生しません。事実、どちらの場合も名前のない構造体ポインタは正常に動作します。

Bug#668920    CURSOR副問合せとMULTISET副問合せでORDER BY句が受け入れられない

Pro*Cでは、CURSOR副問合せまたはMULTISET副問合せの一部としてORDER BY句が使用されていると、構文エラーが生成されます。次に例を示します。

    EXEC SQL SELECT CURSOR(SELECT ename FROM EMP
    WHERE deptno = :deptno
    ORDER BY ename)
    FROM DUAL;

ORDER BY句はオプションであり、CURSOR副問合せまたはMULTISET副問合せで許可する必要があります。

4.6 リリース8.0.4〜リリース8.0.5で修正された不具合

Bug#642112    接続が有効であってもSQLLIBでORA-01012(接続されていません)が戻される

埋込みSQL CONNECT文を介して接続されていない場合は、SQLLIBでORA-01012エラー・メッセージが戻されました。

Bug#638215    REFインジケータが正常に動作しない

REFインジケータが正しく設定されませんでした。次に例を示します。

    EXEC SQL SELECT ref_column
    INTO :ref_hostvar:ref_indvar FROM tab WHERE .. ;

このような文ではORA-01405が戻されます。

Bug#636898    マルチスレッド化アプリケーションで接続/切断のペアに対してメモリー・リークが発生することがある

マルチスレッド化アプリケーション(threads=yesを指定してプリコンパイルされ、EXEC SQL ENABLE THREADSを実行したアプリケーション)では、EXEC SQL CONNECTとEXEC SQL <ROLLBACK | COMMIT> RELEASEが繰り返し実行されると、メモリー・リークが発生することがあります。

Bug#636325    CONNECT文に新規のSYSDBA、SYSOPER構文が追加された

8.0.4より前のリリースでは、デフォルトで次のように埋込みSQL CONNECT文を使用して、SYSDBA権限とパスワードCHANGE_ON_INSTALLで識別されたユーザーSYSに接続できました。

    EXEC SQL CONNECT :uid IDENTIFIED BY :pwd;

リリース8.0.4では、接続モードを指定する必要があるため、この埋込みSQL CONNECT文は失敗します。リリース8.0.5のPro*C/C++では、次のように新規の埋込みSQL CONNECT構文を使用して接続モードを指定できます。

    EXEC SQL CONNECT :uid [ IDENTIFIED BY :pwd ]
    [ AT [ : ] dbname [ USING: hst ] ]
    { [ ALTER AUTHORIZATION: newpwd] | [ IN { SYSDBA | SYSOPER } MODE ] }

制限:

AUTO_CONNECT機能を使用している場合は、SYSDBA/SYSOPERモードで接続できません。

Bug#622811    RELEASE_CURSOR=YESオプションを使用するとメモリー・リークが発生する

カーソルのクローズ時にメモリー・リークが発生しました。

Bug#621712    Pro*Cでextern "C"構成メンバーの解析中に構文エラーが生成される

extern "C"構成メンバーを持つDECLARE SECTIONにヘッダー・ファイルを置くと、構文エラーになりました。明示的なDECLARE SECTION内にあるとPARSEがFULLに設定されるため、CODE=CPPまたはPARSE=PARTIALを指定しても問題が発生します。CODE=CPPの場合は、Object Type Translator(OTT)により生成されるヘッダー・ファイルをDECLARE SECTION内にインクルードする必要があるため、OTTにより生成されるヘッダー・ファイルを使用してC++アプリケーションを作成しようとすると問題が発生します。それ以外の場合、重要な型定義はPro*Cで解析されません。通常は、extern "C"構文を次のように#ifdefで囲みます。

     #ifdef __cplusplus
     extern "C" {
     #endif

Pro*Cでは、CODE=CPPのときには__cplusplusが内部的に定義されるため、簡単な回避策の1つは次のようにORA_PROCマクロを使用して条件付きで#undefすることです。

     #ifdef ORA_PROC
     # undef __cplusplus
     #endif

この場合、extern "C"構文の使用場所に関係なく(DECLARE SECTION内かどうかに関係なく)解析されません。生成されたCコードがC++コンパイラでコンパイルされるときには、extern "C"コードが認識され、問題なくコンパイルされるように、ORA_PROCはプリコンパイル中にのみ定義する必要があります。

Bug#607962    IAF PUT VALUESに対して「'」のかわりに不正な文字列「''」が生成される

IAF PUTまたはTOOLS MESSAGEあるいはTOOLS SET文でリテラル文字列の一部として「''」が使用されていると、コードが正常に生成されませんでした。

次に例を示します。

     EXEC IAF PUT GLOBAL.MSG_TXT VALUES('WHO''S THERE?');

この場合は、正しい文字列WHO'S THERE?のかわりに文字列WHO''S THERE?を含む不正なコードが生成されます。

Bug#588979    Pro*Cではderef時にオブジェクトのインジケータ構造体がフェッチされない

Pro*Cではderef時にオブジェクトのインジケータ構造体が取得されませんでした。回避策は、SQLEnvGetで提供される環境でOCIObjectGetIndを物理的に使用することでした(Pro*CのOCI相互運用性の問題を参照)。

Bug#588392    SQLLIBでコンテキストの割当てと解放の間にメモリー・リークが発生する

ランタイム・コンテキストを割り当てて解放したPro*Cアプリケーションで、ALLOCATEとFREEのペアをコールするたびにメモリー・リークが発生しました。

Bug#579807    Pro*Cで処理するSQL文が長すぎるとコア・ダンプが発生する

Pro*Cでは、長すぎるSQL文(複数の入力行にまたがるSQL文)は正常に処理できません。簡単な回避策は、文を複数の継続行にまたがらせるのではなく、改行を挿入してSQL文を分割することでした。

Bug#571769    PROCで#defineに#machineを使用できない

Pro*Cは、特に他のマクロの#defineに使用されている場合に、#machineディレクティブを正常に処理できません。次に例を示します。

    #define __mips__ #machine(mips)

__mips__の予期値が適切に定義されないため、プリコンパイル中に他のエラーが発生します。#machineディレクティブはできるかぎり使用しないでください。

Bug#558787    Pro*Cでは複合的なホスト変数式の型を解決できない

( *x ).y または ( *x ) -> y 形式のホスト変数式の型は、Pro*Cでは解決できません。通常、カッコで囲まれたホスト変数式はPro*Cで受け入れられません。

制限:

ホスト変数式が左辺値でなくても、Pro*Cでは警告が表示されません。

また、このように複合的な式はスカラーまたは配列に解決する必要があることに注意してください。Pro*C/C++では、構造体に解決される複合的なホスト変数式を処理できません。

Bug#556949    MODE=ANSIを指定してプリコンパイルするとパフォーマンスが低下する

ANSIでは、カーソルを再OPENする前にCLOSEする必要があります。そのため、MODE=ANSIを指定してプリコンパイルしたアプリケーションは、カーソルが何度もCLOSE/再OPENされると、OPENするたびに再解析されるため低速になる場合があります。この種のアプリケーションでは、OPENされているカーソルをすべてCOMMITでクローズします。

アプリケーション開発者がCOMMITの実行時にカーソルをCLOSEするかどうかを選択できるように、新規のCLOSE_ON_COMMITオプションが追加されています。CLOSE_ON_COMMIT=NOに設定すると、COMMITの実行時にもカーソルがクローズされないため、再OPENの必要性が減少し、余分な解析も減少するため、パフォーマンスが向上します。

Bug#553658    NLS_CHARとNLS_LOCALを使用するマルチスレッド化アプリケーションでGPFが発生する

Windows NTプラットフォームでは、プリコンパイラ・オプションnls_charおよびnls_localを使用したアプリケーションでコア・ダンプが発生しました。Windows NTのマルチスレッド化アプリケーションの場合、グローバル・ランタイム・コンテキストは適切なnls_charおよびnls_local情報を取得しないために、コア・ダンプが発生しました。

Bug#549812    コマンドラインで指定した複数のファイル名を処理中にコア・ダンプが発生する

ファイル名として3つ以上の名前(x x xなど)を指定すると、Pro*でコア・ダンプが発生しました。Pro*はコマンドライン・オプションを処理するときに、入力ファイル名1つと出力ファイル名1つを想定しています。コマンドラインで3つ以上のファイル名を指定でき、適切なエラー・メッセージが表示されるように、Pro*が修正されました。

Bug#549142    PREPARE文またはIMMEDIATE文に使用した%文字が削除される

PREPARE文またはIMMEDIATE文でLIKE比較に%文字を含むテキストを引用符なしで指定すると、出力ファイルに生成されませんでした。次に例を示します。

    EXEC SQL PREPARE s_pln_count FROM
    SELECT COUNT(*) FROM PLN
    WHERE plan_type LIKE 'LOAN%';

この例では、次の出力が生成されます。

    sqlstm.stmt="select count(*) from PLN where plan_type like 'LOAN'";

値0(ゼロ)のカウントが戻されます。

正常に生成されたコードは次のようになります。

    sqlstm.stmt="select count(*) from PLN where plan_type like 'LOAN%'";

Bug#502066    長い.pcファイル名のプリコンパイル時にコア・ダンプが発生する

コマンドラインでLNAMEおよびLTYPE=LONGオプションとともに長い(101文字以上の).pcファイル名を使用すると、メモリーが破損してコア・ダンプが発生しました。ファイル名のサイズを静的に割り当てるかわりに、動的な長さを使用します。

Bug#458658    ##マクロ定義に#演算子を使用する場合の問題

Pro*Cでは、##操作の本体に#演算子が使用されているマクロ定義を解析できません。次に例を示します。

     #define strcat(x) #x ## "foo"

Pro*Cでは構文エラーが生成されます。修正により、Pro*Cはこの種の構文を受け入れますが、テキストの文字列化との連結は実行されません。

Bug#393628    特定の複合マクロ定義の構文エラー処理

Pro*Cでは、次の書式のマクロ定義を処理できません。

     #define __P(x) x
     #define foo(x) something(x, 10)
     extern int foo __P((int))

この問題は、fooマクロが認識されてextern宣言内で拡張されるように、以前は(int)に拡張されなかった__Pが使用されていることが原因でした。

また、次の書式のマクロ

    #define __ARG1(t1, x1) (t1) t1 x1;

および、そのマクロをサブプログラムの作成に使用する場合にも問題が発生しました。まれに、この種のマクロに必要なマクロ拡張が原因で構文エラーとなることがあります。

Bug#316344    SQLヒントの位置が不正な場合のエラーを含むプリコンパイル

Pro*Cでは、SQLヒントが不正な位置で使用されているSQL文は正常にプリコンパイルされません。生成された文には、通常、ヒントのテキストが誤って文の残りの部分に混在し、その結果実行時エラーとなります。SQLヒントには/*+ .. */および--+形式を使用し、SELECT、UPDATE、INSERTまたはDELETEの各キーワードの直後に使用する必要があります。他の位置にあるヒント・コメントはエラーであり、プリコンパイラにより構文エラー・フラグが設定されます。このため、ヒントを使用する場合は、ヒントが文の実行に影響すると考え、それを受け入れて無視するのではなく適切に使用する必要があります。

4.7 リリース8.0.3〜リリース8.0.4で修正された不具合

Bug#552084    Pro*Cを介したデータベースへのログオン試行に失敗しても、シャドウ・プロセスがサーバーに残ったまま終了しない

それ以後にログオン試行に失敗すると、プログラム自体が終了するか、サーバーがプロセスをすべて使用するまで、新規のシャドウ・プロセスが残ります。

Bug#546237    接続文字列にユーザー名に関連付けられた明示的データベース名を使用すると、データベースに接続できない

たとえば、scott@remoteとして接続しようとすると失敗し、ORA-01017エラーが戻されます。

Bug#523931    各種INSERT文の後にWHENEVER NOT FOUND条件がチェックされない

たとえば、NO DATA FOUNDを戻したINSERT文のPL/SQLトリガーは、WHENEVER NOT FOUND条件でトラップされません。

Bug#515582    文字列リテラルがバインド変数式として使用されるたびにPro*Cでコア・ダンプが発生する次に例を示します。

    EXEC SQL SELECT job INTO :job FROM emp WHERE ename = :"KING";

バインド式としての文字列リテラルの使用は無効であり、プリコンパイラによりエラー・フラグが設定されます。

Bug#509647    ナビゲーショナルOBJECT SET文で属性の前にコロンがないとコア・ダンプが発生する

ただし、これはOBJECT GETでは発生しませんでした。

Bug#508256    プラットフォームによっては、問合せでDEREF()またはREF()を処理するとPro*Cでコア・ダンプが発生する

Bug#506520    Pro*CでINSERT文に有効なSQLヒントが使用されている場合に構文エラーが生成される

どのような書式のINSERT文でも、有効なヒントがあるとこの種のエラーが発生します。

Bug#503981    Pro*CではPL/SQLブロックを実行する動的SQLメソッドを含むホスト配列を正常に処理できない

Bug#286765    動的SQLを介してホスト配列をPL/SQL表にバインドすると実行時エラーが発生する

動的SQLメソッド2のEXEC SQL EXECUTE文に使用されているホスト配列は、ARRAYLEN文に新規のオプション・キーワードEXECUTEが使用されているかどうかに応じて、2つの異なる方法で解析されます。

詳細は、リリース8.0.4の『Pro*C/C++ Precompiler プログラマーズ・ガイド』を参照してください。

Bug#217428    VARCHAR2(2000)型の表に2つの列があると、許可されない2つのLONG列と誤ってみなされる

このため、表の複数のVARCHAR2列にこのサイズを使用してアプリケーションを開発することはできません。

4.8 リリース2.2.3〜リリース8.0.3で修正された不具合

Bug#472139    Pro*CではPARSE != FULLのときに同値化された変数が処理されない

Pro*Cでは、PARSEオプションの値がFULLに設定されていない場合、データ型が同値化された変数は処理されません。次に例を示します。

    typedef short *sb2ptr;
    exec sql begin declare section;
    exec sql type sb2ptr is integer(2) reference;
    sb2ptr ind;
    int x;
    exec sql end declare section;
    ..
    exec sql select comm into :x:ind where empno = ..;

indは実際にはポインタであるため、生成されるコードはindを直接参照するのではなくind(&ind)のアドレスを取ります。この問題が発生するのは、PARSE != FULLの場合のみです。

Bug#471975    ORACAで保存された文のテキストを使用して解放されたメモリーからの読取りが可能である

ORACAを使用して文テキストを要求したプリコンパイラ・アプリケーションでは、動的SQLも使用しているとメモリー・リーク関連の問題(コア・ダンプなど)が発生することがあります。この問題は、文テキストを保持するために使用されたホスト変数が、動的に割り当てられたメモリー(割当後に解放される)を示す場合か、またはホスト変数が自動変数の場合によく発生しました。この不具合修正の副次効果として、プリコンパイラにより解析される文の後にsqlgls()をコールすると、古い文テキストを戻さなくなりました。次に例を示します。

     EXEC SQL DECLARE C1 CURSOR FOR SELECT ENAME FROM EMP;
     EXEC SQL OPEN C1;
     sqlgls() /* Returns "SELECT ENAME FROM EMP" */
     EXEC SQL ROLLBACK WORK RELEASE;
     sqlgls() /* This returns NO statement text */

Bug#471039    Pro*CでDELETE文のSQLヒントが正常に処理されない

Pro*Cでは、SQLヒントが使用されないようにDELETE文が並べ替えられます。次に例を示します。

    exec sql delete /*+ INDEX (emp emp_idx) */ from emp ..
    => "delete from /*+ INDEX (emp emp_idx) */ emp .."

Pro*Cではヒントの位置が変更され、文の実行中には使用されなくなります。

Bug#465932    Pro*Cでは#errorディレクティブ内に単独の「'」が許可されない

Pro*Cでは、プリプロセッサ・ディレクティブ内の単一の「'」はSQL文字列リテラルの開始として扱われます。

    #error This didn't work

そのため、この#errorディレクティブを解析すると、終了文字のないSQL文字列に関するエラーが表示されます。

Bug#443347    動的配列を実行する前にプリコンパイルすると不正な結果となる

動的な配列挿入に使用するINSERT文をプリコンパイルした後に、PL/SQLブロックを含む他の文をプリコンパイルすると、実行時には1行しか挿入されません。

Bug#414511    Pro*Cでディレクティブ内で行継続文字の後の空白が許可されない

プリプロセッサ・ディレクティブ内で行継続文字と改行文字を区切る空白は、Pro*Cでは無視されません。次に例を示します。

この場合は、プリコンパイルの前処理フェーズでプリコンパイル・エラーになります。Pro*Cでは、このような余分な空白が無視されるようになりました。

Bug#408116    マルチバイト・キャラクタを含む/*+コメントがあるとPro*Cでコア・ダンプが発生する

Pro*Cでは、マルチバイト・キャラクタの可能性は考慮されていないため、/*+コメントにマルチバイト・キャラクタが含まれているとコア・ダンプが発生します。

Bug#406516    コマンドライン・オプションに関する長いPCC-F-02135メッセージが切り捨てられる

インクルード・ファイルなど、ヘルプ・オプションの値が非常に長い場合にこの種のオプションのヘルプ・メッセージを表示すると、値の一部しか表示されず、セグメンテーション・エラーが発生することがあります。

Bug#402136    VARCHAR変数でNULLを挿入するとORA-01459が戻される

長さ0(ゼロ)の文字列を指すVARCHARポインタがデータベースに挿入されると、「ORA-01459: 可変長文字列の長さが無効です。」というメッセージが戻されます。

Bug#400907    オプション値が81文字以上の場合にプリコンパイラが停止する

オプション・リストを使用する場合に、リストの値の長さが合計80文字を超えていると、プリコンパイラが停止します。

Bug#397811    配列DMLの配列サイズがAT :database句と一致しない

Pro*Cでは、AT :database句があると、同等ディメンションのホスト配列を含むDML文について配列サイズの不一致エラーが戻されます。AT句のDBNAMEは、それ自体がスカラーのホスト変数であり、不一致の原因となっていたことに注意してください。

Bug#397223    ディメンション化されていない配列の特定の要素を参照できない

これは、ディメンション化されていない配列の特定の要素がEXEC SQL文にホスト変数として使用されていると、プリコンパイラ・エラーになるという問題でした。プリコンパイラ・エラーは、215929のコア・ダンプを修正するために生成されました。この修正によりプリコンパイルなしでコア・ダンプが削除され、適切なプリコンパイルと実行が進行します。

Bug#382795    Pro*Cで#define ident 'LOTTO'ディレクティブを解析できない

#define ident Bを使用すると、Pro*Cではidentがあるためエラー・フラグが設定されました。これは、#defineにはキーワードが許可されないためです(一部のプラットフォームではidentがキーワードとして使用されることを示すためです)。そこで、if、ifdefなど、他のキーワードと同じidentの使用方法に対処するために、構文規則が変更されました。

Bug#371255    ポインタが無効でもインジケータがNULLの場合にセグメンテーション・エラーが発生する

バインド変数のポインタが無効で、関連付けられたインジケータが-1に設定されている場合は、アクセス違反が発生します。

Bug#366775    THREADS=YESを指定してプリコンパイルするとコア・ダンプが発生し、テンポラリ・ファイルが削除されない

ただし、ユーザーは、コア・ダンプが発生しないようにTHREADS=YESを機能させるためのコードを記述する必要があります。この修正により、セマンティクス・エラー・メッセージが生成され、テンポラリ・ファイルが削除されます。たとえば、この不具合で提供されるテストケースでは、次のエラー・メッセージが生成されます。

    (1) PCC-F-02390: EXEC SQL CONTEXT USE文が見つかりません。

Bug#359035    NLS: コメント行の生成時に列の位置が不正です

CHARストリームにNLS文字が存在する場合は、マルチバイトの関係で列のカウントを訂正する必要がありました。たとえば、ストリームに45文字があり、そのうちの2つがNLS(マルチバイト)の場合、実際には43文字しかありません。45文字が使用されると次の2バイトがフェッチされますが、それがコメント/*の開始となることがあります。これにより、コメント構造全体が乱れます。そこで、この修正により正しい文字数が計算されます。

Bug#345010    Pro*CではANSIトークン・マージ演算子の使用を処理できない

マージ演算子##を使用すると、Pro*Cで擬似的な構文エラー・メッセージが生成されます。この構文は受け入れられるようになりましたが、マージは実行されません。Pro*Cは、この演算子の使用は受け入れますが、機能をサポートしません。

Bug#344346    一部のNLS言語でプリコンパイラのヘルプ画面が無限ループに入る

一部のNLS言語では、コマンドライン・オプションの説明が長すぎて1行に収まらず、多数の空白を挿入しなければ複数行に分割できないため、ヘルプ画面を要求すると、プリコンパイラが無限ループに入ります。

Bug#268198    Pro*CでEXEC SQL BEGIN_END DECLARE SECTIONの分割が許可されない

Pro*Cでは、EXEC SQL BEGIN/END DECLARE SECTION全体を、複数行になる可能性があっても1行に記述する必要がありました。他の場合には構文エラーになります。

Bug#479063    LOB型の配列を使用すると擬似的な実行時エラーが発生する

プリコンパイラでは、LOB型の一定の配列宣言を処理するとき、特に、関数のパラメータ・リストに指定されている場合に、不正なコードが生成されました。たとえば、次の文は正常にプリコンパイルされませんでした。

     void BlobFunc(multi_blob)
     OCIBlobLocator *multi_blob[ ];

Bug#475284    Pro*Cで特定のエラー・メッセージの生成後にコア・ダンプが発生する

Pro*Cでは、一部の新規Objects関連型(OCINumber)として宣言されたバインド変数の使用に関連して、一定のエラーが検出された後にコア・ダンプが発生します。この問題は、INTYPEファイルを指定せずにObjectsプログラムをプリコンパイルした場合にも発生します。

Bug#469671    Pro*Cでマルチバイトの長いテキスト行の処理中にコア・ダンプが発生する

多数のマルチバイト・テキストを含む長すぎる入力行があると、Pro*Cではコア・ダンプが発生して異常終了します。

Bug#464714    FIPSレポートにすべての違反が行0(ゼロ)で発生したことが示される

Pro*Cにより生成されたFIPSレポートは、実際に違反が発生したプログラムの実際のソース行ではなく、すべての違反が行0(ゼロ)で発生したことを示します。

Bug#463066    Pro*Cでは等価文内でCの式が許可されない

Pro*Cでは、データ型等価文には、プリコンパイル時に評価可能な複合定数式は許可されません。

     #define LENGTH 10
     char x[ LENGTH+1 ];

     EXEC SQL VAR x IS STRING( LENGTH + 1 );

修正により、VAR/TYPE文のSQLデータ型の長さ指定には、プリコンパイル時に数値に評価できる任意の定数式を使用できるようになりました。

Bug#461907    Pro*Cでは長さ指定のないLONG VARCHARに関するエラーが戻されない

LONG VARCHARデータ型には長さが必須です。Pro*Cは長さ指定のないLONG VARCHARを受け入れますが、実行時エラーとなります。

    EXEC SQL VAR foo IS LONG VARCHAR;

この例は無効です。修正により、構文エラー・メッセージが生成されるようになりました。

Bug#454733    Pro*C/C++が副問合せのWITH句を受け入れない

副問合せへのWITH句の追加は、Oracle8の新機能です。Pro*CではWITH句は許可されていませんでした。かわりに構文エラーになります。たとえば、次の例は許可されていませんでした。

     EXEC SQL INSERT INTO (SELECT ename, deptno FROM emp
     WHERE deptno > 10 with check option)
     VALUES ('Taylor', 20);

WITH READ ONLY句も許可されません。この問題を回避するには、かわりに動的SQLを使用する必要があります。

Bug#454727    Pro*Cが表の名前のPARTITION句を受け入れない

Pro*Cは、DML文で表の名前のPARTITION句が使用されていると、その構文を拒否します。次に例を示します。

    EXEC SQL DELETE FROM sales PARTITION (nov96) WHERE ..

この問題を回避するには、動的SQLを使用する必要があります。

Bug#453328    SQLCHECK != FULLを指定するとPro*Cがuseridオプションを処理できない

Pro*Cは、SQLCHECKオプションがFULLに設定されていなければ、useridオプションの使用を許可しません。

Bug#434744    LTYPE=LONGの場合にリスト・ファイルにコマンドライン・オプションが追加されない

LTYPEコマンドライン・オプションをLONGに設定した場合は、現在のコマンドライン・オプションの値をリスト・ファイルに指定する必要があります。また、改ページ文字は、リスト・ファイルの1文字目ではなくページ間に使用する必要があります。

Bug#429924    Pro*CでWHENEVER文に使用されている「&」を処理できない

Pro*Cでは、WHENEVER文には&演算子を使用できません。次に例を示します。

    EXEC SQL WHENEVER SQLERROR DO sql_error( &x );

理解しづらいエラーとなります。Pro*Cでは、この文が複合式の一種として受け入れられ、より適切に処理できるようになりました。

Bug#428633    Pro*CでWHENEVER文に単項式が許可されない

Pro*Cでは、WHENEVER文には単項式が許可されません。次に例を示します。

    EXEC SQL WHENEVER SQLERROR DO sql_error( -1 );

すべての単項式が許可されるようになりました。ただし、現在、WHENEVER文では二項式はサポートされません。

Bug#426826    Pro*Cでは未定義の変数を割り当てるとコア・ダンプが発生する

未定義の変数を割り当てようとすると、Pro*Cでコア・ダンプが発生します。次に例を示します。

    EXEC SQL ALLOCATE :undefined;

変数が未定義であることと、ALLOCATEで型エラーが発生したことを示す有効なエラーが生成されるようになりました。

Bug#406664    Pro*Cでマクロが名前になっているファイルがインクルードされない

Pro*Cでは、code=ansi_cまたはcode=cppの場合に#includeできるのは、マクロで定義されているファイルのみです。一部のkr_cコンパイラではこれが可能ですが、Pro*Cでは構文エラーとなります。

     #define HEADER "file.h"
     #include HEADER

このディレクティブが動作するのは、CODE=KR_CではなくCODE=ANSI_CまたはCODE=CPPの場合です。KR_CコンパイラではコンパイルされないANSI_C生成コードが使用されるため、実際の回避策はありません。

Bug#399274    Pro*CでSTART WITH ... CONNECT BYの順序が切り替わることがある

本来、Pro*Cでは、CONNECT BYが先に使用されている場合にも、常にSTART WITHの後にCONNECT BYが生成されます。このため、以降に明示カーソルで使用されるプリコンパイルされたSQL文の場合には、問題が発生します。文が逆の順序で生成されているため、結果的なOPEN USING <bind variable list>ではバインド変数が正しい順序で生成されない場合があります。これにより、プログラムの実行中に実行時の型不一致エラーとなります。

Bug#364746    Pro*Cで<table>.*の参照を使用するとC++エラーが発生する

Pro*Cでは、SQL文で有効な<table>.*の参照を使用していても、C++の記号の使用に関するエラーが戻されます。次に例を示します。

    EXEC SQL SELECT emp.* INTO :emp_struct FROM emp;

回避策は、emp.を削除して単にSELECT *を実行することでした。
このエラーが発生するのは、CODE=CPPを指定してプリコンパイルする場合のみであることに注意してください。

5 Pro*C/C++ 10.1.0.2.0の制限事項

1. OS/外部認証を介してローカルまたはリモートのマシンに接続してスレッド化するPro*Cアプリケーションは、CPOOLがYESに設定されているとORA-01005を戻して失敗します(Bug 2675900)。

これはOCIによる制限事項です。この問題の回避策は、プログラムの最初のCONNECT文としてダミーのEXEC SQL CONNECT :useridを使用することです(useridは、有効なデータベース・ユーザー名/パスワードです)。

6 Pro*C/C++ 8.1.6の制限事項

6.1 #includeとEXEC SQL INCLUDE(Bug#450572)

#includeと明示的なEXEC SQL INCLUDEの両方を使用してsqlca.hやsqlda.hなどのOracleヘッダー・ファイルをインクルードするプログラムは正常にプリコンパイルされず、コンパイルされないコードが生成されます。最も簡単な回避策は、できるかぎり#includeを使用し、古いEXEC SQL INCLUDE構文を併用しないことです。

6.2 新規のデータ型

次の表に、Pro*C/C++リリース8.0.3とリリース8.1.6の間に導入された新機能に判明している制限事項と不具合を示します。

Oracle8の新規C型 埋込みSQLでのPro*C/C++
サポート
バルク操作に対するPro*C/C++での
サポート*1
埋込みPL/SQLでのPro*C/C++の
サポート*2
OCINumber
あり
なし
あり
OCIString
  あり *3
なし
なし
OCIRaw
あり
なし
あり
OCIDate
あり
なし
なし
OCIRef *4
あり
あり
なし
OCIBlobLocator
あり
あり
あり
OCIClobLocator
  あり *5
  あり *5
  あり *5
ユーザー定義型 *6
あり
あり
    あり *7、*8
Nested Tables
あり
あり
あり
VARRAYS
あり
あり
あり

*1) この列は、所定のホスト型の配列であるバインド変数を使用した、複数行(バルク)の埋込みSQL操作に対するPro*C/C++のサポートを示します。

*2) 新規のC型の配列は、Pro*C/C++に埋め込まれたPL/SQLブロックではサポートされません。

*3) OCIString型のホスト変数は、ユーザー定義型内でのみサポートされます。オブジェクト型の文字属性がOTTによりC構造体のOCIStringフィールドにマップされる場合、Pro*C/C++ではオブジェクト全体を操作する操作にのみ使用できます。
現在、この種のOCIStringフィールドをスタンドアロンのバインド変数(リレーショナル表の列へのバインドなど)として個別に使用することはサポートされません。

*4) OCIRefホスト変数(Oracle8データベースでのREFを表す)は、埋込みSQL内とSQLCHECK=SYNTAXを指定したPro*C/C++モードでサポートされます。
ただし、埋込みPL/SQLブロック内、またはPro*C/C++コマンドライン・オプションSQLCHECK=FULL(または等価のSEMANTICS)では、OCIRef変数を使用できません。

回避策は、OCIRef変数を含むPro*C/C++プログラム・モジュールには、常にSQLCHECK=SYNTAXを使用することです。そのためには、Pro*C/C++アプリケーション・プログラムを複数の.pcファイルにモジュール化することが必要になる場合があります。これにより、OCIRef変数を伴う.pcファイルには、埋込みPL/SQLブロック(SQLCHECK=FULLオプションを使用したプリコンパイルが必要)は含まれなくなります。

*5) リリース8.1.6では各国語キャラクタのLOBも、オブジェクト型の属性の場合を除いてサポートされます。

*6) ユーザー定義名を持つデータ型は、Oracleの動的SQLメソッド4ではサポートされません。新規のANSI動的SQLインタフェースを使用してサポートされます。

*7) 表の別名に対するVALUE()関数を使用して型付きの表からADTインスタンス全体を選択する操作は、埋込みPL/SQL、またはPro*C/C++コマンドライン・オプションSQLCHECK=FULL(またはSEMANTICS)ではサポートされません。

*8) LOB型のADT属性は、埋込みPL/SQL内では操作できません。回避策は、OCIルーチンまたは埋込みSQL LOBインタフェースを使用して、ADTに埋め込まれたLOB属性を操作することです。

6.3 型を評価する操作

Pro*C/C++では、EXEC SQL TYPEディレクティブに型の名前として使用されているマクロは拡張されません。たとえば、どのバージョンのPro*C/C++でも、次のディレクティブはサポートされません。

     #define text char
     EXEC SQL TYPE text IS STRING(..);

textマクロは拡張されていません。このPro*C/C++の注意事項はマニュアルにも記載されています。ここで言及するのは、以前のOracleリリースでは、textという単語が前述のEXEC SQL TYPE文の動作を可能にするCのtypedefを使用して定義されていたためです。

Oracleバンドル・リリースでtextの定義がtypedefからマクロに変更された場合、前述のようなSQLディレクティブはプリコンパイルできなくなります。

7 『Pro*C/C++ Precompilerプログラマーズ・ガイド』の補足事項

  1. SQLNumberPrecV6( )でsqlprct( )が置き換えられています。

  2. SQLNumberPrecV7( )でsqlpr2t( )が置き換えられています。

  3. 接続プール・オプション(Bug#2436580およびBug#2454956)

7.1 オプション 有効な値 デフォルト値

    CMAX 1-65535 100
    CMIN 1-( CMAX-CINCR ) 2
    CINCR 1-( CMAX-CMIN ) 1

7.1.1 第8章「ホスト配列」、トピック「NULLのフェッチ」の訂正

配列のSELECTおよびFETCHの実行時には、常にインジケータ配列が使用されます。これにより、関連する出力ホスト配列にNULLがあるかどうかをテストできます。DBMS=V7またはDBMS=v8の場合は、インジケータ配列に関連付けられていないホスト配列にNULLの列値をSELECTまたはFETCHすると、Oracleは処理を停止し、sqlerrd[ 2]が処理済の行数に設定されてエラー・メッセージが発行されます。また、SELECTまたはFETCHを実行した場合にNULLが使用されていることが原因でORA-24347などの警告が戻される場合、およびどの列にもインジケータ配列がない場合、Oracleは処理を停止します。

7.1.2 第16章「ラージ・オブジェクト」、トピック「LOB文」の訂正

(ファイルからのロード)

amountパラメータは、最大ロード量を示します。指定した量がロードされる前にソースBFILEの終わりに達すると、操作は終了してエラーORA-22993が戻されます。

8 その他の問題

8.1 オブジェクト・ナビゲーションのサポート

アプリケーション・プログラマにとっての代替案として、Pro*C/C++でデータベースに接続した後に、Pro*C/C++プログラム内で、またはPro*C/C++プログラムとともにナビゲーショナル(ORI)ルーチンを使用する方法もあります。前述の第1項に説明されているように、特定のデータベース接続に使用するリリース8.1のOCI環境ハンドルとサービス・コンテキスト・ハンドルは、SQLLIBに用意されている新規のライブラリ関数を使用して取得できます。

8.2 埋込みSQLでの複数行のバルク(配列)操作

オブジェクト(ADT)に対する複数行の配列操作では、ホスト変数の配列を入力と出力の両方についてOTTで生成されるC構造体のポインタにする必要があります。

同様に、REF変数(CのOCIRef型)とLOBロケータ(CのOCIBlobLocator型、OCIClobLocator型)に対する複数行の配列操作では、ホスト配列が適切なCの型のポインタである必要があります。たとえば、Pro*C/C++プログラムでは、この種の配列の有効な宣言は次のようになります。

     OCIRef *ref_array[..];
     OCIBlobLocator *blob_array[..];
     OCIClobLocator *clob_array[..];

8.3 PARSEコマンドライン・オプションとその値

PARSEオプションのデフォルト値は、Pro*C/C++でプログラム全体を完全に前処理して解析できるようにFULLに設定されます。この設定が特に必要となるのは、Oracle 8.1.6で提供されるオブジェクト機能を使用する場合です。

8.4 Pro*C/C++構成ファイル

Pro*C/C++構成ファイルprecomp/admin/pcscfg.cfgは、$ORACLE_HOMEの適切なパスで更新する必要があります。たとえば、次のpcscfg.cfgファイルでは、文字列/vobsを$ORACLE_HOMEの値の実際のパスで変更します。構成ファイルに使用できるのは、環境変数が許可されないことを意味する絶対パスまたは相対パスのみであることに注意してください。

    sys_include=(/usr/include)
    include=(/vobs/precomp/public)
    include=/vobs/precomp/hdrs
    include=/vobs/tpcc2x_2/src
    include=/vobs/precomp/include
    include=/vobs/oracore/include
    include=/vobs/oracore/public
    include=/vobs/rdbms/include
    include=/vobs/rdbms/public
    include=/vobs/rdbms/demo
    include=/vobs/nlsrtl/include
    include=/vobs/nlsrtl/public
    include=/vobs/network_src/include
    include=/vobs/network_src/public
    include=/vobs/network/include
    include=/vobs/network/public
    include=/vobs/plsql/public
    ltype=short

LTYPE=SHORTオプション値を設定すると、.lisファイルの生成には、プログラム全体がリストされる公開形式ではなく詳細形式が使用されます。