程序在调用时给出空结果
Procedure gives empty result when called
我创建了一个简单的程序来反转 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.
我不知道这里有什么错误,如果有的话。并感谢您的帮助。
过程在初始化之前使用 MYRESULT,因此为空。所以这一行:
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>
为了使用 dbms_ouput.put_line、运行 查看 PL/SQL 过程的输出,在您的会话中使用以下命令 window:
SET SERVEROUTPUT ON;
应该可以解决问题:)
这一行是问题所在:
MYRESULT:=(MYRESULT*10)+MYREMAINDER;
第一次迭代时,MYRESULT 为空。所以 MYRESULT*10
也将为空。 And null + MYREMAINDER = null;
将声明部分中的MYRESULT
初始化为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;
我创建了一个简单的程序来反转 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.
我不知道这里有什么错误,如果有的话。并感谢您的帮助。
过程在初始化之前使用 MYRESULT,因此为空。所以这一行:
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>
为了使用 dbms_ouput.put_line、运行 查看 PL/SQL 过程的输出,在您的会话中使用以下命令 window:
SET SERVEROUTPUT ON;
应该可以解决问题:)
这一行是问题所在:
MYRESULT:=(MYRESULT*10)+MYREMAINDER;
第一次迭代时,MYRESULT 为空。所以 MYRESULT*10
也将为空。 And null + MYREMAINDER = null;
将声明部分中的MYRESULT
初始化为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;