2017-12-18 11 views
0

내 코드를 실행하면 코드 내부의 문안에 관계없이 모든 사례 조건을 통과 한 것처럼 보입니다. 내가 달성하기 위해 노력하고있어사례 사용자 (PLSQL, 익명 블록)에서 읽을 때 조건이 올바르게 실행되지 않을 때

는 :

  • 나는 사용자가 간단한 정수 읽고 그가 0 값을 입력하면, 나는 프로그램을 종료하고 loop를 종료하고 싶습니다.

    1. 이 프로그램은 정수에 대한 사용자 요청 (:

      • case

      실행 예제의 모든 when 문을 입력합니다 : 나는이 프로그램을 실행하면 어떻게됩니까

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에 대한 코멘트에서 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

    loop-substitution 변수를 가능한 이름 안에 넣을 수 있을지 모르겠다. 실행 전에 plsql 엔진에 전달됨을 의미합니다. PLSQL은 대화식이 아니므로 주위에 다른 언어를 사용해야합니다. 그것은 당신에게 몇 가지 아이디어를 줄 수 있습니다 : http://www.dba-oracle.com/t_interactive_pl_sql_user_input.htm – a1ex07

    +0

    더 정확하게 -'case'는 전혀 작동하지 않습니다 (부적절하지는 않습니다.) - 실행이 결코 시작되지 않기 때문에. ** nothing **이 실행 되었기 때문에'case' 문은 실행되지 않습니다. OP는 모든 대체 변수가 값을 갖기 전에 시도를 포기했습니다. – mathguy

    -2

    그 포스트 그레스 CASE .. WHEN ... THEN ... ELSE ...의 표현이 아닌 진술 유의하시기 바랍니다. 따라서 표현식이 유효한 곳, 즉 할당, 반환 등 어디서나 사용되어야합니다.

    * EDIT : 진짜 실수, PLSQL 대 PGSQL .. 오라클 변형은 일반적으로 슬래시 (PL/SQL) 혼란에 이르렀다. *

    +0

    나는 이해한다. 그러나 나의 예제에서 값 0은 프로그램이 실행되는 것을 멈추지 않는다. 모든 & 초기화는 그것보다 먼저 있었던'exit' 또는'return'에 상관없이 실행된다. –

    +0

    글쎄, 나는 사례의 맥락에서 (사례에서와 같이) '사례'를 사용하지 않았지만, PG가 혼란스러워 지거나 (아니면 단순히 사례를 무시하고) 나머지 코드를 실행한다고 생각한다. .. 이것은 단지 야생의 추측입니다. 모든 값을 하드 코딩 해보십시오. 아무런 차이가 없다면, 아마도 이것은 이유입니다. –

    +0

    'IF ELSE'로 시도했지만 결과는 같습니다. –