データベースのテーブル操作/SELECT


SELECTステートメントは、テーブルを参照するためのステートメントです。      
売上テーブルから任意のお客様番号、売上年月、商品番号をキーとして全ての項目を参照するためのSQLを記述してみます。      
参照するキーは、お客様番号=CUST01、売上年月=200001、商品番号=A0000001とします。

 SALTBL(売上テーブル)

お客様番号 売上年月 商品番号 単価 数量 金額
CUSTCD(6桁) SALYM(6桁) SYOHIN(8桁) TANKA(6桁) SURYO(6桁) KINGAKU(6桁)
CUST01 200001 A0000001 1000 10 10000
CUST01 200001 B0000001 2000 10 20000
CUST02 200001 A0000001 3000 10 30000

(1)売上テーブルを参照するSQL      
EXEC SQL      
     SELECT * FROM SALTBL      
       WHERE CUSTCD = ‘CUST01’      
         AND SALYM  = ‘200001’      
         AND SYOHIN = ‘A0000001’      
END-EXEC.      
      
(2)参照した結果を判定する      
EVALUATE SQLCODE      
  WHEN   ZERO      
         参照できた場合の処理を行う      
  WHEN   100      
         対象のキーが存在しない処理を行う      
  WHEN   OTHER      
         異常発生時の処理を行う      
END-EVALUATE.      
      
(1)の部分がSQLステートメントです。      
①SQLを記述する場合、先頭に「EXEC SQL」最後に「END-EXEC」      
と記述します。      
②「SELECT」は、テーブルを参照する場合に記述します。      
③「*」は、テーブルの項目全てを参照する場合に記述します。      
 「*」の代わりに以下のように記述することもできます。      
 コーディング規則で「*」を使用禁止としている企業も少なくありません。      
      
   SELECT      
   CUSTCD,      
      SALYM,      
      SYOHIN,      
      TANKA,      
      SURYO,      
      KINGAKU      
     FROM SALTBL      
     INTO      
   :CUSTCD,      
      :SALYM,      
      :SYOHIN,      
      :TANKA,      
      :SURYO,      
      :KINGAKU      
     WHERE CUSTCD = ‘CUST01’      
       AND SALYM  = ‘200001’      
       AND SYOHIN = ‘A0000001’      
      
(2)はSQLで参照した結果を判定して、対応する処理を行います。      
結果の判定はSQLCODEという項目名の値を判定します。
DBMSの種類によって、SQLCODEの値の意味が異なりますので注意が必要です。
ここではIBMのDB2を使用した場合を想定しています。
正常に参照できた場合、SQLCODEはZEROになりますので、参照項目を使用した処理を行います。
対象データが存在しない場合、SQLCODEは-100になりますので、参照項目は使用できません。 
この場合は、対象なしの処理を行います。      
上記いずれでもない場合は、異常状態ですからこれ以上処理を継続することはできません。      
一般的な処理は、異常状態を知らせる処理を行って終了します。      
補足ですが、テーブルを定義するときにユニークキー項目(重複しないキー)を定義する必要があります。      
ここで記述したSELECTを発行する場合、ユニークキーを使用するか、重複しないキー項目をキーとして参照しなければなりません。      
対象データが複数存在した場合、SQLCODEはZEROでも-100でもない値となり異常状態となってしまいます。      
SQLを発行できるツールの動作では複数データ参照可能ですが、COBOLで使用するSELECTでは1回のSQLで複数データを参照することはできません。      


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です