前へカーソル 動的 SQL次へ

第 5 章: データ構造体

すべての Server Express SQL プリプロセッサでは、SQL 通信領域 (SQLCA)、および SQL 記述領域 (SQLDA) というデータ構造体が使用されています。

5.1 SQL 通信領域

それぞれの埋め込み SQL 文が実行された後に、エラーやステータスの情報が SQL 通信領域 (SQLCA) に返されます。

SQLCA データ構造体の内容を以下に示します。

01 SQLCA. 
  03 SQLCAID     PIC X(8) VALUE "SQLCA".
  03 SQLCABC     PIC S9(9) COMP-5 VALUE 136.
  03 SQLCODE     PIC S9(9) COMP-5 VALUE 0.
  03 SQLERRM.
    49 SQLERRML  PIC S9(4) COMP-5.
    49 SQLERRMC  PIC X(70).
  03 SQLERRP     PIC X(8).
  03 SQLERRD     PIC S9(9) COMP-5 OCCURS 6 VALUE 0.
  03 SQLWARN.
    05 SQLWARN0  PIC X.
    05 SQLWARN1  PIC X.
    05 SQLWARN2  PIC X.
    05 SQLWARN3  PIC X.
    05 SQLWARN4  PIC X.
    05 SQLWARN5  PIC X.
    05 SQLWARN6  PIC X.
    05 SQLWARN7  PIC X.
  03 FILLER      PIC X(3).
  03 SQLSTATE    PIC X(5).

Oracle、Sybase、および Informix では、SQLCA のバージョンがそれぞれ異なっています。上記の SQLCA は、OpenESQL および DB2 ECM のものです。Oracle、Sybase、および Informix の SQLCA にはどれも、SQLCODE、SQLERRML、SQLERRMC、および SQLWARN フィールドが存在します。フィールドのサイズや位置は、プリコンパイラの種類によって異なる可能性があります。

次の表では、SQLCA データ構造体の内容について説明されます。

フィールド
内容
SQLCAID
SQLCA という文字列。
SQLCABC
SQLCA データ構造体の長さ。
SQLCODE
直前に実行された SQL 文のステータスコード。
SQLERRML
SQLERRMC のエラーメッセージの長さ (0 から 70 バイトまで)。
SQLERRMC
エラーメッセージのテキスト。70 バイト以上の長さのエラーメッセージは、切り捨てられます。
SQLERRP
システムにより予約されています (診断情報)。
SQLERRD
ステータスコードを表わす、整数値の要素を 6 個持つ配列 (下記にリストされていないものは、システムにより予約されています)。
SQLERRD(1) データベースから返される、ネイティブなエラーコード。
SQLERRD(2) データベースから返される、エラーの重大度。重大度のレベルは、データベースシステムによって異なります。
SQLERRD(3) 影響を受ける行の数。
SQLWARN:
8 個の警告フラグがあり、それぞれ空白、または W が含まれる (下記にリストされていないものは、システムにより予約されています)。SQLCODE の値が +1 のときは、警告フラグがセットされます。
SQLWARN0
すべての警告フィールドの一覧です。空白は警告が存在しないことを表します。
SQLWARN1
W の場合は、文字型のホスト変数に出力されたデータが切り捨てられたことを示します。
SQLWARN2
W の場合は、NULL 値がありながらインジケータ変数が与えられていないことを示します。
SQLWARN3
W の場合は、ホスト変数の数より列の数が少ないこと、または与えられたホスト変数の数と文中のパラメータマーカの数とが一致しないことを示します。その場合、どちらか小さい方の数が使用されることになります。
SQLWARN4
W の場合は、単集合 SELECT で 2 個以上の行が返されることを示します (最初の行だけが返されます)。
FILLER
システムにより予約されています。
SQLSTATE
直前に実行された SQL 文のステータスインジケータ。

SQLCA には 2 つの変数 (sqlcodesqlstate)、および直前に実行された SQL 文でエラーが発生したかどうかを示す多くの警告フラグがあります。

