从用户读取条件时,条件无法正常运行(PLSQL,匿名块)

时间:2017-12-18 23:29:03

标签: oracle plsql

当我运行我的代码时,它似乎经历了每个案例条件,无论其中的语句如何。

我想要实现的目标:

  • 我从用户那里读取一个简单的整数,如果他输入0值,我想结束该程序并退出loop

运行程序时会发生什么:

  • 输入when
  • 的每个case声明

运行示例:

  1. 程序要求用户输入整数(0/1/2/3)
  2. 用户输入0(程序必须退出并中断循环)
  3. 询问城市详情(第32行)
  4. 我没有尝试输入城市细节并继续运行程序

    我开发的代码:

    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;
    

    我做错了什么吗?可能是什么?谢谢你的时间。

2 个答案:

答案 0 :(得分:0)

&amp; Var是替换变​​量。

&amp; Epilogi,&amp; Enter_City_Name,&amp; Enter_City_Lat,&amp; Enter_City_Lon - 它们都在脚本执行并传递给它之前设置。

因此情况正常,但必须在执行前设置所有变量。 例如,即使在以下情况下,您也需要提供价值。

declare 
var1 int;

begin
    return;
    dbms_output.put_line('Unreachable code');
    var1 := &v1;


end;

答案 1 :(得分:-2)

请注意,在Postgres中CASE .. WHEN ... THEN ... ELSE ...是表达式而非声明。因此,预期必须在表达式有效的地方使用它,即赋值,返回等......

*编辑: 真正的错误,PLSQL vs PGSQL .. Oracle变种通常带有斜杠(PL / SQL),这让我感到困惑 *