やさしくわかるPro*COBOL - SQL通信領域(SQLCA) -

  • 前ページにて、SQL命令のエラー時の処理やカーソルループの脱出処理などWHENEVER命令について説明してきましたが、もっと詳しく処理の結果を知りたいために、Pro*COBOLの内部変数について説明します。この領域を『SQL通信領域』(=SQLCA)と言います。
  • この領域は、DATA DIVISIONにてホスト変数を宣言した後、INCLUDE SQLCAと記述したSQLCAというCOBOLのCOPYファイルに宣言されています。
  •   1. SQLCODE  ・・・ エラーコード (各SQL命令を実行した後格納される。ORA-xxxxxの値。0が正常)
  •   2. SQLERRM  ・・・ エラーメッセージ (VARYING型のため、SQLERRML=文字長と、SQLERRMC=文字列格納領域がある)
  •   3. SQLERRD(3) ・・・ 実行した処理件数が入ります。
  •   4. SQLWARN1  ・・・ ホスト変数の桁数が少なく文字列の切捨てが発生した場合“W”が入ります。
  •   5. SQLWARN3  ・・・ SELECT句にて指定した列数より、INTO句のホスト変数の数が少ない場合“W”が入ります。多いとエラーになります。
  •   6. SQLWARN4  ・・・ UPDATE命令やDELETE命令にWHERE句がない場合“W”が入ります。
  • 上記3のSQLERRD(3)について説明します。下記のプログラムは正しいですか?
  • == 問題 ==
    000000   MOVE "MANEGER" TO JOB.
    111111   EXEC SQL UPDATE emp SET sal = sal * 1.2
    111111         WHERE job = :JOB            END-EXEC.

  • コンパイルもエラー無く正常に行われ、実行してもエラー処理ルーチンに移らず正常に終了しました。これにて単体テストは終了?
  • それでは、SQLERRD(3)に処理件数が入っているので表示してみましょう。
  • 000000   MOVE "MANEGER" TO JOB.
    111111   EXEC SQL UPDATE emp SET sal = sal * 1.2
    111111         WHERE job = :JOB            END-EXEC.
    000000   DISPLAY SQLERRD(3).

  • 実行すると、処理件数が0と表示されました。なぜでしょうか?
  • よく見ると、“MANAGER”のつづりが間違っていました。
  • 000000   MOVE "MANAGER" TO JOB.
    111111   EXEC SQL UPDATE emp SET sal = sal * 1.2
    111111         WHERE job = :JOB            END-EXEC.
    000000   DISPLAY SQLERRD(3).

  • これを実行すると処理件数が表示されました。めでたしめでたし!
  • このように、自分がイメージしている処理通り行われているかチェックすることができます。
  • 000000   MOVE "MANEGER" TO JOB.
    111111   EXEC SQL UPDATE emp SET sal = sal * 1.2
    111111         WHERE job = :JOB            END-EXEC.
    000000   IF SQLERRD(3) = 0 THEN
    000000     DISPLAY "処理対象がありませんでした。" JOB
    000000   END-IF.

  • 上記のようなチェックをプログラムの中に記述しておくと、思いがけないバグを単体テストの段階で発見できます。
  • 次に良く記述する例を挙げます。
  • == 例 ==
    000000   MOVE 7789 TO ENO.
    111111   EXEC SQL UPDATE emp SET sal = sal * 1.2
    111111         WHERE empno = :ENO           END-EXEC.
    000000   IF SQLERRD(3) NOT = 1 THEN
    000000     DISPLAY "処理対象が不当です。" ENO
    000000   END-IF.

  • 上記のように、WHERE <主キー> = の場合、必ず処理件数は1件になります。
  • この例は、empno=7788を間違って7789と記述していることを発見できました。
  • このように、SQL-DML(INSERT/UPDATE/DELETE)命令のすぐ後ろに処理件数(SQLERRD(3))をチェックするIF文を追加しておくと、精度の高いシステムを構築することができます。
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值