COBSQL
COBSQLの場合の SQLSTATE は、独立したデータ項目です。現在サポートされているバージョンの Oracle や Sybase のシステムを考慮すれば、SQLSTATE 変数より SQLCA を使用するべきです。将来的には、データベースとクライアントアプリケーションとの間でデータを渡す方法として、SQLCA より SQLSTATE 変数の使用が好まれるようになると思われますが、現在のところは SQLCA を使用するようにしてください。

5.1.1 SQLCODE 変数

sqlcode の値をテストすることが、埋め込み SQL 文の実行が成功したか、あるいは失敗したかを判断する、もっとも一般的な方法です。sqlcode の値として可能性があるのは次のとおりです。are:


意味
0 文はエラーなしに実行されました。
1 文は実行されましたが、警告が生成されました。sqlwarn フラグの値をチェックしてエラーの種類を特定します。
100 クエリーに一致するデータが見つかりませんでした。または、結果セットの終端に達しています。1 行も処理されませんでした。
< 0 (負の値) アプリケーション、データベース、システム、あるいはネットワークにおけるエラーが原因で、文は実行されませんでした。

OpenESQL
OpenESQL を使用している場合は、次のように SQLCODE のエラーコードが定義されます。

SQLCODE
メッセージ
意味
-1
Autoconnect failure
SQL(INIT) が使用されましたが、自動 CONNECT に失敗しました。SQL(INIT) を使用しているプログラムは、起動と同時に SQLCODE をチェックする必要があります。
<19000
ODBC ドライバ、またはデータベース固有のエラーメッセージです。SQLERRMC の内容をチェックして、何が発生したのか確認する必要があります。
Or
Unable to retrieve ODBC error
ODBC のエラーが発生しましたが、詳細は不明です。通常は、深刻なメモリ不足というような、実行環境における重大な問題の存在を示しています。
-19085
Invalid ODBC catalog query
QUERY ODBC 文へのパラメータが不正な場合に発生します。
-19101
Statement too long

-19199
ESQL Keyword(s) detected in PREPARE/EXECUTE IMMEDIATE statement

-19313
Too few host variables

-19413
Data overflow occurred during decimal data conversion

-19425
NULL value returned but no indicator variable supplied

-19501
No cursor declared

-19514
Cursor is not prepared

-19701 NULL connection name
or
Connection name not found
上記 2 つのエラー (-19701 および -19702) は、プログラムが存在しない接続を参照しようとした時に発生します。もっとも可能性の高い原因としては、CONNECT が正常に実行される前や、またはすべての接続を切断した後で、埋め込み SQL 文を実行しようとしたことが考えられます。
-19702 Connection name not found
or
Attempt to close non-existent connection
-19703
Could not make connection.

-19707
Duplicate connection name.

-19822
Improperly initialized User SQLDA

-19957
Statement text not found or empty

-20000
Unimplemented embedded SQL feature
COBOL コンパイラでは、OpenESQL ランタイムモジュールによってまだサポートされていない埋め込み SQL 構文の使用が可能な場合があります。そのような文が実行されると、このエラーが結果として発生します。

COBSQL および DB2
COBSQL と DB2 の場合には、上記以外の正の値が返される可能性があります。それは、SQL 文は正常に実行されましたが、警告メッセージがあるという意味です。

COBSQL

5.1.2 SQLSTATE 変数

SQLSTATE 変数は SQL-92 標準規格として導入されたもので、将来のアプリケーションで使用が推奨されるメカニズムです。これは、2 つの構成要素に分けられます。

00000 という値は、直前の埋め込み SQL 文が正常に実行されたことを示しています。

Oracle、Sybase、または Informix で固有に使用されている、SQLSTATE に返される値の詳細に関しては、 それぞれの『データベースエラーメッセージ』マニュアルを参照してください。

SQLSTATE の値について詳細を以下に示します。

