Процедура дает пустой результат при вызове

Я создал простую процедуру для изменения числа в PL / SQL. Процедура выполняется нормально, но результат не выводится. Вот процедура,

CREATE OR REPLACE PROCEDURE SAMPLE_REV (myinput IN NUMBER, finalresult OUT NUMBER)
IS 
    OperInput NUMBER;
    MYREMAINDER NUMBER;
    MYRESULT NUMBER;
BEGIN   
     OperInput:=myinput;    

     while OperInput!=0 LOOP 

        MYREMAINDER:=mod(OperInput,10);
        MYRESULT:=(MYRESULT*10)+MYREMAINDER;
        OperInput:=TRUNC(OperInput/10);  

     end LOOP;

    finalresult:=MYRESULT;

END;

Процедура при выполнении работает нормально. Но когда я вызываю процедуру по следующему коду,

DECLARE
      ENTER NUMBER;
      finalresult NUMBER;      
BEGIN
     ENTER:=&ENTER;
     SAMPLE_REV(ENTER,finalresult);
     dbms_output.put_line('Output is '|| finalresult);
END;

Результат пуст, так как,

Output is 

PL/SQL procedure successfully completed.

Я не могу узнать об ошибке здесь, если таковая имеется. И спасибо за помощь.


person Mubarak Abdullah    schedule 03.05.2018    source источник


Ответы (4)


процедура использует MYRESULT до инициализации, следовательно, null. Итак, эта строка:

MYRESULT:=(MYRESULT*10)+MYREMAINDER;

по сути

    MYRESULT:=(<<<NULL>>>*10)+MYREMAINDER;

Так что в целом ноль.

Просто добавив в объявление a: = 0, он заработает. Также добавьте set serveroutput on

SQL>set serveroutput on

SQL>CREATE OR REPLACE PROCEDURE SAMPLE_REV (myinput IN NUMBER, finalresult OUT NUMBER)
  2  IS 
  3      OperInput NUMBER;
  4      MYREMAINDER NUMBER;
  5      MYRESULT NUMBER :=0;
  6  BEGIN   
  7       OperInput:=myinput;    
  8  
  9       while OperInput!=0 LOOP 
 10  
 11          MYREMAINDER:=mod(OperInput,10);
 12          MYRESULT:=(MYRESULT*10)+MYREMAINDER;
 13          OperInput:=TRUNC(OperInput/10);  
 14  
 15       end LOOP;
 16  
 17      finalresult:=MYRESULT;
 18  
 19  END;
 20* /
Procedure SAMPLE_REV compiled

SQL>DECLARE
  2        ENTER NUMBER;
  3        finalresult NUMBER;      
  4  BEGIN
  5       ENTER:=&ENTER;
  6       SAMPLE_REV(ENTER,finalresult);
  7       dbms_output.put_line('Output is '|| finalresult);
  8  END;
  9  /
Enter value for ENTER: 987


Output is 789


PL/SQL procedure successfully completed.

SQL>
person Kris Rice    schedule 03.05.2018
comment
Ах! Большое спасибо @Kris, он работает. Я думал, что set serveroutput ON - это команда SQL * Plus и не имеет никакого отношения к этому. Во всяком случае, он работает и без этого. Итак, не могли бы вы пояснить, зачем это нужно? - person Mubarak Abdullah; 03.05.2018
comment
serveroutput ON делает 2 вещи. 1) включает dbms_output для буферизации того, что ему отправлено, и 2) указывает инструменту проверить буфер. - person Kris Rice; 03.05.2018

Чтобы просмотреть вывод процедуры PL / SQL с помощью dbms_ouput.put_line, выполните следующую команду в окне сеанса:

SET SERVEROUTPUT ON;

Должен сделать свое дело :)

person Amy Grange    schedule 03.05.2018

Я вижу, ваш расчет неверен. Я добавил в процедуру дополнительный вывод, чтобы увидеть, что он печатает.

MYRESULT itslef пуст, и, следовательно, вы видите, что вывод пуст.

set serveroutput on;
CREATE OR REPLACE PROCEDURE SAMPLE_REV (myinput IN NUMBER, finalresult OUT NUMBER)
IS 
    OperInput NUMBER;
    MYREMAINDER NUMBER;
    MYRESULT NUMBER;
BEGIN   
     OperInput:=myinput;    

     while OperInput!=0 LOOP 

        MYREMAINDER:=mod(OperInput,10);
        dbms_output.put_line('remainder ' || MYREMAINDER);
        dbms_output.put_line('in ' || MYRESULT);

        MYRESULT:=(MYRESULT*10)+MYREMAINDER;

        dbms_output.put_line('out ' || MYRESULT);
        OperInput:=TRUNC(OperInput/10);  

     end LOOP;

    finalresult:=MYRESULT;

END;
person mdparthi    schedule 03.05.2018

В этой строке есть проблема:

MYRESULT:=(MYRESULT*10)+MYREMAINDER;

На первой итерации MYRESULT имеет значение NULL. Таким образом, MYRESULT*10 также будет нулевым. And null + MYREMAINDER = null;

Инициализировать MYRESULT в разделе объявлений до 0;

person Ychdziu    schedule 03.05.2018