COBOL プログラミングでのエラーの原因を解析

このQ&Aのポイント
  • COBOL プログラミングでのエラーの原因を解析します。文法の間違いを指摘していただけると助かります。
  • COBOL プログラミングでのエラーが発生していますが、どこが間違っているのかよくわかりません。間違いの指摘をお願いします。
  • COBOL プログラミングでのエラーが発生しており、文法の間違いを探しています。問題の箇所をご指摘いただけますか?
回答を見る
  • ベストアンサー

COBOL プログラミング

以下の処理でエラーがでてしまっていますがどこが間違っているのかよくわかりません。 文法の間違いを指摘していただけますでしょうか?? ROWNUM と副問い合わせを使用したプログラムです。  ただし全角半角はエラーに含まないものとします。 よろしくお願いいたします。             IF MECIDENPYO_NO NOT = SPACE  THEN   EXEC SQL    SELECT  SKA_SAKI_CD --出荷先           ,SKA_TYPE --出荷タイプ    INTO :A. SKA_SAKI_CD,        :A. SKA_TYPE   FROM (SELECT  SKA_SAKI_CD --出荷先              ,SKA_TYPE --出荷タイプ        INTO   :A. SKA_SAKI_CD,              :A. SKA_TYPE FROM  テーブル名 * WHERE SKA_SLIP_NO LIKE '____' || :HST-EDIT_BIKOU AND DEL_FLG = '0' * ORDER BY INCE_DATE DESC) WHERE ROWNUM <=1 END-EXEC END-IF.

noname#179158
noname#179158

質問者が選んだベストアンサー

  • ベストアンサー
  • ricman
  • ベストアンサー率58% (10/17)
回答No.1

:A. SKA_ の記述 . は使えないとおみます。

noname#179158
質問者

お礼

ありがとうございます!!解決しました