SQLSTATE
エラー
01000
一般的な警告
01002
接続解除エラー
01004
データの一部が切り捨てられました
01006
権限が無効化されていません
01S00
接続文字列属性が無効です
01S01
行にエラーが含まれています
01S02
オプション値が変更されました
01S03
更新または削除された行はありません
01S04
複数の行が更新または削除されました
01S05
取り消しは SQL_CLOSE オプションを指定した SQLFreeStmt として処理されました
01S06
結果集合から最初の行セットが戻る前にデータを取り込もうとしました


07001
パラメータ数が正しくありません
07006
制約付きデータ型属性違反です
07S01
使用するデフォルトパラメータが無効です


08001
データソースに接続できません
08002
接続が使用中です
08003
接続が閉じています
08004
データソースによって接続が拒否されました
08007
トランザクション処理中に接続エラーが発生しました
08S01
通信リンクエラー


21S01
挿入値リストが列リストと合致しません
21S02
導出表の次数が列リストと合致しません


22001
文字列データの右端が切り捨てられました
22002
必要なインジケータ変数が記述されていません
22003
数値データが有効範囲を超えています
22005
代入エラー
22008
日時フィールドでオーバーフローが発生しました
22012
ゼロ除算エラー
22026
文字列データの長さが一致しません


23000
整合性制約違反です


24000
カーソル状態が無効です


25000
トランザクション状態が無効です


28000
権限指定が無効です


34000
カーソル名が無効です


37000
構文エラーまたはアクセス違反が検出されました


3C000
カーソル名が重複しています


42000
構文エラーまたはアクセス違反が検出されました


70100
操作が取り消されました


IM001
ドライバがサポートしない関数です
IM002
データソース名が見つからず、デフォルトドライバが指定されていません
IM003
指定されたドライバをロードできませんでした
IM004
ドライバの SQLAllocEnv でエラーが発生しました
IM005
ドライバの SQLAllocConnect でエラーが発生しました
IM006
ドライバの SQLSetConnect オプションでエラーが発生しました
IM007
データソースまたはドライバが指定されていません。ダイアログは許可されませんでした
IM008
ダイアログエラー
IM009
変換用の .DLL ファイルをロードできませんでした
IM010
データソース名が長すぎます
IM011
ドライバ名が長すぎます
IM012
DRIVER キーワードの構文エラー
IM013
トレースファイル エラー


S0001
実表またはビュー表はすでに存在します
S0002
実表が見つかりません
S0011
索引はすでに存在します
S0012
索引が見つかりません
S0021
列はすでに存在します
S0022
列が見つかりません
S0023
列のデフォルトがありません


S1000
一般エラー
S1001
メモリ割り当てエラー
S1002
列番号が無効です
S1003
プログラムタイプが有効範囲を超えています
S1004
SQL データ型が有効範囲を超えています
S1008
操作が取り消されました
S1009
引数の値が無効です
S1010
関数シーケンスエラー
S1011
今回の操作は無効です
S1012
指定されたトランザクション処理コードが無効です
S1015
カーソル名がありません
S1090
文字列またはバッファの長さが無効です
S1091
記述子のタイプが有効範囲を超えています
S1092
オプションのタイプが有効範囲を超えています
S1093
パラメータ番号が無効です
S1095
関数のタイプが有効範囲を超えています
S1096
情報のタイプが有効範囲を超えています
S1097
列のタイプが有効範囲を超えています
S1098
範囲のタイプが有効範囲を超えています
S1099
NULLABLE タイプが有効範囲を超えています
S1100
UNIQUE オプションのタイプが有効範囲を超えています
S1101
精度オプションのタイプが有効範囲を超えています
S1103
方向オプションが有効範囲を超えています
S1105
パラメータのタイプが無効です
S1106
取り込みタイプが有効範囲を超えています
S1107
行の値が有効範囲を超えています
S1108
並行オプションが有効範囲を超えています
S1109
カーソルの位置が無効です
S1110
ドライバの完了方法が無効です
S1111
ブックマーク値が無効です
S1C00
無効なドライバです
S1T00
タイムアウトになりました

