Hitachi

COBOL2002 Professional Tool Kit COBOLソース解析ガイド


10.7 埋め込みSQL文を含むCOBOLソースファイルの解析

埋め込みSQL文を含むCOBOLソースファイルの解析方法について説明します。

COBOLソース解析では,埋め込みSQL文を含むCOBOLソースファイルを解析して,埋め込みSQL文から表に対するデータ操作(CRUD操作)の情報を抽出します。抽出対象となるCRUD操作の情報(CRUD操作情報)を次に示します。

COBOLソース解析では,すべてのCOBOLソースファイルを解析したあとに,システム全体のすべてのCRUD操作情報を分析し,各表(DB)に対して,どのプログラムが表データの生成(Create),読み取り(Read),更新(Update),削除(Delete)を実行しているかを示す情報(CRUD情報)を生成します。

[表(DB)詳細]画面でのCRUD情報の表示例を次に示します。

図10‒3 [表(DB)詳細]画面でのCRUD情報の表示例

[図データ]

CRUD情報を使用すると,表データのライフサイクルに関係するプログラムを確認できるため,次の作業を効率的かつ効果的に実施できます。

解析対象の埋め込みSQL文を含むCOBOLソースファイル

COBOLソース解析では,次に示すSQL埋め込みCOBOLソースファイル(埋め込みSQL文を含むCOBOLソースファイル)を解析対象とします。

解析対象の埋め込み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操作種別を次の表に示します。

表10‒7 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文

上記以外の操作

−

(凡例)

C:CRUD操作種別として作成(Create)を抽出します。

R:CRUD操作種別として読み取り(Read)を抽出します。

U:CRUD操作種別として更新(Update)を抽出します。

D:CRUD操作種別として削除(Delete)を抽出します。

−:CRUD操作文でない埋め込みSQL文です。このSQL文は無視されます。

注※1

問合せ式や副問合せに指定された表名に対するCRUD操作情報です。

注※2

カーソルを定義するDECLARE CURSOR文の問合せに指定された表名のCRUD操作情報です。

解析対象SQL文の表参照

COBOLソース解析で解析対象になるSQL文の表参照の形式を次に示します。

{〔認可識別子.〕 表識別子 〔句〕…|
  導出表副問合せ 〔句〕…|
  〔(〕 表参照 {INNER|{LEFT|RIGHT} 〔OUTER〕|{CROSS|FULL}} JOIN 表参照 ON 結合条件 〔)〕}
注意事項

認可識別子はスキーマ名またはスキーマ認可識別子です。表識別子は,実表名,ビュー表名または問合せ名です。相関名はCRUD情報の抽出対象になりません。

構文的なコンパイルエラーのあるSQL文の扱い

COBOLソース解析では,構文的なコンパイルエラーがないものを解析対象としています。このため,SQL文に構文エラーがあってもエラーメッセージは出力しません。ただし,SQL文から正しい表名が抽出できない場合は,次に示す警告メッセージを出力します。

表10‒8 正しい表名が抽出できない場合に出力する警告メッセージとSQL文の扱い

構文エラーで出力する警告メッセージ

メッセージの出力条件

SQL文の扱い

KEDL1277A-W

埋め込みSQL文に構文エラーがあるため表名を抽出できませんでした。SQL文=(*** 1 ***)

  • 表名の文脈を検出するための予約語が見つからない。

  • 表名やカーソル名の文脈に予約語や分離符の記号(引用符を除く)が現れた。

「== SQL構文エラー ==」を表名としてCRUD操作情報を抽出します。

[表(DB)詳細]画面では,表名「== SQL構文エラー ==」に,SQL文で構文エラーがあるプログラムの一覧が表示されます。

KEDL1278A-W

SQL識別子(*** 1 ***)が不正な文字を含んでいます。@に置き換えます。

  • SQL識別子の通常識別子が英数字文字,下線,$,#,半角カナ文字以外の半角文字を含んでいる。

不正な文字を@に置き換えます。

KEDL1279A-W

*** 1 ***文(SQL)に指定されたカーソル名(*** 2 ***)の定義が見つからないため表名を抽出できませんでした。

  • OPEN文やFETCH文に指定されたカーソル名を定義するDELCLARE CORSOR文が見つからない。

「== カーソル名未定義 ==」を表名としてCRUD操作情報を抽出します。

[表(DB)詳細]画面では,表名「== カーソル名未定義 ==」に,SQL文でカーソル名未定義エラーがあるプログラムの一覧が表示されます。

CRUD情報を出力するソース解析情報

CRUD情報を出力するソース解析情報(HTMLファイル形式,CSVファイル形式)を次の表に示します。

表10‒9 CRUD情報を出力するソース解析情報

項番

ソース解析情報

CRUD情報の出力項目

1

表(DB)一覧

  • 表名※1

  • 入出力種別(CRUD操作種別※2)

  • 使用プログラム数

2

表(DB)詳細

  • 表名※1

  • 使用プログラム数

  • CRUDの分布

  • 使用プログラム名

  • 入出力種別(CRUD操作種別※2)

3

プログラム詳細の表(DB)一覧

  • 表名※1

  • 入出力種別(CRUD操作種別※2)

4

セクション階層図

  • 表名※1

  • 入出力種別(CRUD操作種別※2)

5

プログラム階層図

  • 表名※1

  • 入出力種別(CRUD操作種別※2)

6

表(DB)参照関係CSV

  • 表名※1

  • 使用プログラム名

  • 入出力種別(CRUD操作種別※2)

注※1

表名は,次の形式で出力します。

〔認可識別子.〕 表識別子

注※2

CRUD操作種別は,C,R,U,Dの順序で出力されます。

例えば,表データに対して生成(Create),更新(Update),読み取り(Read)を操作したCRUD操作文の場合,CRUD操作種別には「CRU」が出力されます。

注意事項
  • 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操作

注意事項