質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.58%

PL/SQLでファイルのデータを読み込み、そのデータの計算結果を別ファイルに出力したい。

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,273

odanngo_taifu

score 16

前提・実現したいこと

ファイルsamplefile1.txtに

4+8
-6+3
6*2
10/4
10%3


という5つの数式が記述されています。
この数式を変数shiki、その解を変数kaiとします。
そしてファイルsamplefile2.txtに『shiki=kai』と出力したいです。
例えば今回だと

4+8=12
-6+3=-3
6*2=12
10/4=2.5
10%3=1


となります。

samplefile1.txtの数式は全て読み込みが完了しましたが、書き出しをする際、どのように計算が行われる処理を記述すれば良いかわかりません。
方法としては
①shikiの計算対象になる数字をSUBSTR関数を使い切り取る。
②①で切り取った数字をそれぞれ変数に置き換える(4+8だと変数hidari=4、変数migi=8)
③if文を使い
もしshiki内に'+'が含まれていた場合『hidari+migi=kai』
もしshiki内に'-'が含まれていた場合『hidari-migi=kai』



④samplefile2.txtに出力

という流れを想定しておりますが、SUBSTR関数を使いshikiから数字を2切り取る方法がわからず、悩んでおります。
もしよろしければ、アドバイスを頂けたら幸いです。
よろしくお願い致します。

試したこと

読み込みをしたプロシージャになります。

set serveroutput on
--読み込みプロシージャの作成
create or replace procedure yomikomi
is
v_filename varchar2(200) := 'samplefile1.txt';
file_hand utl_file.file_type;

--実行部
begin
file_hand := utl_file.fopen('UTL_DATA',v_filename,'r');
    loop
    begin
        --読み込み
        utl_file.get_line(file_hand,shiki);
        dbms_output.put_line(shiki);    
    exception
        when no_data_found then exit;
     end;
    end loop;

utl_file.fclose(file_hand);
end yomikomi;
/

execute yomikomi
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Orlofsky

    2019/03/29 12:24

    コードは https://teratail.com/help#about-markdown の [コードを入力] に修正してください。

    キャンセル

  • odanngo_taifu

    2019/04/02 08:41

    修正いたしました。ご指摘いただきありがとうございます。

    キャンセル

回答 2

checkベストアンサー

0

INSTR で演算子の位置がわかれば自己解決できるのでは?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/04/02 08:43

    Orlofsky様
    教えていただいたINSTR関数を使い解決できました。
    ありがとうございました!

    キャンセル

0

SQLで計算するというのはどうですか。

 select 4+8 from dual


上記のSQLを動的SQLとして生成して実行する。

OracleのEXECUTE IMMEDIATE 動的SQL【PL/SQL】

  EXECUTE IMMEDIATE 'select ' || shiki || ' from dual' INTO kai


ファイルの計算式で使用されている演算子が、SQLで使用される演算子と異なる場合は、変換。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/04/02 08:47

    sazi様
    お教えいただきありがとうございます!
    動的SQLを使うという発想が思いつかなかったので、大変参考になります。
    これから試してみたいと思います。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.58%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る