DB2
DB2 Universal Database では、 SQL-92 標準規格に対応した SQLSTATE 値が返されます。ただし、DB2 バージョン 2.1 では、このような SQL STATE 値は返されません。

5.1.3 警告フラグ

文によっては、実行によって警告が生成される場合があります。警告の種類を特定するためには、アプリケーションは SQLWARN フラグの内容を調べる必要があります。

それぞれのフラグには、次のいずれかの値が返されます。

それぞれの SQLWARN フラグには固有の意味があります。SQLWARN フラグの詳しい意味に関しては、『SQL 通信領域』を参照してください。

5.1.4 WHENEVER 文

埋め込み SQL の各文の実行後に SQLCODE、または SQLSTATE の値を明確にチェックするには、多くのコードを書く必要があります。その代わりに、アプリケーションでは WHENEVER 文によって SQL 文のステータスをチェックできます。

WHENEVER 文は実際に実行される文ではありません。WHENEVER 文はコンパイラに与える指令であり、それぞれの埋め込み SQL 文の実行後にエラー処理をするコードを自動的に生成するように指示するものです。

WHENEVER 文では、次に挙げる条件のそれぞれに対して、3 つのデフォルト動作 (CONTINUE、GOTO、または PERFORM) のいずれかを登録することができます。

条件 sqlcode の値
データなし (NOT FOUND) 100
警告 (SQLWARNING) +1
エラー (SQLERROR) < 0 (負の値)

ある特定の条件に対して WHENEVER 文を登録すると、以前に同じ条件に対して登録された WHENEVER 文の処理はすべて置換されます。

WHENEVER 文の適用範囲は、ソースプログラムの物理的な位置で決まります。プログラムの実行順序における論理的な位置ではありません。たとえば、次のコードでは、最初の SELECT 文が何も返さなかった場合は、段落 C でなく、段落 A が実行されます。

    EXEC SQL
       WHENEVER NOT FOUND PERFORM A
    END-EXEC.
    PERFORM B.
    EXEC SQL
       SELECT col1 into :host-var1 FROM table1 
         WHERE col2 = :host-var2
    END-EXEC.
 A.
    DISPLAY "First item not found".
 B.
    EXEC SQL
       WHENEVER NOT FOUND PERFORM C.
    END-EXEC.
 C.
    DISPLAY "Second item not found".

5.1.4.1 COBSQL

Oracle、Sybase、および Informix では、SQLWARN0 に W が設定されることにより、SQLWARNING 句が実行されます。

Oracle
SELECT あるいは FETCH 文によりデータが返されなかった場合は、Oracle プリコンパイラの MODE 指令の設定とは無関係に、NOT FOUND という条件が成立します。

Informix
Informix では、WHENEVER 文の中で STOP または CALL を実行することが許されています。これは ANSI 標準規格として追加されており、『Informix ESQL/COBOL programmers manual』の中で文書化されています。

5.1.5 SQLERRM

SQLERRM データ域は、データベースサーバからのエラーメッセージをアプリケーションへ渡すのに使用されています。SQLERRM データ域は次の 2 つの部分に分かれています。

エラー処理ルーチンの中で、次のようなコードを使用して SQL エラーメッセージを表示することができます。

IF (SQLERRML > ZERO) and (SQLERRML < 80)
   DISPLAY 'Error Message: ', SQLERRMC(1:SQLERRML)
ELSE
   DISPLAY 'Error Message: ', SQLERRMC
END-IF.

5.1.6 SQLERRD

SQLERRD データ域は、整数のステータス値である要素を 6 個持つ配列です。

5.1.6.1 COBSQL


Oracle、Sybase および Informix では、SQLERRD 配列に 6 個ある値のうち、つねに 1 つ (または、それ以上) はセットされる可能性があります。それは、直前に実行された SQL 文により影響される行の数を示すものです。たとえば、SQLERRD(3) には SELECT や 一連の FETCH 文で返された行の数が保存されています。

5.1.6.2 DB2

