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

前
次

方法4の使用方法

この項では、動的SQL方法4の概要を説明します。Oracle動的SQL方法4は、オブジェクト型、結果セット、構造体の配列およびLOBをサポートしていません。

ANSI SQLでは、すべてのデータ型がサポートされます。すべての新しいアプリケーションでは、ANSI SQLを使用してください。

方法3を使用したプログラムでも処理できない種類の動的SQL文があります。選択リストの項目数または入力ホスト変数のプレースホルダの数が実行時までわからない場合は、プログラムで記述子を使用する必要があります。記述子とは、プログラムおよびOracleが動的SQL文内の変数の完全な記述を保存するためのメモリー領域です。

複数行の問合せのときに、宣言済の出力ホスト変数のリスト内に列の値をFETCH INTOしたことを思い出してください。この選択リストがわからないときは、プリコンパイル時にINTO句でホスト変数リストを作成できません。たとえば、次の問合せでは2つの列値が戻されます。

SELECT ename, empno FROM emp WHERE deptno = :dept_number; 

ただし、この選択リストをユーザーに定義させると、その問合せによって戻される列の数はわからなくなります。

SQLDAの必要性

このような種類の動的問合せを処理するには、プログラムでDESCRIBE SELECT LISTコマンドを発行するとともに、SQL記述子領域(SQLDA)というデータ構造体を宣言する必要があります。この構造体は問合せ選択リストの列の記述を保持しているため、選択記述子とも呼ばれます。

また、動的SQL文で入力ホスト変数のプレースホルダの数が明確でない場合、プリコンパイル時にUSING句でホスト変数リストを作成できません。

このような動的SQL文を処理するには、プログラムでDESCRIBE BIND VARIABLESコマンドを発行し、入力ホスト変数のプレースホルダの説明を保存するために、バインド記述子という別の種類のSQLDAを宣言する必要があります。(入力ホスト変数はバインド変数とも呼ばれます。)

プログラムにアクティブSQL文が複数ある(たとえば、複数のカーソルをOPENしている)場合、それぞれの文には専用のSQLDAが必要になります。ただし、非並行のカーソルではSQLDAを再利用できます。なお、1つのプログラム内のSQLDAの数に制限はありません。

DESCRIBE文

DESCRIBEは、選択リスト項目または入力ホスト変数の記述を保持するために記述子を初期化します。

選択記述子を指定すると、DESCRIBE SELECT LIST文によってPREPAREされた動的問合せ内の各選択リスト項目が調べられ、その名前、データ型、制約、長さ、位取りおよび精度が確認されます。その後、この情報は選択記述子に格納されます。

バインド記述子を指定すると、DESCRIBE BIND VARIABLES文によってPREPAREされた動的SQL文の各プレースホルダが調べられ、その名前および長さ、関連付けられた入力ホスト変数のデータ型が確認されます。続いて、この情報がそのバインド記述子に格納されます。たとえば、プレースホルダ名を使用して、ユーザーに入力ホスト変数の値の入力を要求できます。

SQLDA

SQLDAはホスト・プログラムのデータ構造体です。この構造体は選択リスト項目または入力ホスト変数の記述を保持します。

SQLDA変数は、宣言部で定義されません

選択SQLDAには問合せ選択リストに関する次の情報が格納されています。

  • DESCRIBEできる列の最大数

  • DESCRIBEによって検出された列の実際の数

  • 列値を格納するバッファのアドレス

  • 列値の長さ

  • 列値のデータ型

  • 標識変数の値のアドレス

  • 列名を格納するバッファのアドレス

  • 列名を格納するバッファのサイズ

  • 列名の現行の長さ

バインドSQLDAには、SQL文の入力ホスト変数に関する次の情報が格納されています。

  • DESCRIBEできるプレースホルダの最大数

  • 実際にDESCRIBEで検出されたプレースホルダの数

  • 入力ホスト変数のアドレス

  • 入力ホスト変数の長さ

  • 入力ホスト変数のデータ型

  • 標識変数のアドレス

  • プレースホルダ名を格納するバッファのアドレス

  • プレースホルダ名を格納するバッファのサイズ

  • プレースホルダ名の現在の長さ

  • 標識変数名を格納するバッファのアドレス

  • 標識変数名を格納するバッファのサイズ

  • 標識変数名の現行の長さ

    関連項目:

    SQLDA構造体と変数名については、Oracle動的SQL: 方法4を参照してください。

Oracle方法4の実装について

Oracle方法4では、一般に次の順序で埋込みSQL文を使用します。

EXEC SQL PREPARE statement_name 
    FROM { :host_string | string_literal }; 
EXEC SQL DECLARE cursor_name CURSOR FOR statement_name; 
EXEC SQL DESCRIBE BIND VARIABLES FOR statement_name 
    INTO bind_descriptor_name; 
EXEC SQL OPEN cursor_name 
    [USING DESCRIPTOR bind_descriptor_name]; 
EXEC SQL DESCRIBE [SELECT LIST FOR] statement_name 
    INTO select_descriptor_name; 
EXEC SQL FETCH cursor_name 
    USING DESCRIPTOR select_descriptor_name; 
EXEC SQL CLOSE cursor_name; 

ただし、選択記述子とバインド記述子が同時に動作する必要はありません。したがって、問合せ選択リストの列数が明確でも入力ホスト変数のプレースホルダの数が不明な場合は、方法4のOPEN文とともに次の方法3のFETCH文を使用できます。

EXEC SQL FETCH emp_cursor INTO host_variable_list; 

逆に、入力ホスト変数のプレースホルダの数は明確でも問合せ選択リストの列数が不明な場合は、方法4のFETCH文とともに次の方法3のOPEN文を

EXEC SQL OPEN cursor_name [USING host_variable_list]; 

使用できます。

方法4では、EXECUTEを非問合せにも使用できます。

制限事項

動的SQL方法4では、TABLE型のパラメータを使用して、ホスト配列をPL/SQLプロシージャにバインドすることはできません。