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操作

注意事項