SQLCA の 3 番目の要素である SQLERRD、つまり SQLERRD(3) には、 INSERT、UPDATE、DELETE および SELECT INTO 文で処理された行の数が記録されています。FETCH 文の場合には、処理された行の累計が記録されます。

SQLERRD(3)
DB2 では、 SQLERRD(3) には次の内容が含まれます。

SQLERRD(4)
DB2 では、 SQLERRD(4) には次の内容が含まれます。

SQLERRD(5)
DB2 では、SQLERRD(5) には次の内容が含まれます。

5.2 SQL 記述領域 (SQLDA)

どのプリコンパイラもそれぞれ固有の SQLDA を持っています。Oracle、Sybase、OpenESQL、および DB2 で使用されている SQLDA は、それぞれ自身以外の SQLDA とは互換性がありません。

コンパイル時に渡すパラメータの数、またはデータ型が不明の場合には、ホスト変数の代わりに SQL 記述領域 (SQLDA) を使用することができます。

SQLDA には、それぞれの入力パラメータ、または出力される列に関する記述情報が含まれています。そこには、列名、データ型、データ長、および入力、または出力で実際に使用されるデータバッファへのポインタが含まれまています。SQLDA は通常、準備された SQL 文の入力値を指定するためのパラメータマーカとともに使用されますが、準備された SELECT 文からデータを受け取るために、DESCRIBE 文 (または、PREPARE 文の INTO オプション) とともに使用することも可能です。

SQLDA は静的 SQL 文で使用することができませんが、カーソルによる FETCH 文では使用可能です。

次の表では、SQLDA データ構造体の内容が説明されます。

フィールド
内容
SQLDAID
SQLDA というテキストです。
SQLDABC
SQLDA データ構造体の長さ (SQLN * 44 + 16) です。
SQLN
割り当てられた SQLVAR エントリの総数で、入力パラメータ、または出力される列数と等しい数になります。
SQLD
使用されている SQLVAR エントリの数です。
SQLVAR
SQLVAR はグループ項目です。実際の要素の数は、SQLD の値に依存します。
SQLTYPE
列、またはホスト変数のデータ型を表わす数であり、また NULL 値が許されているかどうかが示されます (有効な値については、下記の表を参照してください)。
SQLLEN
列から取り出された値の長さです。データが DECIMAL 型 (通貨型を含む) の場合は、SQLLEN は 2 つの部分に分けられます。最初のバイトは有効桁数、次のバイトは小数点以下の桁数を表わします。
SQLDATA
FETCH、OPEN、および EXECUTE の場合には、ホスト変数のアドレス (アプリケーションで設定する必要があります)。DESCRIBE および PREPARE では、 SQLDATA は使用されません。
SQLIND
FETCH、OPEN、および EXECUTE の場合には、存在していれば、関連付けられたインジケータ変数のアドレスになります。 列の値として NULL 値が許されない場合には、フィールドの値は未定義になります。NULL 値が許されていれば、データの値が NULL の場合は -1、NULL でない場合は 0 がそれぞれ設定されます。DESCRIBE および PREPARE では、SQLIND は使用されません。
SQLNAME
列の名前、長さを含むグループ項目です (FETCH、OPEN、または EXECUTE では使用されません)。
SQLNAMEL
列名の長さです。
SQLNAMEC
列名です。導出列の場合は、このフィールドには、導出列の選択されたリストでの元の位置を表わす ASCII 数字のリテラル値が含まれます。

5.2.1 COBSQL

Oracle、Sybase、および Informix では、プログラムで動的 SQL を使用する場合にのみ SQLDA が必要になります。

Oracle、Sybase、および Informix では、次の構文を使って SQLDA をプログラムにインクルードすることが許されていません。

EXEC SQL
   INCLUDE SQLDA
END-EXEC

Oracle、Sybase、および Informix では、SQLDA は標準的な COBOL の copyfile として定義される必要があります。

5.2.1.1 Oracle

Oracle では、動的 SQL で使用される特別な copyfile である ORACA が提供されています。これを使用すれば、次の構文を使ってプログラムにインクルードすることができます。

