プライマリ・コンテンツに移動
Pro*C/C++プログラマーズ・ガイド
12c リリース1(12.1)
B71397-03
目次へ移動
目次
索引へ移動
索引

前
次

よくある質問

この項では、Pro*C/C++およびPro*C/C++に関連するOracleについての一般的な質問をいくつか示します。回答はこのマニュアルの他の部分に比べると簡単なものですが、該当項目の参照先がわかります。

VARCHARについて説明してください。

次の表は、VARCHARの簡単な説明を示しています。

VARCHAR 説明

VARCHAR2

データベースの列の一種で、可変長文字データが含まれています。列型として使用できるため、Oracleではこれを「内部データ型」と呼びます。

VARCHAR

Oracleの「外部データ型」(データ型コード9)です。このデータ型を使用するのは、動的SQL方法4またはデータ型同値化を使用する場合のみです。

VARCHAR[n]

varchar[n]

これはPro*C/C++プログラムでホスト変数として宣言できるPro*C/C++の疑似型です。実際には、Pro*C/C++では、2バイト長の要素と[n]バイトの文字配列からなる構造体として生成されます。

Pro*C/C++はOracle Call Interfaceのコールを生成しますか。

生成しません。Pro*C/C++ではデータ構造体とSQLLIBランタイム・ライブラリ・コールが生成されます。

Pro*C/C++を使用せず、SQLLIBコールを使用してコーディングできますか。

SQLLIBはドキュメントが外部公開されておらず、サポートされておらず、さらにリリースごとに変更される可能性があります。一方、Pro*C/C++はANSI/ISOに準拠した製品であり、埋込みSQLの標準要件に従っています。

SQLLIBはAPIではありません。ユーザーがコール可能な関数も含まれていますが、主として言語のプリコンパイラ・パッケージ用のランタイム・ライブラリです。

データベース用のAPIコーディングが必要な場合は、Oracle Call InterfaceまたはOracle RDBMS用のクライアント側APIを使用するか、OCIとPro*C/C++を併用してください。

OCIリリース8のSQLLIB拡張相互運用性を参照してください。

PL/SQLのストアド・プロシージャをPro*C/C++プログラムからコールできますか。

できます。埋込みPL/SQLを参照してください。ストアドPL/SQLまたはJavaサブプログラムのコールについてに、デモ・プログラムがあります。

C++のコードを作成し、Pro*C/C++を使用してプリコンパイルできますか。

はい。C++アプリケーションを参照してください。

SQL文の任意の場所でバインド変数を使用できますか。

たとえば、実行時にSQL文に表の名前を入力できるようにするとします。しかし、ホスト変数を使用すると、プリコンパイラのエラーが発生します。

通常、SQL文またはPL/SQL文中の式を使用できるところであれば、任意の位置にホスト変数を使用できます。ホスト変数の参照を参照してください。

ただし、次のSQL文は無効です(table_nameはホスト変数です)。

EXEC SQL SELECT ename,sal INTO :name, :salary FROM :table_name;

問題を解決するには、動的SQLを使用する必要があります。Oracle動的SQLを参照してください。これを実行するために応用できるデモ・プログラムとしてサンプル・プログラム: 動的SQL方法1があります。

Pro*C/C++の文字処理がよくわかりません。

多数のオプションがありますが、簡単に説明します。第1に、従来のプリコンパイラおよびOracle7との互換性が必要な場合は、VARCHAR[n]ホスト変数を使用するのが最も安全な方法です。VARCHAR変数の宣言を参照してください。

Pro*C/C++では、他のすべての文字変数のデフォルト・データ型はCHARZです。CHARZを参照してください。つまり、入力時には文字列をヌル文字で終了する必要があります。出力時には空白文字で埋められ、ヌル文字で終了されます。

リリース8.0では、文字変数のデフォルト・マッピングを指定できるように、CHAR_MAPプリコンパイラ・オプションが追加されています。CHAR_MAPプリコンパイラ・オプションを参照してください。

アプリケーションでVARCHARもCHARZも不適切であり、全面的にC言語と同様の(ヌル文字で終了するが空白文字で埋められない)動作が必要な場合は、TYPEコマンドとC言語のtypedef文を使用し、データ型の同値化を使用して文字ホスト変数を文字列に変換してください。ユーザー定義型同値化を参照してください。TYPEコマンドの使用方法を示すサンプル・プログラムについては、サンプル・プログラム: sqlvcp()の使用を参照してください。

