【问题标题】:Oracle procedure call results in "PLS-00306: wrong number or types of arguments in call"Oracle 过程调用导致“PLS-00306:调用中的参数数量或类型错误”
【发布时间】:2014-08-15 05:19:56
【问题描述】:

我正在尝试在 SQL 中创建一个过程。它可以正确编译,没有错误,但是当我尝试运行它时,我不断收到相同的语法错误。

这是错误:

exec reset_password(2002)
Error report -
ORA-06550: line 1, column 7:
PLS-00306: wrong number or types of arguments in call to 'RESET_PASSWORD'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:

我的查询:

 CREATE OR REPLACE PROCEDURE reset_password
 (
 p_customer_id  NUMBER,
 p_ret_code    OUT NUMBER,
 p_ret_message   OUT VARCHAR2 
 ) 
 AS
 old_password  VARCHAR2(10);
 new_password  VARCHAR2(10);
 vnumb NUMBER;
 ret_code    NUMBER;
 ret_message   VARCHAR2(50);
 Begin
    Select count(*)
    into vnumb
    from customer
    where customer_id = p_customer_id;

    If vnumb = 0 then
    ret_code:= 11;
    ret_message:= 'help';     
    Else
   ret_code:= 69;
   ret_message:= 'train';     
   return;
    end if;
   p_ret_code:= ret_code;
   p_ret_message:= ret_message;
    end reset_password;






CREATE TABLE customer 
( CUSTOMER_ID           NUMBER PRIMARY KEY,
 PASSWORD           VARCHAR2(20) NOT NULL,
 NAME           VARCHAR2(20) NOT NULL,
 EMAIL_ADDRESS      VARCHAR2(50) NOT NULL,
 PHONE_NUMBER       VARCHAR2(15) NOT NULL,
 REGISTRATION_DATE  DATE NOT NULL,
 EXPIRATION_DATE    DATE NOT NULL, 
 LAST_UPDATE_DATE   DATE NOT NULL);

 INSERT INTO customer 
 VALUES(2001, 'CpsBTKpN','SMITH','smith@yahoo.com', '3123622345',
'02-FEB-2010', '01-FEB-2015', '02-FEB-2010');
INSERT INTO customer 
VALUES(2002, 'ZWNWnQJT9', 'JONES', 'jones@hotmail.com', '6302077890',
'03-MAR-2010', '02-MAR-2015', '31-DEC-2010');
INSERT INTO customer 
VALUES(2003, 'gc88Wmvpx', 'MILLER', 'miller@abc.com', '6303551234',
'09-APR-2010', '08-APR-2015',   '09-APR-2010');
INSERT INTO customer 
VALUES(2004, 'KcxweSYg555', 'JOHNSON', 'jo12@gmail.com', '7732015678',
'22-APR-2010', '21-APR-2015', '22-APR-2010');
INSERT INTO customer 
VALUES(2005, 'CDYe44BBXd', 'CLARK', 'clark12@dpu.edu', '8476391001',
'18-MAY-2010', '17-MAY-2015', '18-MAY-2010');
INSERT INTO customer 
VALUES(2006, 'xGqmkw345zr', 'LEWIS', 'lewis@ual.com', '2246166666',
'20-MAY-2010', '19-MAY-2015', '20-MAY-2010');
INSERT INTO customer 
VALUES(2007, 'Y79zAHQwcB', 'KING', 'king@yahoo.com', '3018551234',
'30-JUN-2010', '29-JUN-2015', '30-JUN-2010');
INSERT INTO customer 
VALUES(2008, 'vhSDHMDg66', 'SCOTT', 'scott@hotmail.com', '7701239876',
'30-AUG-2010', '30-DEC-2011',   '30-DEC-2011');
COMMIT;

【问题讨论】:

  • 嗯,你要为过程声明三个参数,但只传入一个。非常明确的信息。
  • 但我认为只要其他 2 个是“Out”类型就没有关系。
  • @DaviRoli - 不。如果要调用该过程,则需要声明 2 个作为 OUT 参数传入的局部变量。否则,该过程将无处放置返回的值。
  • 请阅读 oracle PL/SQL 文档。
  • @Justin...好吧,也许我错过了重点,但我尝试改变它,但仍然是同样的问题。我刚刚更新了它。

标签: sql oracle


【解决方案1】:

要运行您的过程,可以创建一个匿名 plsql 块,其中包含与 out 参数关联的声明:

p_ret_code    OUT NUMBER,
p_ret_message   OUT VARCHAR2 

显然,您没有在程序调用中传递三个参数(两个参数不存在)。这就是您收到错误的原因:

PLS-00306: wrong number or types of arguments in call to 'RESET_PASSWORD' 

我将 l_ret_code 和 l_ret_message 与匹配的数据类型一起使用。

DECLARE
  l_ret_code    NUMBER;
  l_ret_message VARCHAR(50);
BEGIN
  reset_password ( 2002, l_ret_code, l_ret_message);
END;

如果想使用执行命令来运行带有 out 参数的过程,使用绑定变量就可以了:

var l_ret_code    NUMBER;
var l_ret_message VARCHAR2(50);
EXECUTE reset_password ( 2002, :l_ret_code, :l_ret_message);

【讨论】:

  • 谢谢。我在想我可以在不使用 declare/begin/end 块的情况下执行这个过程,而只使用 exec 命令。
  • 我已经添加了关于如何使用执行命令的注释,该命令考虑到使用绑定变量作为输出参数。
猜你喜欢
  • 2018-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多