Hitachi

ノンストップデータベース HiRDB Version 10 UAP開発ガイド


3.1.1 UAP中でのSQLの基本構成の説明

UAP中でのSQLの基本構成を次の図に示します。なお,ここではUAPをCOBOL言語で記述する場合について説明します。

図3‒1 UAP中でのSQLの基本構成

[図データ]

〈この項の構成〉

(1) 埋込み変数及び標識変数の宣言

SQLで検索したデータをUAP側で受け取ったり,逆にUAP側のデータをSQLで表に挿入したりするには,両方の言語間の橋渡しをする変数が必要になります。このために,埋込み変数を使用します。また,ナル値を含むデータを受け渡す必要のあるときには,埋込み変数と併せて標識変数を使用します。

埋込み変数及び標識変数の宣言例を次に示します。

なお,SQL中での埋込み変数及び標識変数の指定方法については,「検索,更新のSQL(実行文)」を参照してください。

EXEC SQL
  BEGIN DECLARE SECTION  ..........1
END-EXEC.
77 XUSERID    PIC X(7). ...........2
77 XPSWD      PIC X(7). ...........2
77 XSCODE     PIC X(4). ...........2
77 XSNAME     PIC N(8). ...........2
77 XGRYO      PIC S9(9) COMP. .....2
77 IGRYO      PIC S9(4) COMP. .....3
EXEC SQL
  END DECLARE SECTION  ............4
END-EXEC.
[説明]
  1. 埋込み変数の宣言の始まりを示します。

  2. 埋込み変数を宣言します。SQLとUAP側でデータを受け渡しするときには,あらかじめ決められた規則に従って記述します。SQLのデータ型とデータ記述については,「SQLのデータ型とデータ記述」を参照してください。

  3. 埋込み変数xgryoに対する標識変数を宣言します。なお,BLOB型の埋込み変数に対する標識変数の場合は,PIC S9(9) COMP.となります。

  4. 埋込み変数の宣言の終わりを示します。

ナル値の既定値設定機能を使用している場合,検索結果がナル値のときはナル値の代わりに既定値(数データの場合は0,文字データの場合は空白)を埋込み変数で受け取ることができます。この場合,既定値とナル値とを区別しなくていいときは,標識変数を使用する必要がなくなります。ナル値の既定値設定機能については,マニュアル「HiRDB SQLリファレンス」を参照してください。

(2) HiRDBとの接続

HiRDBにユーザの認可識別子及びパスワードを通知して,UAPがHiRDBを使用できる状態にします。これをHiRDBとの接続といいます。HiRDBとの接続方法を次に示します。

EXEC SQL
  CONNECT :XUSERID IDENTIFIED BY :XPSWD
END-EXEC.
[説明]

埋込み変数(:XUSERID)に格納された認可識別子,及び埋込み変数(:XPSWD)に格納されたパスワードでHiRDBと接続します。

(3) カーソル宣言

UAPで複数行の検索結果を1行ずつ取り出すために,DECLARE CURSORでカーソルを宣言します。宣言したカーソルを使用して,データの検索,更新,及び削除をします。また,カーソルをオープンする場合はOPEN文,検索結果を取り出しカーソルを次の行へ進める場合はFETCH文,カーソルをクローズする場合はCLOSE文を使用します。

カーソル宣言中には,探索条件中の条件値として,埋込み変数及び標識変数を指定できます。これらを指定した場合,そのカーソルに対するOPEN文の実行時に,それらの変数中の値がHiRDBに渡されます。

カーソルの詳細については,「カーソルの効果」を参照してください。

カーソルの宣言方法を次に示します。

EXEC SQL
  DECLARE CR1 CURSOR FOR SELECT SCODE,SNAME,GRYO FROM ZAIKO
END-EXEC.
[説明]

ZAIKO表からSCODE,SNAME,GRYOを1行ずつ取り出すために,カーソルCR1を宣言します。

(4) エラー時の処置の指定

SQL文の前にWHENEVER文を指定しておくと,エラーが発生したかどうかを自動的に判定できます。WHENEVER文の指定方法を次に示します。

(a) エラーが発生した場合

EXEC SQL
  WHENEVER SQLERROR GO TO エラー処理 
END-EXEC.

[説明]

WHENEVER SQLERROR:

エラーが発生したときの処置を宣言します。

GO TO エラー処理:

エラーが発生したとき,指定した節名又は段落名(エラー処理)へ処理を移します。この処理内からSQL連絡領域を参照すれば,リターンコードと関連する情報を確認できます。

(b) 検索する行がなくなった場合

EXEC SQL
  WHENEVER NOT FOUND GO TO 検索終了処理
END-EXEC.

[説明]

WHENEVER NOT FOUND:

検索する行がなくなったときの処置を宣言します。

GO TO 検索終了処理:

検索する行がなくなったとき,指定した節名又は段落名(検索終了処理)へ処理を移します。

(c) WHENEVER文の有効範囲

