2017-12-18 7 views
0

私のコードを実行すると、そのコード内のステートメントに関係なく、すべてのケース条件を通過するようです。私が達成しようとしている何ケースユーザ(PLSQL、匿名ブロック)から読み込んだときに条件が正しく実行されない場合

  • 私は、ユーザーからの単純な整数を読んで、彼は0値を入力した場合、私はプログラムを終了し、loopを終了したいと思います。

    • case

    実行例のすべてのwhen文が入ります:

    1. プログラムは、(整数の入力をユーザーに尋ねる私はプログラムを実行するとどうなり

0/1/2/3)

  • ユーザエンティティRS 0(プログラムはループを終了し、壊す必要があります)
  • 市の詳細情報を要求します(行32)
  • 私は都市の詳細を入力し、プログラム

    走り続けることをしようとしていませんコードを開発しました:

    SET SERVEROUTPUT ON; 
    
    declare 
        poli_name poli.name%type; 
        poli_lat poli.lat%type; 
        poli_lon poli.lon%type; 
        counter int :=1; 
    
        cursor poli_c is select name,lat,lon from poli; 
    
        number_of_cities int; 
    
        epilogi number; 
    
    begin 
        dbms_output.put_line('Select 1 To Enter Details'); 
        dbms_output.put_line('Select 2 To View All The Details'); 
        dbms_output.put_line('Select 3 To Run Group Algorithm'); 
        dbms_output.put_line('Select 0 To Exit The Programm'); 
    
        epilogi:=&Epilogi; 
    
        loop 
         case epilogi 
          when 0 then 
           dbms_output.putline('Exiting Programm...'); 
           exit; 
          when 1 then 
           name_c := &Enter_City_Name; --line 32 
           lat := &Enter_City_Lat; 
           lon := &Enter_City_Lon; 
    
           if lon >= -180 and lon <= 180 and lat >= -90 and lat <= 90 then 
            select count(id) into number_of_cities from poli; 
    
            if number_of_cities <= 15 then 
             insert into poli values(counter,name_c,lat,lon); 
             dbms_output.putline('City Successfully Added'); 
            else 
             dbms_output.putline('Cities Can Not Be More Than 15'); 
            end if; 
           else 
            dbms_output.putline('Wrong Longitude Or Latidute Values'); 
           end if; 
          when 2 then 
           open poli_c; 
           fetch poli_c into poli_name,poli_lat,poli_lon; 
           dbms_output.put_line('Onoma Polis:'||poli_name); 
           dbms_output.put_line('Latidute '||poli_name||': '||poli_lat); 
           dbms_output.put_line('Longtidute '||poli_name||': '||poli_lon); 
           close poli_c; 
          when 3 then 
           null; 
          else 
           dbms_output.put_line('Wrong input - try again...'); 
         end case; 
    
         counter := counter+1; 
         epilogi := &Epilogi; 
        end loop; 
    end; 
    

    私は間違って何かしていますか?それは何でしょうか?御時間ありがとうございます。

    +1

    あなたが見たことを理解しているか分からない。あなたのブロックは決して実行されませんでした。置換変数( '&'で始まるもの)は、SQL * Plusまたは使用しているインターフェース(SQL Developer、Toadなど)によってユーザー提供の値に置き換えられます** **コードを送信する前に - 完了しました。** ALL **変数 - 解析および実行のためのPL/SQLエンジン。 &Epilogiの最初の値を指定すると、SQL¥* Plusは他の置換変数の値を要求し続けます。あなたのコードは決して実行を開始しないのでCASE文を決して入力しません! – mathguy

    +0

    これを修正する方法はありますか? –

    +0

    pl/sqlはユーザーとのやりとりを目的としたものではありません。それを処理するには、追加のレイヤーが必要です。 Answersの1つのコメントで、Steven FeuersteinsはApExのページを提案しています。または、あなたが慣れ親しんでいる可能性のある他のアプリケーションであれ、ユーザーインターフェイスを作成することができます。これはpl/sqlの目的ではありません。 – mathguy

    答えて

    0

    & Varは置換変数です。

    & Epilogi、& Enter_City_Name、& Enter_City_Lat、& Enter_City_Lon - 彼らはすべてのスクリプトが実行され、それに渡される前に設定してください。

    ケースは正しく動作していますが、実行する前にすべての変数を設定する必要があります。 たとえば、次のような場合でも、価値を提供する必要があります。

    declare 
    var1 int; 
    
    begin 
        return; 
        dbms_output.put_line('Unreachable code'); 
        var1 := &v1; 
    
    
    end; 
    
    +0

    それで、値を設定するのを避ける方法はありますか?(私はループを壊していますが、まだ値を求めていますが、これはとても奇妙です) –

    +1

    ループ置換変数の内部で可能かどうかはわかりません実行前にplsqlエンジンに渡されることを意味します。 PLSQLはインタラクティブではありません。あなたはそれの周りに他の言語を使用する必要があります。それはあなたにいくつかのアイデアを与えるかもしれません:http://www.dba-oracle.com/t_interactive_pl_sql_user_input.htm – a1ex07

    +0

    より正確に言うと、 'case'は全く動作しません(正しくない、不適切ではありません)。 **何も実行されていないので、 'case'文は実行されません - すべての置換変数に値が与えられる前に、OPはその試行を中止しました。 – mathguy

    -2

    PostgresのCASE .. WHEN ... THEN ... ELSE ...に表現していない文であることに注意してください。したがって、式が有効な場所、つまり代入、戻り値などのどこでも使用する必要があります。

    * EDIT: 本物の間違い、PLSQLとPGSQL .. Oracleの変種は、通常スラッシュ(PL/SQL)が私に混乱をもたらしました *

    +0

    私は理解していますが、私の例では値0はプログラムの実行を止めません。すべての&初期化は、その前にあった 'exit'や' return'に関係なく実行されます。 –

    +0

    さて、私は文の文脈であなたの例のように 'CASE ...'を使ったことはありませんでしたが、私はPGが混乱していると思います(または単にCASE ...を完全に無視して) 〜の間に.. これは単なる野生の推測です。 すべての値をハードコーディングしてみてください。違いが見えない場合は、おそらくこれが理由です –

    +0

    私は 'IF ELSE'で試しましたが、結果は同じです –

    関連する問題