sql加上程序中的警告。使用编译错误创建的过程。 (带参数的程序)

时间:2017-12-30 06:29:24

标签: oracle

嘿,我试图在程序的帮助下做一个pl sql程序。我想检查用户给出的数字是偶数还是奇数使用过程但我得到一个警告:用编译错误创建的过程。

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;
/

3 个答案:

答案 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

使用程序时没有错误;我只是觉得你可能想听到另一种意见。