EXEC SQL
   INCLUDE ORACA
END-EXEC

ORACA copyfile を使用する前に、Oracle プリコンパイラのオプションで ORACA=YES という指定をする必要があります。Oracle プリコンパイラのオプション設定に関しては、『Programmer's Guide to the Oracle Precompilers』を参照してください。

Oracle では、SQLDA が提供されていません。この件と ORACA copyfile について詳しい説明が必要な場合は、『Programmer's Guide to the Oracle Precompilers』 を参照してください。

5.2.1.2 Sybase

Sybase では、SQLDA copyfile は提供されていません。Sybase プリコンパイラのドキュメントでは、SQLDA のレイアウトやその中の様々な項目に値を割り当てる方法について説明されています。また、ドキュメントでは Sybase を使って COBOL と Sybase のデータ型の変換方法についても説明されています。

5.2.1.3 Informix

Informix では、SQLDA copyfile は提供されていません。Infomix プリコンパイラのドキュメントでは、Informix での動的 SQL の使用を可能にするために、必要なデータ項目のレイアウトを定義する方法について説明されています。

5.2.2 OpenESQL

SQLDA 構造体は、Server Express がインストールされた基本ディレクトリの中の source ディレクトリにあるファイル、sqlda.cpy で提供されています。DATA DIVISION に次のような文を追加することにより、ユーザは 自分の COBOL プログラムにインクルードできます。

EXEC SQL
   INCLUDE SQLDA
END-EXEC

以下に、SQLDA データ構造体を示します。

01 SQLDA sync.
  05 SQLDAID           PIC X(8) VALUE "SQLDA  ".
  05 SQLDABC           PIC S9(9) COMP-5 value 0.
  05 SQLN              PIC S9(4) COMP-5 value 0.
  05 SQLD              PIC S9(9) COMP-5 value 0.
  05 SQLVAR OCCURS 0 to 1489 TIMES DEPENDING ON SQLN.
    10 SQLTYPE         PIC S9(4) COMP-5.
    10 SQLLEN          PIC S9(4) COMP-5.
    10 SQLDATA         USAGE POINTER.
    10 SQLIND          USAGE POINTER.
    10 SQLNAME.
      15 SQLNAMEL      PIC S9(4) COMP-5.
      15 SQLNAMEC      PIC X(30).

5.2.3 SQLTYPE として有効な値

奇数番号のコード値は、その型が NULL 値をとることが許されていることを示しています。

下記の表について説明します。

(1) - この型は PREPARE INTO または DESCRIBE 文によって、COBOL プログラムに返されるようにすることができます。

(2) - この型は動的 SQL を使用してアプリケーションで設定することができます。

(3) - この型は COBOL ホスト変数によってサポートされます。

コード
データ型
SQL データ型
COBOL データ型
384/385 (2)
10 バイトの date 文字列型
date
PIC X(10)
386/387 (1)
日付型
date

388/389 (2)
8 バイトの 時間文字列型
time
PIC X(8)
390/391 (1)
時間型
time

392/393 (2)
26 バイトのタイムスタンプ文字列型
timestamp
PIC X(26)
394/395 (1)
タイムスタンプ
timestamp

404/405 (1)
大容量可変長バイナリ型
long varbinary
01 NAME
49 PIC LEN S9(9) COMP-5
49 PIC VAL X(n)
408/409 (1)
大容量可変長文字列型
long varchar
01 NAME
49 PIC LEN S9(9) COMP-5
49 PIC VAL X(n)
444/445 (1,2)
バイナリ型
binary
PIC X(n)
446/447 (1,2)
可変長バイナリ型
varbinary 01 NAME
49 PIC LEN S9(4) COMP-5
49 PIC VAL X(n)
448/449 (1,2,3)
可変長文字列型
varchar 01 NAME
49 PIC LEN S9(4) COMP-5
49 PIC VAL X(n)
452/453 (1,2,3)
固定長文字列型
char
PIC X(n)
480/481 (1,2,3)
8 バイト浮動小数点数型
float or double
COMP-2
482/483 (1,2)
4 バイト浮動小数点数型
real
COMP-1
484/485 (1,2,3)
真数型 (Decimal)
decimal, numeric または bigint
PIC 9(n)V9(m)
COMP-3
496/497 (1,2,3)
4 バイト整数型
integer
PIC S9(9) COMP-5
500/501 (1,2,3)
2 バイト整数型
smallint
PIC S9(4) COMP-5
502/503 (1,2)
1 バイト整数型
tinyint
PIC S9(4) COMP-5

