当尝试排除程序时,它说在oracle中出现编译错误?

时间:2019-02-14 17:43:55

标签: oracle stored-procedures plsql

我尝试在oracle中编写选择过程,但是当我尝试执行给定的错误时,它编译成功。

 set serveroutput on;
    CREATE OR REPLACE  PROCEDURE retrieve_decrypt(
        custid  in NUMBER,
        column_name in VARCHAR2,
        test_value OUT VARCHAR2
        ) 
        AS

   BEGIN
      -- enc_dec.decrypt(column_name,password) into  test_value from employees where custid=5;
        COMMIT;
   END;
/


set serveroutput on;
EXEC retrieve_decrypt(5,'creditcardno');

错误显示,

enter image description here

2 个答案:

答案 0 :(得分:3)

这是您的程序:

SQL> create or replace procedure retrieve_decrypt
  2    (custid      in number,
  3     column_name in varchar2,
  4     test_value out varchar2
  5    )
  6  as
  7  begin
  8    -- your code goes here
  9    null;
 10  end;
 11  /

Procedure created.

SQL>

这就是您的称呼方式(并得到错误):

SQL> exec retrieve_decrypt(5, 'creditcardno');
BEGIN retrieve_decrypt(5, 'creditcardno'); END;

      *
ERROR at line 1:
ORA-06550: line 1, column 7:
PLS-00306: wrong number or types of arguments in call to 'RETRIEVE_DECRYPT'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored


SQL>

错误原因为:

  • 该过程包含 3 个参数:
    • 其中两个是IN-您已提供了它们的值
    • 其中1个已用完-您没有提供它并收到了错误消息

这是您应该做的:由于第三个参数是OUT,因此必须对其进行DECLARE:

SQL> declare
  2    l_out varchar2(20);
  3  begin
  4    retrieve_decrypt(5, 'creditcardno', l_out);
  5  end;
  6  /

PL/SQL procedure successfully completed.

SQL>
您使用的

EXEC是一个SQL * Plus命令,因此它可能不适用于所有地方。 DECLARE-BEGIN-END块会被阻止,所以我建议您使用它。

或者,在SQL * Plus中,可以将其重写为

SQL> var l_out varchar2
SQL>
SQL> exec retrieve_decrypt(5, 'creditcardno', :l_out);

PL/SQL procedure successfully completed.

SQL>

但是-再次-您最好使用DECLARE-BEGIN-END PL / SQL块。

答案 1 :(得分:1)

初始错误是:

  

调用“ RETRIEVE_DECRYPT”时参数的数量或类型错误

该过程需要3个参数。您只会传递2(或显然只有1,以尝试产生显示的错误消息)。

为什么您还会看到消息“通常是PL / SQL编译错误”? SQLPlus中的EXEC命令创建一个包含您提供的文本的PL / SQL块,并将其发送给Oracle以执行。 Oracle尝试编译该PL / SQL块(就像在创建它时编译该过程一样)。在这种情况下,由于参数数量不匹配,编译将失败。