10.7 埋め込みSQL文を含むCOBOLソースファイルの解析
埋め込みSQL文を含むCOBOLソースファイルの解析方法について説明します。
COBOLソース解析では,埋め込みSQL文を含むCOBOLソースファイルを解析して,埋め込みSQL文から表に対するデータ操作(CRUD操作)の情報を抽出します。抽出対象となるCRUD操作の情報(CRUD操作情報)を次に示します。
-
埋め込みSQL文で操作する表名
-
埋め込みSQL文を含むプログラム名
-
表に対する操作種別(C:生成(Create),R:読み取り(Read),U:更新(Update),D:削除(Delete))
COBOLソース解析では,すべてのCOBOLソースファイルを解析したあとに,システム全体のすべてのCRUD操作情報を分析し,各表(DB)に対して,どのプログラムが表データの生成(Create),読み取り(Read),更新(Update),削除(Delete)を実行しているかを示す情報(CRUD情報)を生成します。
[表(DB)詳細]画面でのCRUD情報の表示例を次に示します。
CRUD情報を使用すると,表データのライフサイクルに関係するプログラムを確認できるため,次の作業を効率的かつ効果的に実施できます。
-
表操作の矛盾(表に対する読み取りがあるが生成がないなど)の洗い出し
-
表形式やインデクスの変更時の影響個所の特定
-
障害発生時の問題個所の絞り込み
-
表の棚卸し対象(表データが使用されていない表)の洗い出し
解析対象の埋め込みSQL文を含むCOBOLソースファイル
COBOLソース解析では,次に示すSQL埋め込みCOBOLソースファイル(埋め込みSQL文を含むCOBOLソースファイル)を解析対象とします。
-
COBOL2002のODBCインタフェース機能で使用できる埋め込みSQL文を含むCOBOLソースファイル
-
XDM/RDの埋め込みSQL文を含むCOBOLソースファイル
-
COBOL言語用SQLプリプロセサのUAPソースファイル
- 注意事項
-
COBOL言語用SQLプリプロセサのUAPソースファイルの場合,次のどちらかに該当するCOBOLソースファイルはコンパイルエラーになるため,COBOLソース解析では解析できません。
-
SQLCODE変数,SQLSTATE変数,SQL連絡領域(SQLCA)またはSQL記述領域(SQLDA)をCOBOLプログラム内で参照しているが,明示的な埋め込みSQL宣言がない。
-
SQL TYPE句を使用している。
この場合,COBOL2002コンパイラの環境変数CBLCOPT2002に-SQLAutoCopyコンパイラオプションを指定する必要があります。-SQLAutoCopyコンパイラオプションについては,「付録B.3 -SQLAutoCopyコンパイラオプション」を参照してください。
-
解析対象の埋め込みSQL文
COBOLソース解析で解析対象になる埋め込みSQL文は,次に示す形式です。
EXEC SQL 〔AT{SQL識別子|:埋め込み変数名}〕 〔FOR{整数|:埋め込み変数名}〕 文種別キーワード〔句〕… END-EXEC
COBOLソース解析で解析対象になる埋め込みSQL文の構文規則を次に示します。
- 解析対象の埋め込みSQL文の構文規則
-
-
EXEC,SQL,およびEND-EXECの語は,固定継続標識を使って複数行にわたって記述できません。
-
埋め込みSQL文中の全角・半角および英大文字・英小文字の扱いを次に示します。埋め込みSQL文中では,-EquivRuleコンパイラオプションの規則は埋め込み変数名だけに適用され,それ以外の部分には適用されません。
SQLの予約語の場合
半角英字だけ使用できます(全角英字は使用できません)。英大文字・英小文字を区別しません。
SQLの予約語以外の語の場合
全角・半角および英大文字・英小文字を区別します。ただし,引用符(")で囲まれていないカーソル名や表名中の半角英小文字は半角英大文字に変換します。
-
埋め込みSQL文中の注記行はCOBOLの規則に準じます。
-
埋め込みSQL文中の行の継続はCOBOLの規則に準じます。
-
埋め込みSQL文中のデバッグ行はCOBOLの規則に準じます。-EquivRule,NotAnyコンパイラオプションが指定されている場合,小文字のdはデバッグ標識と見なされないため,デバッグ行の扱いにはなりません。-DebugLineコンパイラオプションが指定されている場合,デバッグ行は有効行として扱います。
-
埋め込みSQL文中はSQLのコメント指定(--〜および/*〜*/)と,COBOLの行内注記(*>〜)の両方が使用できます。
-
埋め込みSQL文中のタブ文字はCOBOLの規則に準じます。タブを空白に置き換えるときの空白の個数は,環境変数CBLTABを参照してください。
-
埋め込み例外宣言(WHENEVER文)およびカーソル宣言(DECLARE CURSOR文)は,手続き部にだけ記述できます。
-
COBOLソース解析のSQL文の解析では,表データに対してCRUD操作を行う埋め込みSQL文(CRUD操作文)を検出して,CRUD操作種別と表名を抽出します。
COBOLソース解析で解析対象になる埋め込みSQL文と抽出するCRUD操作種別を次の表に示します。
種類 |
分類 |
SQL文 |
説明 |
抽出するCRUD操作種別 |
---|---|---|---|---|
定義系 |
表操作 |
CREATE TABLE |
表の作成 |
− |
ALTER TABLE |
表の変更 |
− |
||
DROP TABLE |
表の削除 |
D |
||
その他 |
その他の定義系SQL文 |
上記以外の定義 |
− |
|
宣言系 |
埋め込みSQL宣言節 |
BEGIN DECLARE SECTION |
埋込みSQL開始宣言 |
− |
END DECLARE SECTION |
埋込みSQL終了宣言 |
− |
||
埋め込み例外宣言 |
WHENEVER |
埋込み例外宣言 |
− |
|
カーソル宣言 |
DECLARE CURSOR |
カーソル宣言 |
− |
|
制御系 |
接続 |
CONNECT |
データベースとの接続 |
− |
DISCONNECT |
データベースからの切断 |
− |
||
トランザクション |
COMMIT |
コミットでのトランザクションの終了 |
− |
|
ROLLBACK |
ロールバックでのトランザクションの終了 |
− |
||
操作系 |
静的SQL |
SELECT |
表から条件が一致する1行の取り出し |
R |
INSERT |
表への行の挿入 |
C,R※1 |
||
UPDATE(探索) |
表の条件が一致する行の更新 |
U,R※1 |
||
DELETE(探索) |
表から条件が一致する行の削除 |
D,R※1 |
||
TRUNCATE |
表の全行削除 |
D |
||
PURGE |
表の全行削除 |
D |
||
ASSIGN LIST |
リストの作成 |
− |
||
カーソル操作 |
OPEN |
カーソルのオープン |
R※2 |
|
FETCH |
カーソルが指す行の取り出し |
R※2 |
||
UPDATE(位置付け) |
カーソルが指す行の更新 |
U,R※1 |
||
DELETE(位置付け) |
カーソルが指す行の削除 |
D |
||
CLOSE |
カーソルのクローズ |
− |
||
動的SQL |
EXECUTE IMMEDIATE |
動的SQLの前処理と実行 |
− |
|
PREPARE |
動的SQLの前処理 |
− |
||
EXECUTE |
動的SQLの実行 |
− |
||
DEALLOCATE PREPARE |
動的SQLの前処理無効化 |
− |
||
その他 |
その他の操作系SQL文 |
上記以外の操作 |
− |
解析対象SQL文の表参照
COBOLソース解析で解析対象になるSQL文の表参照の形式を次に示します。
{〔認可識別子.〕 表識別子 〔句〕…| 導出表副問合せ 〔句〕…| 〔(〕 表参照 {INNER|{LEFT|RIGHT} 〔OUTER〕|{CROSS|FULL}} JOIN 表参照 ON 結合条件 〔)〕}
- 注意事項
-
認可識別子はスキーマ名またはスキーマ認可識別子です。表識別子は,実表名,ビュー表名または問合せ名です。相関名はCRUD情報の抽出対象になりません。
構文的なコンパイルエラーのあるSQL文の扱い
COBOLソース解析では,構文的なコンパイルエラーがないものを解析対象としています。このため,SQL文に構文エラーがあってもエラーメッセージは出力しません。ただし,SQL文から正しい表名が抽出できない場合は,次に示す警告メッセージを出力します。
構文エラーで出力する警告メッセージ |
メッセージの出力条件 |
SQL文の扱い |
---|---|---|
KEDL1277A-W 埋め込みSQL文に構文エラーがあるため表名を抽出できませんでした。SQL文=(*** 1 ***) |
|
「== SQL構文エラー ==」を表名としてCRUD操作情報を抽出します。 [表(DB)詳細]画面では,表名「== SQL構文エラー ==」に,SQL文で構文エラーがあるプログラムの一覧が表示されます。 |
KEDL1278A-W SQL識別子(*** 1 ***)が不正な文字を含んでいます。@に置き換えます。 |
|
不正な文字を@に置き換えます。 |
KEDL1279A-W *** 1 ***文(SQL)に指定されたカーソル名(*** 2 ***)の定義が見つからないため表名を抽出できませんでした。 |
|
「== カーソル名未定義 ==」を表名としてCRUD操作情報を抽出します。 [表(DB)詳細]画面では,表名「== カーソル名未定義 ==」に,SQL文でカーソル名未定義エラーがあるプログラムの一覧が表示されます。 |
CRUD情報を出力するソース解析情報
CRUD情報を出力するソース解析情報(HTMLファイル形式,CSVファイル形式)を次の表に示します。
項番 |
ソース解析情報 |
CRUD情報の出力項目 |
---|---|---|
1 |
表(DB)一覧 |
|
2 |
表(DB)詳細 |
|
3 |
プログラム詳細の表(DB)一覧 |
|
4 |
セクション階層図 |
|
5 |
プログラム階層図 |
|
6 |
表(DB)参照関係CSV |
|
- 注意事項
-
-
COBOLソースファイルで使用している表名が,通常識別子(引用符(")で囲まれていないSQL識別子)の場合,半角英小文字は半角英大文字に変換されてソース解析情報(HTMLファイル形式,CSVファイル形式)に出力されます。
-
COBOLソースファイルで使用している表名が,区切り識別子(引用符(")で囲まれたSQL識別子)の場合,引用符を除いた名前がソース解析情報(HTMLファイル形式,CSVファイル形式)に出力されます。また,引用符を除いた名前が次の半角記号文字を含んでいる場合,これらの半角記号文字は全角に変換されます。
" % & ' ( ) * , / : ; < > ? ¥ ^ |
-
構文エラーで表名を抽出できなかったCRUD操作文がプログラムにある場合,表名として「== SQL構文エラー ==」が,ソース解析情報(HTMLファイル形式)に出力されます。
-
未定義のカーソル名を指定したOPEN文やFETCH文がプログラムにある場合,表名として「== カーソル名未定義 ==」が,ソース解析情報(HTMLファイル形式)に出力されます。
-
CRUD情報の抽出例
COBOLソースファイルからCRUD情報を抽出する例を次に示します。
- COBOLソースファイルの例
IDENTIFICATION DIVISION. PROGRAM-ID. データ追加. : EXEC SQL INSERT INTO TBL1(CLM1,CLM2) VALUES( (SELECT MIN(CLM3) FROM TBL2), NULL ) END-EXEC. : END PROGRAM データ追加. IDENTIFICATION DIVISION. PROGRAM-ID. データ検索. : EXEC SQL DECLARE CSR1 CURSOR FOR SELECT * FROM TBL1 WHERE CLM1 = :PARAM END-EXEC. EXEC SQL OPEN CSR1 END-EXEC. : EXEC SQL FETCH CSR1 INTO :CLM1-VALUE, :CLM2-VALUE END-EXEC. : EXEC SQL CLOSE CSR1 END-EXEC. : END PROGRAM データ検索. IDENTIFICATION DIVISION. PROGRAM-ID. データ更新. : EXEC SQL UPDATE TBL1 SET CLM2=(SELECT MAX(CLM3) FROM TBL2) WHERE CLM1 = :PARAM END-EXEC. : END PROGRAM データ更新. IDENTIFICATION DIVISION. PROGRAM-ID. データ削除. : EXEC SQL DELETE FROM TBL1 WHERE CLM1 = :PARAM END-EXEC. : END PROGRAM データ削除.
- CRUD情報の抽出結果
-
表名
CRUD操作を行うプログラム名
CRUD操作種別
備考
TBL1
データ追加
C
INSERT文のCRUD操作
データ検索
R
OPEN文/FETCH文のCRUD操作
データ更新
U
UPDATE文のCRUD操作
データ削除
D
DELETE文のCRUD操作
TBL2
データ追加
R
INSERT文の副問合せのCRUD操作
データ更新
R
UPDATE文の副問合せのCRUD操作
注意事項
-
ソースファイルの種別に応じた-SQLコンパイラオプションを指定して解析してください。
ソースファイルの種別と-SQLコンパイラオプションの対応を次に示します。
ソースファイルの種別
-SQLコンパイラオプションの指定有無
指定なし
-SQL,XDMコンパイラオプションの指定あり
-SQL,ODBCコンパイラオプションの指定あり
COBOL2002のODBCインタフェース用COBOLソースファイル
◎
○※1
○※2
XDM/RDの埋め込みSQLを含むCOBOLソースファイル
△※3
○※1
×
COBOL言語用SQLプリプロセサのUAPソースファイル
◎
○※1
×
-
データベース管理システムのエンハンスで追加または変更されたSQLの構文では,CRUD操作情報が抽出できないことがあります。
-
COBOL言語用SQLプリプロセサのUAPソースファイルを解析する場合,SQLプリプロセサでエラーがないことが前提となります。SQL文が正しくないと,次のような解析結果となることがあります。
-
構文エラーを示す警告メッセージが出力され,そのSQL文のCRUD操作情報が抽出されない
-
表名ではないSQL識別子や定数が表名として表示される
-
データベース管理システムで定義するSQLの予約語が表名として表示される
-
-
動的SQLのための構文が指定されているSQL文は,CRUD操作情報の抽出対象にはなりません。
COBOLソースファイルに次のSQL文が記述されている場合は,CRUD操作情報の抽出対象外であることを示す警告メッセージが表示されます。
-
FOR句にSQL識別子が指定されているDECLARE CURSOR文
-
カーソル指定の文脈に埋め込み変数が指定されているOPEN文またはFETCH文
-
-
動的SQLまたはSQL手続きを実行するEXECUTE文は,CRUD操作情報の抽出対象にはなりません。
COBOLソースファイルに次のSQL文が記述されている場合は,CRUD操作情報の抽出対象外であることを示す警告メッセージが表示されます。
-
EXECUTE文
-
EXECUTE IMMEDIATE文
-
-
リスト名を使ったSELECT文や問合せは,CRUD操作情報の抽出対象にはなりません。
COBOLソースファイルに次のSQL文がが記述されている場合は,CRUD操作情報の抽出対象外であることを示す警告メッセージが表示されます。
-
リスト名を使ったSELECT文
-
リスト名を使った問合せ
-
-
WITH句(WITH 問合せ名〜)を用いた問合せ式は,DECLARE CURSOR文には指定できません。
WITH句(WITH 問合せ名〜)を用いた問合せ式がDECLARE CURSOR文に指定されている場合,SQL文が解析できないことを示すコンパイラのメッセージが表示されます。また,カーソル名未定義のコンパイルエラーが,そのDECLARE CURSOR文のカーソル名を参照するOPEN文で表示されます。
-
-SQLコンパイラオプションの指定なしでCOBOL言語用SQLプリプロセサのUAPソースファイルを解析した場合,次のどれかの条件を満たすSQL文に対してコンパイラで解析できないことを示すメッセージが表示されます。ただし,Sレベル以上のコンパイルエラーが出力されていないかぎり,COBOLソース解析のCRUD情報の解析には影響ありません。
-
カーソル名を引用符(")で囲んでいる
-
カーソル名に記号(#,$)を使用している
-
SQLのコメント指定(/*〜*/)を使用している
-
-
開発マネージャにCOBOL用SQLプリプロセサのUAPソースファイルを登録する場合に,SQLプリプロセサを実行してプリプロセス後のCOBOLソースファイルを生成する設定で登録したとき,ソース解析プロジェクトの解析の実行で解析されるのはプリプロセス後のCOBOLソースファイルとなります。プリプロセス後のCOBOLソースファイルは埋め込みSQL文を含まないため,表(DB)一覧や表(DB)詳細などのCRUD情報のドキュメントは作成されません。CRUD情報のドキュメントが必要な場合は,cblcsaコマンドを使って,プリプロセス前のSQLプリプロセサのUAPソースファイルを解析/生成してください。