我尝试在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');
错误显示,
答案 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>
错误原因为:
这是您应该做的:由于第三个参数是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块(就像在创建它时编译该过程一样)。在这种情况下,由于参数数量不匹配,编译将失败。