• 締切済み

PRO COBOLでFETCH時に値を変換する

PRO COBOLでoracleデータを読み込むプログラムを変更しようとしています。 元のプログラムは、 ----------------------------- WORKING-STORAGE SECTION. EXEC SQL DECLARE table10c CURSOR FOR SELECT table10.item11, table10.item12 FROM table10,table20 WHERE table10.item13 = table20.item23 END-EXEC --- PROCEDURE DIVISION. EXEC SQL FETCH table10c INTO file-item11, ←出力ファイルの項目1 file-item12 ←出力ファイルの項目2 END-EXEC. ----------------------------- となっていて、item13 と等しい値が table20.item23 にある場合 item11 と item12 の値を順次、ファイルに出力しています。 今回、仕様を変更し、item11の値を変換してファイルに 出力しようとしています。 変換する値は、テーブル:henkan に登録しています。 項目1:old-item ・・・table10.item11にセットしている値 項目2:new-item ・・・file-item11にセットしたい値 WHERE句の条件は、そのままです。 (WHERE table10.item13 = table20.item23) 但し、item11の値は全て変換するわけではなく、 テーブル:henkan に一致するレコードが有る場合のみ つまり table10.item11 = henkan.old-item の場合のみ file-item11 に henkan.new-item の値を出力し、 それ以外の場合には、table10.item11 の値をセットします。 この変更を極力少ないロジックの改修で済ませたく 基本的には 「DECLARE table10c CURSOR」句の変更と したいです。 「SELECT table10.item11,」の項目を変数にして 変換した場合は、henkan.new-item の値をセットし 変換しない場合には、table10.item11 の値をセットできれば 良いのではないかと思っていますが具体的な方法が判りません。 同様の変更を(出力条件等の異なる)複数のプログラムに 行うつもりで「PROCEDURE DIVISION」は、複雑になっているため 変更は最小限としたいです。 PRO COBOLの経験が少なく、アドバイスをお願いします。

  • fromJ
  • お礼率100% (1/1)

みんなの回答

  • maiko0318
  • ベストアンサー率21% (1483/6970)
回答No.1

EXEC SQL DECLARE table10c CURSOR FOR SELECT henkan.new_item, table10.item12 FROM table10,table20,henkan WHERE table10.item13 = table20.item23 and table10.item11 = henkan.old_item union SELECT table10.item11, table10.item12 FROM table10,table20 WHERE table10.item13 = table20.item23 and table10.item11 not in(select henkan.old_item from henkan) END-EXEC henkanテーブルですが、ハイフンはマイナスとして処理されますので、 使うならアンダーバーを使用してください。 henkan.old_item,henkan.new_item テストしておりませんので、テストしてみてください。

fromJ
質問者

お礼

早い回答ありがとうございます。 試してみます。