文字ポインタについて何か特別なことはありますか。

はい。Pro*C/C++では、入力ホスト変数または出力ホスト変数をバインドするときに、その長さを認識する必要があります。VARCHAR[n]を使用するか、char[n]型のホスト変数を宣言すると、Pro*C/C++では宣言から長さが認識されます。ただし、プログラム内で文字ポインタをホスト変数として使用し、malloc()を使用してバッファを定義すると、Pro*C/C++では長さが認識されません。

出力時には、バッファを割り当てるだけでなく、ヌル文字でない文字を埋め込んでからヌル文字で終了する必要があります。入力時または出力時、Pro*C/C++は長さを取得するために、バッファについてstrlen()をコールします。ポインタ変数を参照してください。

Pro*C/C++でSPOOLが動作しない理由を説明してください。

SPOOLはSQL*Plusで使用される特殊なコマンドです。埋込みSQLコマンドではありません。埋込みSQLプログラミングの基本概念を参照してください。

サンプル・プログラムのオンライン版はどこにありますか。

Oracleのインストール時には、demoディレクトリが作成されます。このディレクトリがないか、あってもサンプル・プログラムが含まれていない場合は、システム管理者またはデータベース管理者に連絡してください。

アプリケーションをコンパイルしてリンクする方法を教えてください。

コンパイルとリンクの方法は、プラットフォームごとに異なります。Pro*C/C++アプリケーションをリンクする方法については、システム固有のOracleマニュアルを参照してください。UNIXシステムでは、demoディレクトリにdemo_proc.mkというMakeファイルがあります。たとえば、デモ・プログラムsample1.pcをリンクするには、次のコマンドラインを入力します。

make -f demo_proc.mk sample1

特殊なプリコンパイラ・オプションを使用する必要がある場合は、Pro*C/C++を別に実行してからmakeを実行します。または、独自のカスタムMakeファイルを作成することもできます。たとえば、プログラムに埋込みPL/SQLコードが含まれている場合は、次のように入力します。

proc cv_demo userid=username/password sqlcheck=semantics
make -f demo_proc.mk build OBJS=sample1.o EXE=sample1

VMSシステムには、Pro*C/C++アプリケーションをリンクできるように、LNPROCというスクリプトが用意されています。

Pro*C/C++では構造体をホスト変数として使用できますか。

配列インタフェースとともに使用した場合の動作について教えてください。

1つの構造体の内部で複数の配列を使用できます。また、構造体の配列を配列インタフェースとともに使用できます。ホスト構造体およびポインタ変数を参照してください。

再帰関数内で埋込みSQLを使用した場合、その再帰関数をPro*C/C++で使用できますか。

はい。ただし、埋込みSQLの場合はカーソル変数を使用する必要があります。

Pro*C/C++のすべてのリリースを、Oracleサーバーのすべてのバージョンで使用できますか。

データベース・サーバーに対してプリコンパイラまたはOCIアプリケーションを実行する場合、Oracleでは、クライアント・ソフトウェア・リリース以降のリリースのデータベース・サーバー・ソフトウェアを使用することをお勧めしますが、この構成が厳密に必要なわけではありません。たとえば、Oracle Databaseクライアント・ソフトウェアがリリース8.1.7である場合、サーバーに対してクライアント上でプリコンパイラ・アプリケーションを実行するには、リリース8.1.7以降のOracle Databaseサーバー・ソフトウェアを使用することをお薦めします。

アプリケーションのアップグレードの詳細は、『Oracle Databaseアップグレード・ガイド』を参照してください。

アプリケーションを実行すると、必ずORA-01405エラー(フェッチした列の値がNULLです)が発生します。

標識変数が結合されていないホスト変数にNULLを入れています。これはANSI/ISO規格に準拠していないため、Oracle7からは変更されました。

可能であれば、標識変数を使用してプログラムを書きなおし、今後の開発にはインジケータを使用します。標識変数については、標識変数を参照してください。

