调用时,过程给出空结果

时间:2018-05-03 12:24:06

标签: oracle plsql plsqldeveloper

我创建了一个简单的过程来反转PL / SQL中的数字。程序执行正常,但结果不能打印。这是proc,

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.

如果有的话,我无法知道这里的错误。谢谢你的帮助。

4 个答案:

答案 0 :(得分:3)

该过程在初始化之前使用MYRESULT,因此为null。所以这一行:

MYRESULT:=(MYRESULT*10)+MYREMAINDER;

基本上是

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

总体上是空的。

只需在声明中添加:= 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>

答案 1 :(得分:0)

要使用dbms_ouput.put_line查看PL / SQL过程的输出,请在会话窗口中运行以下命令:

SET SERVEROUTPUT ON;

应该做的伎俩:)

答案 2 :(得分:0)

这一行是问题所在:

MYRESULT:=(MYRESULT*10)+MYREMAINDER;

在第一次迭代中,MYRESULT为null。所以MYRESULT*10也将为空。 And null + MYREMAINDER = null;

将声明部分中的MYRESULT初始化为0;

答案 3 :(得分:0)

我看到你的计算不正确。我在程序中添加了额外的输出,以查看它的打印内容。

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;