5.2.4 SQLDA の使用

SQLDA 構造体を使用する前に、アプリケーションは次のフィールドを初期化する必要があります。

SQLN このフィールドは、構造体によって保持可能な SQLVAR エントリの最大数に設定されている必要があります。
SQLDABC SQLDA の最大サイズです。この値は、 SQLN * 44 + 16 という式で計算できます。

5.2.4.1 PREPARE および DESCRIBE 文

DESCRIBE 文 (または、INTO オプションを付けた PREPARE 文) を使用して、列名、データ型、およびその他のデータを SQLDA 構造体の適切なフィールドに入力することができます。

文を実行する前に、前述のように、SQLN および SQLDABC フィールドが初期化されている必要があります。

文が実行された後、SQLD フィールドには準備された文で使用されたパラメータの数が含まれています。それぞれのパラメータごとに SQLTYPE と SQLLEN フィールドが設定され、SQLVAR レコードが使用可能な状態になります。

SQLN にどの位の大きさの値を設定すればよいかわからない場合には、SQLN に 1、SQLD に 0 を設定して DESCRIBE 文を実行します。詳細な列情報が SQLDA 構造体に入力されるわけではありませんが、結果セットの列の数が SQLD に挿入されます。

5.2.4.2 FETCH 文

SQLDA 構造体を使用して FETCH 文を実行する前に、次の手順に従ってください。

  1. 前述のように、アプリケーションは SQLN および SQLDABC を初期化しておく必要があります。

  2. 次に、アプリケーションは対応する列のデータを受け取るプログラム上の変数のアドレスを、SQLDATA フィールドに挿入します (SQLDATA フィールドは、SQLVAR の一部です)。

  3. 指示変数が使用されている場合には、SQLIND にも対応する指示変数のアドレスを設定しておく必要があります。

データ型フィールド (SQLTYPE) および データ長 (SQLLEN) は、PREPARE INTO または DESCRIBE 文からの情報を使って設定されます。これらの値は FETCH 文が実行される前に、アプリケーションによって上書きすることも可能です。

5.2.4.3 OPEN または EXECUTE 文

SQLDA 構造体を使用して OPEN または EXECUTE 文の入力データを指定するには、アプリケーションにより、各変数用に SQLN、SQLD、SQLDABC、SQLTYPE、SQLLEN、および SQLDATA を含む、SQLDA 構造のすべてのフィールドにデータが入力される必要があります。

SQLTYPE フィールドの値が奇数値の場合には、SQLIND にも指示変数のアドレスを設定する必要があります。

5.2.4.4 DESCRIBE 文

PREPARE 文の後に DESCRIBE 文を実行することにより、指定の準備された文で返されるそれぞれの列のデータ型、データ長、および列名に関する情報を取り出すことができます。この情報は SQL 記述領域 (SAQDA) の中に返されます。

EXEC SQL
   DESCRIBE stmt1 INTO :sqlda
END-EXEC

PREPARE 文のすぐ後で DESCRIBE 文を実行する場合は、PREPARE 文に INTO オプションを使用して 2 つの手順を一度に実行することが可能です。

EXEC SQL
   PREPARE stmt1 INTO :sqlda FROM :stmtbuf
END-EXEC


Copyright © 2002 Micro Focus International Limited. All rights reserved.
本書ならびに使用されている固有の商標と商品名は国際法で保護されています。

前へカーソル 動的 SQL次へ