WHENEVER文は次に同じ種類のWHENEVER文が現れるまで,その間にあるすべてのSQLに対して有効となります。WHENEVER文の有効範囲については,マニュアル「HiRDB SQLリファレンス」を参照してください。

(5) 検索,更新のSQL(実行文)

データを検索,更新,挿入,又は削除するためのSQL文を記述します。各SQL文の記述方法については,「データベースの操作」を参照してください。

ここでは,埋込み変数及び標識変数の使用方法について説明します。

(a) 1行SELECT文又はFETCH文に記述する場合

1行SELECT文又はFETCH文のINTO句に,埋込み変数及び標識変数を指定します。このとき,各変数の先頭にはコロンを付けます。標識変数は対応する埋込み変数に続けて指定します。例を次に示します。

[図データ]

INTO句に指定した埋込み変数は,SELECT文の列の並びに指定した列名の順に対応しており,この順序に従って埋込み変数に検索結果が格納されます。

検索結果にナル値を含む場合は標識変数に負の値が格納されるので,この値を参照してナル値かどうかを判断します。このとき,埋込み変数の値は不定となります。また,標識変数の値が0のときは,ナル値以外の値を受け取ったことを示し,値が正のときは,ナル値以外の文字列データを受け取ったが,埋込み変数の領域長が不足していたため,右端が切り捨てられたことを示します。

また,探索条件の値に埋込み変数を指定しておけば,SQLの実行時に探索条件の値を与えることができます。

(b) UPDATE文及びINSERT文に記述する場合

UPDATE文のSET句及びINSERT文のVALUES句に埋込み変数及び標識変数を指定します。このとき,各変数の先頭にはコロンを付けます。標識変数は対応する埋込み変数に続けて指定します。例を次に示します。

<UPDATE文の場合>

EXEC SQL
  UPDATE ZAIKO SET GRYO=:XGRYO:IGRYO WHERE SCODE=:XSCODE
END-EXEC.

<INSERT文の場合>

EXEC SQL
  INSERT INTO ZAIKO VALUES(:XSCODE,:XSNAME,:XCOL,:XTANKA
                            ,:XGRYO:IGRYO,:XMAXRYO,:XSAFRYO)
END-EXEC.

UPDATE文又はINSERT文によって表にナル値を設定する場合は,そのSQLを実行する前にあらかじめ標識変数に負の値を設定しておきます。このとき,埋込み変数には何も設定しなくてよいです。また,ナル値以外の値を渡す場合は,標識変数の値を0又は正にしておきます。

(6) エラーの判定

SQLの実行中にエラーが発生した場合,SQLCODE,SQLSTATEを参照すると,HiRDBから返されるリターンコードが分かります。そのリターンコードを利用して,その後の処理をどうするか指示します。ただし,「エラー時の処置の指定」で,既に同じ内容のエラー処理を指定している場合は,ここで指示する必要はありません。

DECLARE CURSORのような宣言文の直後に,エラーの判定はしないでください。エラーの判定をすると,不正なSQLCODEを参照して,HiRDBが誤動作してしまいます。

エラーの判定については,「エラーの判定」を参照してください。

(7) トランザクションの有効化

トランザクション内で更新処理をした場合,更新したデータベースの内容を有効にし,トランザクションを正常終了させます。

トランザクションを有効にするSQL文を次に示します。

EXEC SQL
  COMMIT
END-EXEC.
[説明]

トランザクションを有効にします。また,トランザクションの有効化後にUAPをHiRDBから切り離したい場合には,RELEASE指定のCOMMIT文を実行します。RELEASEを指定した場合,DISCONNECT文を実行しなくてもよいです。

(8) トランザクションの無効化

トランザクション内で更新したデータベースの内容を無効にし,トランザクションを終了させます。トランザクション内での更新処理が不正だった場合など,データベースの更新を取り消したいときに指定します。

トランザクションを無効にするSQL文を次に示します。

EXEC SQL
  ROLLBACK
END-EXEC.
[説明]

トランザクションを無効にします。また,トランザクション終了後にUAPをHiRDBから切り離したい場合には,RELEASE指定のROLLBACK文を実行します。RELEASEを指定した場合,DISCONNECT文を実行しなくてもよいです。

(9) HiRDBからの切り離し

トランザクションを正常終了させて,UAPをHiRDBから切り離します。DISCONNECT文は,RELEASE指定のCOMMIT文を実行したときと同じになります。

トランザクションを正常終了させて,UAPをHiRDBから切り離すSQL文を次に示します。

EXEC SQL
  DISCONNECT
END-EXEC.
[説明]

トランザクションを正常終了させて,UAPをHiRDBから切り離します。また,トランザクションを取り消した後にUAPをHiRDBから切り離す場合には,RELEASE指定のROLLBACK文を実行します。なお,DISCONNECT文,COMMIT文(RELEASE指定),及びROLLBACK文(RELEASE指定)のどれも実行しないでUAPが終了した場合,ROLLBACK文(RELEASE指定)が自動的に実行され,実行中のトランザクションは無効となるので注意してください。