関連するQ&A

  • COBOL プログラミング

    課題で「DBからデータを取得する際、それぞれの項目から登録日が最新のデータを1件取得する」という課題をしています。 そこで以下のような処理のプログラムを書きました。 IF MECIDENPYO_NO NOT = SPACE EXEC SQL SELECT  SKA_SAKI_CD --出荷先        ,SKA_TYPE --出荷タイプ INTO :A. SKA_SAKI_CD,   :A. SKA_TYPE FROM テーブル名 WHERE SKA_SLIP_NO LIKE '____' || :HST-EDIT_BIKOU AND DEL_FLG = '0' AND INS_DATE =(SELECT MAX(INS_DATE) FROM テーブル名 END-EXEC END-IF 上記の処理だとテーブルの中で登録日(INS_DATE)の最大値であるデータ1件だけしか取得できません。 私が実現したい機能はたとえば Aという項目とBという項目があったとして      登録日 A    2011/9/9 A 2011/9/11 A 2011/9/10 B 2011/8/9 B 2011/8/18 B 2011/9/20 Aの中で登録日が最新(最大)である A 2011/9/11 Aの中で登録日が最新(最大)である B 2011/9/20 を取得する処理を実現したいです!! これを実現するにはORDER BY して降順に並べた後に、ROWNUMを使うらしいのですが よくわかりません。どなたかプログラムで書いていただけますかか?? ヒントや考え方でもかまいません よろしくお願いいたします。

  • COBOL 登録日が最新のデータを取得

    課題で「DBからデータを取得する際、登録日が最新のデータを1件取得する」という課題をしています。 そこで以下のような処理のプログラムを書きました。 IF MECIDENPYO_NO NOT = SPACE EXEC SQL SELECT  MAX(INS_DATE),     --登録日    MAX(SKA_SAKI_CD), --出荷先    MAX(SKA_TYPE) --出荷タイプ INTO :A. INS_DATE,   :A. SKA_SAKI_CD,   :A. SKA_TYPE FROM テーブル名 END-EXEC END-IF ・質問1 まず1件情報を取得する方法にはFETCHがありますが、今回はFETCHは使わないとの指定です。 FETCH以外に同じような処理ができる方法はありますか?? ・質問2 上記の処理だとそれぞれのレコードの最大値がバラバラになって取れてしまうため正確な データを取得できません。  ヒントには副問い合わせを使うというふうにかいてあったのですが、 いまいちnetで調べてもよくわかりません 「データを取得する際最新の登録日のモノを取得する処理」をプログラムで書くとするとどのように書けばよいのでしょうか?? よろしくお願いいたします。

  • COBOL プログラミング

    プログラミングでコンパイルエラーがでて困っています。 問題があったら 指摘していただきたいです。 IF文の条件に合致したときは上のSELECT文 合致しなかったときは下のSELECT文を実行するプログラム コンパイルエラーの内容 条件中のオペランドに誤りがあります。                IF文の書き方が不完全です。 :VSL.MECIDENPYO_NO は定義がなされているものとします IF  :VSL.MECIDENPYO_NO NOT = SPACE EXEC SQL SELECT  抽出したい項目1,  抽出したい項目2, 抽出したい項目3, 抽出したい項目4            * FROM テーブル名 * WHERE 条件1 AND 条件2 AND 条件3   END-EXEC ELSE EXEC SQL     SELECT   抽出したい項目1,  抽出したい項目2, 抽出したい項目3, 抽出したい項目4            * FROM テーブル名 WHERE 条件1 AND 条件2 END-EXEC   END-IF

  • ROWNUMについて

    OracleでROWNUMを使用すると処理速度はアップするのでしょうか? (例)TESTテーブル(PK:KOJIN_NO)には、10万件 (1)ROWNUM 使用 SELECT KOJIN_NO, SHIMEI FROM TEST WHERE KBN = 1 ROWNUM < 101 (2)ROWNUM 未使用 SELECT KOJIN_NO, SHIMEI FROM TEST WHERE KBN = 1 この場合、(1)と(2)ではやっぱり(1)の方が処理速度は速いのでしょうか? 実際、試したところROWNUMを使用したSQLの方が遅い気がしました。 SQL初心者なので、詳しく分かりません。 お願い致しますm(__)m

  • ROW_NUMBER()を使用したデータ取得

    ROW_NUMBER()を使用してORDERした結果の5行目から10行目を 取得したい場合、どこのサイトを参照しても下記(1)のように NOで並び替えたデータをインラインビューとして WHERE RNUM BETWEEN 5 AND 10 と条件を絞っていますが、(2)のように直接条件を指定した場合と どのような違いがあるのか教えてください。 (1) SELECT NO, NAME FROM ( SELECT NO, NAME, ROW_NUMBER() OVER (ORDER BY NO) RNUM FROM ROWNUM_TEST ) WHERE RNUM BETWEEN 5 AND 10 (2) SELECT NO, NAME,ROW_NUMBER() OVER (ORDER BY NO) RNUM FROM ROWNUM_TEST WHERE RNUM BETWEEN 5 AND 10

  • ROWNUMでUPDATEをしたいのですが・・・。

    SQL初心者です。 以下のようなテーブルがあり、 ESTAB/PATTERN/NUMBER/CD 1/00/ 1/01 1/00/ 3/02 1/00/ 4/04 1/00/ 5/05 7/00/ 1/01 7/00/ 2/03 7/00/ 3/04 7/00/ 4/05 (主キー=ESTAB、PATTERN、NUMBER) SELECT ROWNUM,ESTAB,PATTERN,NUMBER,CD FROM (SELECT ESTAB,PATTERN,NUMBER,CD FROM M_PATTERN WHERE PATTERN='00' AND ESTAB='1' ORDER BY NUMBER) WHERE PATTERN='00' AND ESTAB='1' で検索したところの、ROWNUMでNUMBERを更新したいのですが、 UPDATE M_PATTERN A SET A.NUMBER= (SELECT ROWNUM FROM (SELECT ESTAB,PATTERN,NUMBER FROM M_PATTERN WHERE PATURN='00' AND ESTAB='1' ORDER BY NUMBER) B WHERE A.NUMBER=B.NUMBER AND A.PATTERN=B.PATTERN AND A.ESTAB=B.ESTAB AND B.PATTERN='00' AND B.ESTAB='1') WHERE A.PATTERN='00' AND A.ESTAB='1' としてみたところ、一意制約違反が発生してしまいます。 それとも、このようなUPDATEは無理なんでしょうか?

  • Pro COBOLでは、最後執行したSQL文を取得したい

    【背景】バッチプログラムを実行中、トラブルが発生した場合、どのSQL文が発行されてトラブルになったか知りたいです。   例えば、EXEC SQL SELECT * FROM USE_TABLE WHERE USE_ID=:USE_ID直後でトラブルになった場合、仮に:USE_ID='yxy19700804'でしたら、COBOLがOracleにEXEC SQL SELECT * FROM USE_TABLE WHERE USE_ID='yxy19700804'といったSQL文を発行した直後、トラブルになります。「EXEC SQL SELECT * FROM USE_TABLE WHERE USE_ID='yxy19700804'」をシステム的に取得方法がありますか?

  • SQL文でどこが悪いのか教えて下さい

    初心者ですが教えて下さい。 表Aと表Bで表Aに含まれていないものを表Cに入れたいのですが、下記のやり方では表Aのものしか入れることができません。 どこが悪いのか教えて下さい。 ・コードは複雑なため、簡略化しています。UNIONは使わない方向で。 CREATE OR REPLACE PROCEDURE SAMPLE IS CURSOR SELLINE1 IS SELECT * FROM A ORDER BY KEY1,KEY2; CURSOR SELLINE2 IS SELECT * FROM B ORDER BY KEY1,KEY2; CNT1 NUMBER; CNT2 NUMBER; BEGIN SELECT COUNT(*) INTO CNT1 FROM C; IF CNT1 = 0 THEN FOR SELREC IN SELLINE1 LOOP INSERT INTO C VALUES (KEY1,KEY2,値);COMMIT; END LOOP; FOR SELREC IN SELLINE2 LOOP SELECT COUNT(*) INTO CNT2 FROM C WHERE (KEY1 = SELREC.KEY1) AND (KEY2 = SELREC.KEY2); IF CHK_CNT2 = 0 THEN INSERT INTO C VALUES (KEY1,KEY2,値);COMMIT; END IF; END LOOP; END IF; END; /

  • sqlのwhereで指定した条件の前後を取得したい

    テーブル=T) KEY DATA 001 あ 002 い 003 う 004 え 005 お SQL) SELECT DATA FROM T WHERE KEY = 003 ; 上記のSQLでは、「う」のデータしか取得できませんが、 「003」の前後1件、合計3件の「い」「う」「え」を取得する方法を教えて下さい。 ちなみに、 SELECT DATA FROM T WHERE KEY >= 003 AND ROWNUM <= 2 と SELECT * FROM ( SELECT DATA FROM T WHERE KEY < 003 ORDER BY KEY DESC ) WHERE ROWNUM < 1 のUNIONでは上手く行きませんでした。 よろしくお願いします。

  • 判定処理について

    カテゴリーが異なっていたらすみませんm(_ _)m 宜しくお願い致します。 ---------------------------------- EXEC SQL BEGIN DECLARE SECTION;  VARCHAR type[3]; EXEC SQL END DECLARE SECTION; EXEC SQL SELECT data_type into :type FROM test_tbl WHERE name='test'; type.arr[type.len]='\0'; if(type.arr == '01'){ /* 処理Aへ */ }else{ /* 処理Bへ */ } --------------------------------------- 上記のようなプログラムがあります。 table_testのnameフィールドが'name'の date_typeフィールドの値を取得します。 取得したdate_typeフィールドの値が'01'なら 処理Aへ、'02'、'03'等なら処理Bを実行したいと 考えています。 ですが、上記の if(type.arr == '01'){ だとエラーが発生しています。 どのようにすればチェックすることができるでしょうか? ちなみに date_typeフィールドはかならずデータがはいっている。 nameはprimary keyの設定のため重複は存在しません。 DBはORACLE、言語はPro*Cです。 どうか宜しくお願い致します。m(_ _)m

専門家に質問してみよう