create or replace procedure even( a in out number)
as n number :=&n;
begin
if(n,2)=0 then
dbms_output.put_line('even');
else
dbms_output.put_line('odd');
end if;
end;
/
答案 0 :(得分:1)
每次获得用户输入时编译过程都没有意义。您应该执行以下操作。
编译没有任何替换变量的过程。除非您想在过程中修改其值,否则该参数应该只是IN
而不是IN OUT
。
CREATE OR replace PROCEDURE Even(n IN NUMBER)
AS
BEGIN
IF MOD(n, 2) = 0 THEN
dbms_output.put_line('even');
ELSE
dbms_output.put_line('odd');
END IF;
END;
/
然后通过传递用户输入,多次执行此编译过程。
SQL> SET SERVEROUTPUT ON;
SQL> EXEC even ( &n );
Enter value for n: 5
odd
PL/SQL procedure successfully completed.
SQL> EXEC even ( &n );
Enter value for n: 4
even
PL/SQL procedure successfully completed.
答案 1 :(得分:0)
为什么不使用你的mod函数:
if mod(a,2)=0 then
dbms_output.put_line('even');
else
dbms_output.put_line('odd');
end if;
我认为你把" n"而不是" a"
答案 2 :(得分:0)
考虑使用功能;在我看来,这是一个比程序更好的选择。
自然选项将是一个返回Boolean的函数:
SQL> create or replace function f_is_even (par_n in number)
2 return boolean
3 is
4 begin
5 return mod(par_n, 2) = 0;
6 end;
7 /
Function created.
然后你会在一些 PL / SQL 代码中使用它,如下例所示(是的,它看起来很愚蠢,因为看起来它确实与你的程序完全相同,但请注意 - 这是< em>只是一个例子;在现实生活中,你会以更聪明的方式使用它:)
SQL> begin
2 if f_is_even(6) then
3 dbms_output.put_Line('even');
4 else
5 dbms_output.put_Line('odd');
6 end if;
7 end;
8 /
even
PL/SQL procedure successfully completed.
这样一个函数的缺点是你不能在SQL中使用它(但正如我所说的那样,PL / SQL):
SQL> select f_is_even(5) from dual;
select f_is_even(5) from dual
*
ERROR at line 1:
ORA-06552: PL/SQL: Statement ignored
ORA-06553: PLS-382: expression is of wrong type
可能的“解决方法”是创建一个不返回布尔值的过程,例如,number(0表示“false”,1表示“true”)或字符串(N表示“false,no”和Y为“真,是”)。例如:
SQL> create or replace function f_is_even_01 (par_n in number)
2 -- returns 1 if number is even; returns 0 if number is odd
3 return number
4 is
5 begin
6 return case when mod(par_n, 2) = 0 then 1
7 else 0
8 end;
9 end;
10 /
Function created.
SQL> select f_is_even_01(5) r1,
2 f_is_even_01(6) r2
3 from dual;
R1 R2
---------- ----------
0 1
使用程序时没有错误;我只是觉得你可能想听到另一种意见。