または、MODE=ORACLEとDBMS=V7またはV8を指定してプリコンパイルしている場合は、コマンドラインでUNSAFE_NULL=YESを指定し、ORA-01405メッセージを無効にしてください(詳細はUNSAFE_NULLを参照)。

すべてのSQLLIB関数はプライベート関数ですか。

いいえ。各自のプログラムまたはそのデータに関する情報を取得するためにコールできるSQLLIB関数がいくつかあります。SQLLIBパブリック関数は、次のとおりです。

SQLLIBパブリック関数 説明

SQLSQLDAAlloc()

動的SQL方法4でSQL記述配列(SQLDA)を割り当てるために使用します。SQLDAの参照方法を参照してください。

SQLCDAFromResultSetCursor()

Pro*C/C++のカーソル変数をOCIカーソル・データ領域に変換するために使用します。SQLLIBパブリック関数の新しい名前を参照してください。

SQLSQLDAFree()

SQLSQLDAAlloc() を使用して割り当てたSQLDAを解放するために使用します。SQLLIBパブリック関数の新しい名前を参照してください。

SQLCDAToResultSetCursor()

OCIのカーソル・データ領域をPro*C/C++のカーソル変数に変換するために使用します。SQLLIBパブリック関数の新しい名前を参照してください。

SQLErrorGetText()

長いエラー・メッセージを戻します。sqlerrmを参照してください。

SQLStmtGetText()

最後に実行されたSQL文のテキストを戻すために使用します。SQL文のテキスト取得についてを参照してください。

SQLLDAGetNamed()

Pro*C/C++プログラムでOCIコールを使用するときに、指定された接続に有効なログイン・データ領域を取得するために使用します。SQLLIBパブリック関数の新しい名前を参照してください。

SQLLDAGetCurrent()

Pro*C/C++プログラムでOCIコールを使用するときに、最後の接続に有効なログイン・データ領域を取得するために使用します。SQLLIBパブリック関数の新しい名前を参照してください。

SQLColumnNullCheck()

動的SQL方法4のNULL状態の表示を戻します。NULL/Not NULLデータ型の処理を参照してください。

SQLNumberPrecV6()

数値の精度と位取りを戻します。精度と位取りの抽出を参照してください。

SQLNumberPrecV7()

SQLNumberPrecV6()の変形です。精度と位取りの抽出を参照してください。

SQLVarcharGetLength()

VARCHAR[n]の埋め込んだサイズを取得するために使用します。VARCHAR配列コンポーネントの長さを調べる方法を参照してください。

SQLEnvGet()

特定のSQLLIBランタイム・コンテキストのOCI環境ハンドルを戻します。SQLEnvGet()を参照してください。

SQLSvcCtxGet()

データベース接続のOCIサービス・コンテキストを戻します。SQLSvcCtxGet()を参照してください。

SQLRowidGet()

最後に挿入された行のユニバーサルROWIDを戻します。SQLRowidGet()を参照してください。

SQLExtProcError()

外部Cプロシージャでエラーが発生した場合に、PL/SQLに制御を戻します。SQLExtProcError()を参照してください。

このリストの関数は、スレッド・セーフなSQLLIBパブリック関数です。すべての新規アプリケーションで、これらの関数を使用します。これらのスレッド・セーフなパブリック関数(およびその旧称)の詳細は、表5-4を参照してください。

新しいオブジェクト型はOracleでどのようにサポートされていますか。

Pro*C/C++アプリケーションでのオブジェクト型の使用方法は、オブジェクトおよびObject Type Translator (OTT)を参照してください。

互換性、アップグレードおよび移行

Pro*C/C++では、OCIベースのアプリケーションと同様の互換性規則を採用します。この場合、下位互換性に対するOCIの制限と同じ制限が適用されます。

追加の配列のINSERTおよびSELECT構文は、DB2プリコンパイラ・アプリケーションのPro*C/C++アプリケーションへの移行に役立ちます。これは、DB2の配列のINSERTおよびSELECT構文をOracle Pro*C/C++の構文に変更する必要がないためです。

Pro*C/C++でサポートされている「暗黙的バッファ挿入」機能は、パフォーマンス向上のためにPro*C/C++の配列構文を使用せずに、DB2プリコンパイラ・アプリケーションをPro*C/C++アプリケーションに移行する場合に役立ちます。