関連するQ&A

  • 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'」をシステム的に取得方法がありますか?

  • プライマリーキーで同じ値をUPDATEするとまずいですか?

    update test_table set プライマリーキー=1,項目2="test" where プライマリーキー=1 のように面倒くさいので、プライマリーキーもset句に書くと、 パフォーマンスが遅くなったりするでしょうか? と言いますか、MySQLでWHERE句と同一値のプライマリーキーは 内部的に更新が行われるのでしょうか?

    • ベストアンサー
    • MySQL
  • COBOLで全角変換を行いたいのですが...

    汎用機(ACOS-4)でCOBOLを使って開発を行っている者です。 INファイルのある項目を全角変換し、 OUTファイルに出力するプログラムを作成しています。 ただ困った事に変換元の項目の内容が 半角のデータ、全角のデータ、半角全角が混在しているデータもあるのです。 現在は項目の中に半角スペースの文字コードが存在すれば全て半角とし、 以外は全て全角と判断しています。 もちろん項目中のデータが全て埋まっている場合や、 半角全角が混在しているデータについては文字化けを起こしています。 どなたかこのような変換について良い方法があればご教授願います。 宜しくお願い致します。

  • FETCH した行が取り出せない

    こんにちは pgAdmin3を使用しています。  条件に一致する行を複数取得して、その行に対してアップデートをかけたいです。アップデートの処理がややこしいので一文で書かず、カーソルを使用して一行づつ処理をしていきたいのですが、下記で カーソル名.列名で値の取得が出来ないようです。 missing FROM-clause entry in subquery for table "car" BEGIN;   DECLARE car CURSOR IS ~抽出条件 FETCH ALL IN car;   UPDATE ・・・ WHERE clm_name = car.clm_name CLOSE car; END;  postgresqlが不慣れで、ネットで調べては色々変えてやってみているのですが、ここで詰まってしまいました。  カーソル内のカラムの取得方法についてご教示下さる方が居れば助かります。

  • COBOL FILLER

    COBOLのFILLER項目の出力を質問させていただきます。 質問1 OUT1-FILE. 01 OUT-REC  02 FILLER PIC X(10). このファイルを何もせず WRITE で出力した場合は空ファイルが出力されますか?それとも"0000000000"が出力されますか? 質問2 またこのファイルをINITHILIZEした後WRITEでファイル出力したら何が出力されますか? 質問3 このファイルをMOVE ZERO TO OUT-REC した後WRITEでファイル出力したら何が出力されますか?

  • pro*cobol ⇔ oracle のデータ型の扱い

    お世話になります。 pro*cobolで、テーブルの作業領域を定義し、 データの編集後、oracleのテーブルへ出力している のですが、cobol側の定義はpic9タイプで oracleの項目定義ではCHAR型になっております。 この状態で、cobol側のpic9タイプの項目に "A00001"等文字を含む値を設定した所、 ABENDせずにoracleテーブルに"A00001"の 項目値を出力しています。 cobolだけに限れば、属性エラーなのですが、 この場合、oracleの項目定義が優先されるのでしょうか? よろしくご教授の程、お願い申し上げます。

  • VB DB更新時にパラメーターへ値のセット

    データベースの更新についてご指導下さい。 VB2010からSQLサーバーのデータベースに接続しております。 dataAdapter.Updateによりデータベースを更新する際の パラメーターへ値をセットする方法を教えて下さい。 テーブル名Test Code Name ------------ A   Suzuki 希望する処理 テキストボックスに入力された名前に変更 例) Suzuki → Yamada ○フォームの変数として定義 Dim dataAdapter As New SqlDataAdapter Dim dataSet As New DataSet ○FormLoad時にSelectCommandとUpdateCommandを設定 Dim SQL As String = "" Dim command As SqlCommand Dim connection As SqlConnection = New SqlConnection(~) SQL = "SELECT * FROM Test WHERE Code = @code " command = New SqlCommand(SQL, connection) dataAdapter.SelectCommand = command dataAdapter.SelectCommand.Parameters.Add("@code", SqlDbType.Char) SQL = "UPDATE Test SET Name = @name WHERE Code = @code" command = New SqlCommand(SQL, connection) dataAdapter.UpdateCommand = command dataAdapter.UpdateCommand.Parameters.Add("@code", SqlDbType.Char) dataAdapter.UpdateCommand.Parameters.Add("@name", SqlDbType.Text, 50) ○データ表示時にはこれで表示されました。 dataAdapter.SelectCommand.Parameters.Item("@code").Value = ComboBoxCode.text dataAdapter.Fill(dataSet) ○このSelectCommandを参考にこのように書いて見たのですが更新されません。 dataAdapter.UpdateCommand.Parameters.Item("@code").Value = ComboBoxCode.Text dataAdapter.UpdateCommand.Parameters.Item("@name").Value = TextBoxName.Text dataAdapter.Update(dataSet) どのようにしたら実行時にパラメーター化したところへデータをセットできるのでしょうか? データセットに値が入っていないのでは?と予想したのですが…。

  • Timestamp(?)の値を変換したい

    画面遷移の正当性をチェックしたり、キャッシュ利用を防ぐために、Postdataに現在日時を数値化した値(TimeStamp?)がセットされていたりする場合があります。 ex.1205558668656 この値をExcelやVBAなどでYYYY/MM/DD hh:mm:ssの形式に変換したいのですが、どのように行えばよいのでしょうか。

  • COBOLで文字タイプを数字タイプに変換する方法

    すいませんコボル初心者の者です。周りに聞く人がいずに困っています。 アドバイスよろしくおねがします。 例えば、IN-SUNPO PIC X(7)に "0.25"や"0.025"と値が入っているとします。 この項目を OUT-SUNPO PIC 9(4)V9(3)にセットして出力したいのですが いい方法が考えつきません。 どのようにすれば実現するのでしょうか。 また、IN-TANAK PIC 9(8)をOUT-TANKA PIC X(10)に左詰でセットするために 入力項目の頭のゼロをどう処理していいかもわかりません。 考えても結論がでませんでしたので、投稿しました。 宜しくお願いします。

  • COUNTについて

    今2つのテーブル(table1には商品IDと商品名、table2にはレシートIDと商品ID)を用い、 table1にある商品がtable2に何回登場しているかCOUNTを用いて数えたいのですが、 1回も登場しない商品が結果に表示されなくて困っています。 以下の様なテーブルを用いています。 [table1] 項目:item_id(主キー)|name 0|"item0" 1|"item1" 2|"item2" [table2] 項目:detail_id(主キー)|item_id(外部キー) 0|0 1|0 2|1 このとき、 SELECT table1.name,COUNT(*) FROM table1,table2 WHERE table1.item_id = table2.item_id GROUP BY table1.name; のようなSQL文だと、結果にitem2が含まれず、 item0とitem1の登場回数だけ表示されてしまいます。 これをitem2は0回登場していることがわかるように出力したいのですが、 どうしたらいいでしょうか。

    • ベストアンサー
    • MySQL

専門家に質問してみよう