![]() | カーソル | 動的 SQL | ![]() |
すべての Server Express SQL プリプロセッサでは、SQL 通信領域 (SQLCA)、および SQL 記述領域 (SQLDA) というデータ構造体が使用されています。
それぞれの埋め込み 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 つの変数 (sqlcode
と sqlstate
)、および直前に実行された SQL 文でエラーが発生したかどうかを示す多くの警告フラグがあります。
COBSQL
COBSQLの場合の SQLSTATE
は、独立したデータ項目です。現在サポートされているバージョンの Oracle や Sybase のシステムを考慮すれば、SQLSTATE 変数より SQLCA を使用するべきです。将来的には、データベースとクライアントアプリケーションとの間でデータを渡す方法として、SQLCA より SQLSTATE 変数の使用が好まれるようになると思われますが、現在のところは SQLCA を使用するようにしてください。
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
sqlwarn
フラグをチェックして警告の種類を確認してください。たとえば、Oracle、Sybase、および Infomix の場合には、データベースサーバがアプリケーションに警告を返す場合には必ず sqlwarn0
が設定されます。
SQLSTATE 変数は SQL-92 標準規格として導入されたもので、将来のアプリケーションで使用が推奨されるメカニズムです。これは、2 つの構成要素に分けられます。
class
コードと呼ばれます。どのclass
コードも、A から H までの文字で始まる SQLSTATE の値は、SQL 標準規格によって定義されたものであり、一方 0 から 4 までの数字で始まる SQLSTATE の値はそれ以外の標準規格によって定義されたものであることを示しています。subclass
コードと呼ばれています。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 値は返されません。
文によっては、実行によって警告が生成される場合があります。警告の種類を特定するためには、アプリケーションは SQLWARN フラグの内容を調べる必要があります。
それぞれのフラグには、次のいずれかの値が返されます。
それぞれの SQLWARN フラグには固有の意味があります。SQLWARN フラグの詳しい意味に関しては、『SQL 通信領域』を参照してください。
埋め込み 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".
Oracle、Sybase、および Informix では、SQLWARN0 に W が設定されることにより、SQLWARNING 句が実行されます。
Oracle
SELECT あるいは FETCH 文によりデータが返されなかった場合は、Oracle プリコンパイラの MODE 指令の設定とは無関係に、NOT FOUND という条件が成立します。
Informix
Informix では、WHENEVER 文の中で STOP または CALL を実行することが許されています。これは ANSI 標準規格として追加されており、『Informix ESQL/COBOL programmers manual』の中で文書化されています。
SQLERRM データ域は、データベースサーバからのエラーメッセージをアプリケーションへ渡すのに使用されています。SQLERRM データ域は次の 2 つの部分に分かれています。
SQLERRML にはエラーメッセージの長さが保持されています。
SQLERRMC にはエラーメッセージのテキストが保持されています。
エラー処理ルーチンの中で、次のようなコードを使用して SQL エラーメッセージを表示することができます。
IF (SQLERRML > ZERO) and (SQLERRML < 80) DISPLAY 'Error Message: ', SQLERRMC(1:SQLERRML) ELSE DISPLAY 'Error Message: ', SQLERRMC END-IF.
SQLERRD
データ域は、整数のステータス値である要素を 6 個持つ配列です。
Oracle、Sybase および Informix では、SQLERRD 配列に 6 個ある値のうち、つねに 1 つ (または、それ以上) はセットされる可能性があります。それは、直前に実行された SQL 文により影響される行の数を示すものです。たとえば、SQLERRD(3) には SELECT や 一連の FETCH 文で返された行の数が保存されています。
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) には次の内容が含まれます。
どのプリコンパイラもそれぞれ固有の 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 数字のリテラル値が含まれます。 |
Oracle、Sybase、および Informix では、プログラムで動的 SQL を使用する場合にのみ SQLDA が必要になります。
Oracle、Sybase、および Informix では、次の構文を使って SQLDA をプログラムにインクルードすることが許されていません。
EXEC SQL INCLUDE SQLDA END-EXEC
Oracle、Sybase、および Informix では、SQLDA は標準的な COBOL の copyfile として定義される必要があります。
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』 を参照してください。
Sybase では、SQLDA copyfile は提供されていません。Sybase プリコンパイラのドキュメントでは、SQLDA のレイアウトやその中の様々な項目に値を割り当てる方法について説明されています。また、ドキュメントでは Sybase を使って COBOL と Sybase のデータ型の変換方法についても説明されています。
Informix では、SQLDA copyfile は提供されていません。Infomix プリコンパイラのドキュメントでは、Informix での動的 SQL の使用を可能にするために、必要なデータ項目のレイアウトを定義する方法について説明されています。
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).
奇数番号のコード値は、その型が 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 |
SQLDA 構造体を使用する前に、アプリケーションは次のフィールドを初期化する必要があります。
SQLN | このフィールドは、構造体によって保持可能な SQLVAR エントリの最大数に設定されている必要があります。 |
SQLDABC | SQLDA の最大サイズです。この値は、 SQLN * 44 + 16 という式で計算できます。 |
DESCRIBE 文 (または、INTO オプションを付けた PREPARE 文) を使用して、列名、データ型、およびその他のデータを SQLDA 構造体の適切なフィールドに入力することができます。
文を実行する前に、前述のように、SQLN および SQLDABC フィールドが初期化されている必要があります。
文が実行された後、SQLD フィールドには準備された文で使用されたパラメータの数が含まれています。それぞれのパラメータごとに SQLTYPE と SQLLEN フィールドが設定され、SQLVAR レコードが使用可能な状態になります。
SQLN にどの位の大きさの値を設定すればよいかわからない場合には、SQLN に 1、SQLD に 0 を設定して DESCRIBE 文を実行します。詳細な列情報が SQLDA 構造体に入力されるわけではありませんが、結果セットの列の数が SQLD に挿入されます。
SQLDA 構造体を使用して FETCH 文を実行する前に、次の手順に従ってください。
データ型フィールド (SQLTYPE) および データ長 (SQLLEN) は、PREPARE INTO または DESCRIBE 文からの情報を使って設定されます。これらの値は FETCH 文が実行される前に、アプリケーションによって上書きすることも可能です。
SQLDA 構造体を使用して OPEN または EXECUTE 文の入力データを指定するには、アプリケーションにより、各変数用に SQLN、SQLD、SQLDABC、SQLTYPE、SQLLEN、および SQLDATA を含む、SQLDA 構造のすべてのフィールドにデータが入力される必要があります。
SQLTYPE フィールドの値が奇数値の場合には、SQLIND にも指示変数のアドレスを設定する必要があります。
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 | ![]() |