Symfoware Parallel Server SQLビギナーズガイド
目次 索引 前ページ次ページ

第7章 応用プログラムの実行時に動的SQL文を実行する方法> 7.2 SQL文を動的に変更して実行する

7.2.1 SQL文の準備とSQL記述子域の操作

動的SQLを使用してデータベースからデータの取り出しを行う場合には、実行結果を受け取る相手指を指定します。相手指定に実行結果を受け取るためには、選択リストの情報をその相手指定の属性と一致させることが必要です。そこで、データベースからSQL記述子域に選択リストの情報を取り込んで、属性を変更します。SQL記述子域の位置づけを以下に示します。

 

SQL記述子域は、識別子COUNTと0以上の項目記述子(SQL記述子域の各要素)で構成されています。COUNTは、SQL記述子域の選択リストの数を示し、そのデータ型は2進の精度を持つ真数です。以下の図では、SQL記述子域の選択リストの数をnで表しています。

 

項目記述子域は以下の内容で構成されています。

 

識別子

意味

データ型

TYPE

データ型のコード

2進の精度を持つ真数

LENGTH

長さ(文字数)

2進の精度を持つ真数

OCTET_LENGTH

長さ(バイト数)

2進の精度を持つ真数

PRECISION

精度

2進の精度を持つ真数

SCALE

位取り

2進の精度を持つ真数

NULLABLE

ナル値を許すかどうかの識別

2進の精度を持つ真数

INDICATOR

標識変数の値

2進の精度を持つ真数

DATA

データ値

TYPE,LENGTH,OCTET_LENGTH,PRECISION, SCALE,CHARACTER_SET_NAME,DATETIME_IN TERVAL_CODEで指定されるデータ型に一致

NAME

名前

長さ38以上の文字列型

CHARACTER_SET_NAME

文字セット名

長さ38以上の文字列型

DATETIME_INTERVAL_CODE

日時型・時間隔型のコード

2進の精度を持つ真数

DATETIME_INTERVAL_PRECISION

時間隔先行フィールド精度

2進の精度を持つ真数

SQL記述子域のTYPEの値(データ型のコード)とSQLのデータ型の対応は以下のとおりです。

 

コード

データ型

CHARACTERまたはNATIONAL CHARACTER

NUMERIC

DECIMAL

INTEGER

SMALLINT

REAL

DOUBLE PRECISION

DATE, TIMEまたはTIMESTAMP

10

INTERVAL

12

CHARACTER VARYINGまたはNATIONAL CHARACTER VARYING

30

BLOB

50

ROW_ID

TYPEの値が1または12のとき、CHARACTER_SET_NAMEの値(文字セット名)は、文字列型と各国語文字列型で以下のように異なります。

TYPEの値が日時型を示す9の場合、DATETIME_INTERVAL_CODEの値は以下のとおりです。

 

コード

データ型

DATE

TIME

TIMESTAMP

TYPEの値が時間隔型を示す10の場合、DATETIME_INTERVAL_CODEの値は以下のとおりです。

 

コード

時間隔修飾子

YEAR

MONTH

DAY

HOUR

MINUTE

SECOND

YEAR TO MONTH

DAY TO HOUR

DAY TO MINUTE

10

DAY TO SECOND

11

HOUR TO MINUTE

12

HOUR TO SECOND

13

MINUTE TO SECOND

■実行結果の取り出し手順

USING記述子を使用して、実行結果を取り出す方法の順序を“図:被準備文の実行結果の取り出し手順”に示します。ここでは処理の流れを説明します。なお、各SQL文については“図:被準備文の実行結果の取り出し手順”以降で説明します。

 

[図:被準備文の実行結果の取り出し手順]

 

SQL文を動的に変更してデータ操作を行う場合、そのSQL文を実行するための準備処理を行います。

■SQL文の準

動的SQLの実行の準備を行うには、PREPAREを使用します。プログラムの実行時にSQL文を作成して実行させる場合に、そのSQL文を“SQL文変”と呼ばれるホスト変数に文字列として格納します。そして、PREPARE文で実行の準備をします。このとき、SQL文変数に格納されたSQL文は文を識別するSQL文識別子と対応づけられます。

SQL文変数の内容が準備可能動的UPDATE文(位置づけ)または準備可能動的DELETE文(位置づけ)の場合は、事前に対応するカーソルをオープンしておくことが必要です。また、指定したカーソルは動的カーソルであることが必要です。

なお、すでにPREPARE文で定義されたSQL文識別子に対して、再度PREPARE文を実行する場合は、先の被準備文が解放され、新たに被準備文が準備されます。先の被準備文が動的SELECT文の場合、SQL文識別子に対応するカーソルを参照している準備可能動的UPDATE文(位置づけ)または準備可能動的DELETE文(位置づけ)の被準備文も同時に解放されます。ただし、被準備文が動的SELECT文の場合、SQL文識別子に対応するカーソルは閉じられた状態であることが必要です。

PREPARE文の指定例を以下に示します。実行準備を行うSQL文は、SQL文変数strに格納されているとします。このSQL文のSQL文識別子をSTMと定義します。

PREPARE  STM  FROM  :str
           (1)          (2)

(1) SQL文識別子

(2) SQL文変数

■SQL文の解

PREPARE文によって準備された被準備文を解放するには、DEALLOCATE PREPAREを使用します。

被準備文が動的SELECT文の場合、SQL文識別子に対応するカーソルを参照している準備可能動的UPDATE文(位置づけ)または準備可能動的DELETE文(位置づけ)の被準備文も同時に解放されます。また、その際のカーソルは、閉じられた状態であることが必要です。

