7.3.1 記述規則
UAPを作成するとき,SQLの文法の規則以外に,名標の付け方やSQLの記述についての規則があります。
- 〈この項の構成〉
(1) 名標の付け方の規則
名標を付ける場合,基本的にCOBOL言語の規則に従います。
COBOL言語の規則以外に,名標を付けるときの規則を次に示します。
(a) SQLの予約語
-
大文字でも小文字でも使用できます。
-
大文字と小文字を混在できます。
(b) ホスト名
-
「SQL」で始まる名標は使用できません。
-
ホスト名中のコロンの後ろに空白を記述できます。
-
大文字と小文字は同等に使用できます。
-
大文字と小文字は混在できます。
-
全角と半角の,英字,数字,記号,片仮名,及び空白は異なる文字として扱われます。
なお,使用する埋込み変数,標識変数,及び分岐先の名前の付け方は,名標の付け方の規則,及びCOBOL言語の規則に従います。また,次に示す名標は外部属性を持つため,使用できないので注意してください。
-
大文字の「SQL」で始まる名標
-
小文字の「p_」で始まる名標
-
小文字の「pd」で始まる名標
(2) SQLの記述規則
-
SQLは,一つのSQL文ごとにSQL先頭子(EXEC SQL)とSQL終了子(END-EXEC)とで囲みます。
<指定例>
EXEC SQL SQL文 END-EXEC.
-
COBOL言語とSQLとを同一行に混在できません。
-
SQLは,SQL先頭子,及びSQL終了子も含めてすべてB領域(第12欄〜72欄)に記述します。
-
SQLの継続規則は,原則としてCOBOL言語の「行のつなぎ」の規則に従います。
SQLで空白を必ず挿入する箇所,又は空白を挿入できる箇所であれば,自由に行を変えて記述できます。また,複数行にわたって記述することもできます。
SQLで空白を挿入できない箇所で行を変えるときは,次の行の標識領域にハイフン(-)を記述して,B領域の任意の欄から行の続きを記述します。
文字列定数の途中で行を変えるときは,必ず第72欄まで記述し,続きを次の行のB領域に記述します。また,文字列の続きは,最初に引用符又はアポストロフィ(引用符又はアポストロフィの最初に記述した方)を記述し,その引用符又はアポストロフィの次の欄から記述します。
-
SQL先頭子の直前に,段落の見出しを記述できます。
なお,段落の見出しを同一行には記述できません。
<正しい指定例>
OWARI. EXEC SQL SQL文 END-EXEC.
<誤った指定例>
OWARI. EXEC SQL SQL文 END-EXEC.
注 部分が誤りです。
-
一つのSQLは,COBOL言語での一つの命令として扱われます。したがって,SQLが一つの完結文の最後の命令になる場合,SQL終了子の後ろに終止符と空白を指定します。
<一つのSQLが一つの完結文の場合の指定例>
EXEC SQL SQL文 END-EXEC.
<SQLが完結文中の最後の命令の場合の指定例>
IF U-IOKBN = '2' THEN EXEC SQL SQL文 END-EXEC.
<SQLが完結文の途中の命令の場合の指定例>
IF U-IOKBN = '1' THEN EXEC SQL SQL文 END-EXEC ELSE IF U-IOKBN = '2' THEN NEXT SENTENCE.
-
SQL中には注記行を記述できませんが,SQL先頭子とSQL終了子の間には,注記行を何行でも記述できます。
<指定例>
EXEC SQL *ZAIKO表を検索するSELECT文に対して …注記行 *カーソルを宣言する …注記行 SQL文 END-EXEC.
-
埋込み変数の宣言は,次に示す規則に従います。
-
埋込みSQL宣言節は,次のどれかの節内で記述します。
・データ部(DATA DIVISION)のファイル節(FILESECTION)
・作業場所節(WORKING-STORAGE SECTION)
・局所記憶節(LOCAL-STORAGE SECTION)
・連絡節(LINKAGE SECTION)
-
SQLのデータ型に対応する埋込み変数については,「SQLのデータ型とデータ記述」を参照してください。
-
埋込み変数のデータ記述項には,JUSTIFIED,BLANK,及びWHEN ZERO句を指定できません。
-
レベル番号66の再命令項目,及びレベル番号88の条件名項目を埋込み変数としては使用できませんが,埋込みSQL宣言節で定義できます。
-
埋込みSQL宣言節内のデータ記述項目の行のつなぎは,COBOL言語の「行のつなぎ」の規則に従います。
-
「FILLER」は埋込み変数として使用できません。
-
TYPE句,TYPEDEF句,及びSAME AS句を使用したデータ項目は,埋込み変数として使用できます。
-
REDEFINES句を使用した場合,再定義する項目と再定義される項目のけた詰めが同じかどうかはチェックしていません。領域の大きさは,どちらか大きい方に合わせます。
-
PICTURE句を省略し,VALUE句だけを指定したデータ項目は,埋込み変数として使用できません。
-
-E又は/Eオプションを使用すると,埋込みSQL宣言節を使用しなくても,宣言したデータ項目を埋込み変数として使用できます。ただし,SQL文で埋込み変数として使用できるのは,「SQLのデータ型とデータ記述」の形式で宣言したデータ項目だけです。そのほかの形式のデータ項目は,埋込み変数として使用できません。
データ項目名は,COBOL言語の文法に従って各データ項目名の有効範囲が判定されます。
-
COBOL2002のクラス継承機能を使用して,親クラスから継承したデータ項目は,埋込み変数として使用できません。
-
COBOL2002のUnicode機能を使用するUAPでは,SQLプリプロセサ実行時に-XU16又は/XU16オプションを指定すると,UTF-16の文字データを格納する日本語項目を埋込み変数として使用できます。日本語項目を使用した埋込み変数は,SQL文中で混在文字データ型(MCHAR又はMVARCHAR)に対応する埋込み変数が使用できる箇所なら,どこにでも埋め込むことができます。なお,使用できる文字の範囲はCOBOL2002のUnicode機能がサポートする範囲内に限定されます。
COBOL2002のUnicode機能を使用したUAPの実行については「COBOL2002のUnicode機能を使用したUAPの実行」を参照してください。
-
-
標識変数の宣言は,次に示す規則に従います。
-
標識変数は,レベル番号01〜49の基本項目,又はレベル番号77の独立項目であることが前提になります。
-
標識変数のデータ記述項については,「SQLのデータ型とデータ記述」を参照してください。
-
標識変数のデータ記述項目には,SIGN,JUSTIFIED,BLANK,及びWHEN ZERO句を指定できません。
-
「FILLER」は,標識変数名として使用できません。
-
-E又は/Eオプションを使用すると,埋込みSQL宣言節を使用しなくても,宣言したデータ項目を標識変数として使用できます。ただし,SQL文で標識変数として使用できるのは,「SQLのデータ型とデータ記述」の形式で宣言したデータ項目だけです。そのほかの形式のデータ項目は,標識変数として使用できません。
データ項目名は,COBOL言語の文法に従って各データ項目名の有効範囲が判定されます。
-
COBOL2002のクラス継承機能を使用して,親クラスから継承したデータ項目は,標識変数として使用できません。
-
-
COBOL言語でのSQLを記述できる部(DIVISION)を次の表に示します。
- (凡例)
-
○:記述できます。
×:記述できません。
- 注※
-
作業場所節,ファイル節,又は連絡節の中の一つを指します。
-
WHENEVER文,及びカーソル宣言は宣言文なので,IF命令,及びEVALUATE命令中には記述できません。
-
SQL先頭子とSQL終了子で囲まれたSQL文の途中には,コンパイルリスト出力制御(EJECT,SKIP1,SKIP2,SKIP3,又はTITLE)を記述しないでください。表名や列名としてEJECT,SKIP1,SKIP2,SKIP3,又はTITLEを使用する場合は,必ず引用符で囲んでください。なお,表名や列名などが語句の一部分としてEJECT,SKIP1,SKIP2,SKIP3,又はTITLEを含む場合は,囲む必要はありません。
-
注釈の規則を次に示します。
-
SQL先頭子からSQL終了子までの間に記述した囲み注釈(/*〜*/)及び単純注釈(-- 〜 改行)はSQLプリプロセサが削除します。ただし,SQL最適化指定(/*>>〜<<*/)は削除しないで,SQL文として扱います。また,引用符(")やアポストロフィ(')で囲まれた部分にある「/*〜*/」及び「--〜改行」は削除しません。
-
SQL先頭子がある行とSQL終了子がある行の間にある注釈行,デバッグ行はポストソースから除かれます。
-
囲み注釈及びSQL最適化指定を複数行にわたって記述している場合は,*/が現れるまで行の先頭はB領域の先頭から始まっているとみなされます。
-
プリプロセスオプション-Xs又は/Xsを指定した場合にだけ,SQL先頭子からSQL終了子までの間に単純注釈を記述できます。
-
単純注釈の開始を示す「--」はB領域に記述します。「--」から行の末尾までにあるすべての文字が注釈になります。行の末尾が見出し領域にあってもかまいません。
-
行末に囲み注釈又は単純注釈がある場合に,次の行の標識領域に継続標識「−」を指定しないでください。この場合,継続標識を指定しても,注釈の前にある字句と次の行にある字句を,空白を挟まずにつなぐことはできません。
-
単純注釈とSQL終了子を同じ行に記述することはできません。
<単純注釈の正しい指定例>
EXEC SQL -- 注釈1 CALL PROC1(0) -- 注釈2 END-EXEC.
<単純注釈の誤った指定例1>
EXEC SQL CALL PROC1(0) -- 注釈1 END-EXEC.
この場合,単純注釈の中にEND-EXECがあるため,END-EXECがSQL終了子としてみなされません。
<単純注釈の誤った指定例2>
EXEC SQL CALL PROC1(0) END-EXEC. -- 注釈1
この場合,「-- 〜 改行」がSQL先頭子からSQL終了子(END-EXEC)の範囲外にあるため,「-- 〜 改行」が注釈としてみなされません。
SQL文中での囲み注釈,単純注釈,及びSQL最適化指定については,マニュアル「HiRDB SQLリファレンス」を参照してください。
-
-
行内注記(*>)を使用できます。ただし,SQL先頭子からSQL終了子までの間は,行内注記を使用できません。使用した場合,行内注記ではなく文字列として扱われます。
-
埋込みSQL宣言節,及びSQLに記述した行では,タブコードを長さ1文字として扱います。また,-E2又は/E2,及び-E3又は/E3オプションを使用した場合,すべてのデータ部が同様に,タブコードを長さ1文字として扱います。
-
COBOL2002のオブジェクト指向機能を使用する場合,「SQLの記述規則」も適用されます。
-
ソースに登録集原文を引き込む方法として,COBOLのCOPY文又はINCLUDE文と,SQLのCOPY文があります。それぞれ登録集原文中に記述できる項目を次に示します。
記述項目
登録集原文を引き込む方法
COBOLのCOPY文
又はINCLUDE文
SQLのCOPY文
SQL文
COPY
×
×
COPY以外
×
○
埋込み変数と標識変数の宣言
×
○
-
-Xr又は/Xrオプションを指定しない場合,SQL文の種類によって,SQL文実行時のRETURN-CODE特殊レジスタの更新有無が変わります。SQL文の種類によるRETURN-CODE特殊レジスタの更新有無を次の表に示します。
表7‒4 SQL文の種類によるRETURN-CODE特殊レジスタの更新有無 SQL文
RETURN-CODE特殊レジスタ更新有無
分類
種類
-Xr又は/Xr
指定無し
-Xr又は/Xr
指定有り
定義系SQL
すべて
更新する
更新しない
操作系SQL
DECLARE CURSOR文
更新しない
上記以外
更新する
制御系SQL
すべて
更新する
埋込み言語
GET DIAGNOSTICS文
更新する
DECLARE AUDIT INFO SET文
上記以外
更新しない
-Xr又は/Xrオプション指定有無によるプログラム動作の差異の例を,次の図に示します。
図7‒11 -Xr又は/Xrオプション指定有無によるプログラム動作の差異の例