DEALLOCATE PREPARE文の指定例を以下に示します。解放する被準備文は、PREPARE文によってSQL文識別子をSTMと定義された被準備文とします。

DEALLOCATE  PREPARE  STM  
                        (1)

(1) SQL文識別子

■SQL記述子域を操作するSQL

図:被準備文の実行結果の取り出し手順”で示したように、データベースからSQL記述子域に選択リストの情報を取り込んだり、SQL記述子域に取り込まれた選択リストの情報を取得するには、それぞれSQL文を使用します。SQL記述子域を操作する各SQL文とその機能について以下で説明します。

◆ALLOCATE DESCRIPTOR

ALLOCATE DESCRIPTOR文は、指定された記述子名のSQL記述子域を割り当てます。割り当てられたSQL記述子域は、実現値に指定された個数の項目記述子域を所有します。

“DESC1”という記述子名のSQL記述子域を割り当てる例を以下に示します。このとき、SQL記述子域の項目記述子域の数を200とします。

ALLOCATE  DESCRIPTOR  'DESC1'   WITH MAX  200
                           (1)                  (2) 

(1) 記述子名

(2) 実現値

◆DEALLOCATE DESCRIPTOR

DEALLOCATE DESCRIPTOR文は、ALLOCATE DESCRIPTOR文で割り当てたSQL記述子域を解放します。DEALLOCATE DESCRIPTOR文で指定した記述子名が動的OPEN文に指定されている場合、カーソルは閉じられた状態であることが必要です。

“DESC1”という記述子名のSQL記述子域を解放する例を以下に示します。

DEALLOCATE  DESCRIPTOR  'DESC1'
                             (1)

(1) 記述子名

◆DESCRIBE

DESCRIBE文では、PREPARE文で準備された被準備文の選択リストの情報をSQL記述子域に取り込みます。このSQL文を“出力DESCRIBE”といいます。

SQL文識別子STM2に対応する被準備文の選択リストの情報を、SQL記述子域に取り込む出力DESCRIBE文の例を以下に示します。

DESCRIBE  OUTPUT  STM2  USING  SQL  DESCRIPTOR  'DESC2'
                     (1)                                (2) 

(1) SQL文識別子

(2) 記述子名

SQL文識別子STM2に対する被準備文が以下の場合、SQL記述子域DESC2の内容は次のようになります。

SELECT 製品名, 在庫数量 FROM 在庫管理.在庫表 WHERE 製品番号 = 110 
             (1)

(1) 選択リスト

◆DESCRIPTOR取得

DESCRIPTOR取得文では、SQL記述子域に設定されている情報をホスト変数に取り出します。ホスト変数のデータ型は、それぞれの取得識別子のデータ型と一致していることが必要です。

選択リストの個数を、ホスト変数varcountに取得する例を以下に示します。

GET  DESCRIPTOR  'DESC1'   :varcount  =  COUNT
                     (1)          (2)           (3)

(1) 記述子名

(2) 単純相手指定

(3) 取得識別子

SQL記述子域に設定されている選択リストの内容を、それぞれホスト変数vartype、varleng、varoctetに取得する例を以下に示します。また、取得する項目記述子域の要素番号はvarwcountに設定されている値とします。

GET  DESCRIPTOR  'DESC1'   VALUE  :varwcount    :vartype  =  TYPE,
                     (1)                    (2)            (3)        (4)

             :varlengz  =  LENGTH,   :varoctet  =  OCTET_LENGTH
                 (3)           (4)          (3)              (4)

(1) 記述子名

(2) SQLVAR取得番号

(3) 単純相手指定

(4) 取得識別子

SQL記述子域から実行結果を取得する場合は、ホスト変数のデータ型は、対応する項目記述子域のTYPE、LENGTH、OCTET_LENGTH、PRECISION、SCALE、CHARACTER_SET_NAMEに対応するデータ型であることが必要です。

SQL記述子域に設定されている実行結果を、ホスト変数vardataに取得する例を以下に示します。また、取得する項目記述子域の要素番号はvarwcountに設定されている値とします。

GET  DESCRIPTOR  'DESC1'   VALUE  :varwcount     :vardata  =  DATA
                     (1)                  (2)             (3)         (4)

(1) 記述子名

(2) SQLVAR取得番号

(3) 単純相手指定

(4) 取得識別子

◆DESCRIPTOR設定

DESCRIPTOR設定文では、実行結果を取り出す相手指定のデータ型を、SQL記述子域の選択リストに設定します。定数またはホスト変数で指定します。ホスト変数のデータ型は、それぞれの設定識別子のデータ型と一致していることが必要です。

SQL記述子域の選択リストのデータ型を変更する例を以下に示します。ここでは、実行結果を取り出すホスト変数vardataのデータ型が、CHARACTER(11)と宣言されているとします。したがって、選択リストのデータ型をCHARACTER(10)に変更します。設定を行う項目記述子域の要素番号はvarwcountに設定されている値とします。

SET  DESCRIPTOR  'DESC1'   VALUE  :varwcount     TYPE  =  1,
                    (1)                   (2)           (3)      (4)

             LENGTH  =  10,   OCTET_LENGTH  =  10
               (3)       (4)        (3)            (4)

(1) 記述子名

(2) SQLVAR設定番号

(3) 設定識別子

(4) 単純値指定


目次 索引 前ページ次ページ

All Rights Reserved, Copyright(C) 富士通株式会社 2006