PLS-00306:函数调用中的参数数量或类型错误

时间:2015-03-08 15:38:05

标签: oracle function plsql call

我无法弄清楚如何在SQL Developer中调用函数。我正在尝试调用函数GET_SUIT,但它说我在调用'GET_SUIT'时使用了错误的数字或类型的参数:

create or replace FUNCTION GET_SUIT 
(
  RND_NUM IN INTEGER, 
  Suit OUT VARCHAR2 
) RETURN VARCHAR2 AS 
BEGIN

if RND_NUM = 1 then -- Card is a Spade
  Suit := 'Spades';

elsif RND_NUM = 2 then  -- Card is a Heart
  Suit := 'Hearts';

elsif RND_NUM = 3 then -- Card is a Diamond
  Suit := 'Diamonds';

elsif RND_NUM = 4 then -- Card is an Club
  Suit := 'Clubs';

end if;

RETURN Suit;
END GET_SUIT;

我使用以下声明:

 SELECT dbms_random.value(1,4) into RND_NUM from dual;
 dbms_output.put_line('Random number 2 is : ' || RND_NUM);
 GET_SUIT(RND_NUM);
 dbms_output.put_line('Suit of card is : ' || Suit);   

从我读过的所有内容中我需要将一个整数传递给函数,这是正确的吗?任何帮助将不胜感激我知道这是基本级别的东西,但我有其他功能,我想使用,我甚至不能让这个简单的工作。

1 个答案:

答案 0 :(得分:3)

您收到错误消息有两个原因。

一,因为你的函数有两个参数,但你只在调用中分配了一个。您缺少一个本地变量来接收OUT参数。

二,因为函数返回一个值。因此,调用必须分配给局部变量;或者我们可以在SELECT语句的投影中使用函数。这也意味着我们不在函数的签名中使用OUT参数(我们可以,函数仍然编译,但这是不好的做法)。

所以,写这样的函数......

create or replace FUNCTION GET_SUIT 
(
  RND_NUM IN INTEGER
) RETURN VARCHAR2 
AS 
  Suit  VARCHAR2(10); 
BEGIN

if RND_NUM = 1 then -- Card is a Spade
  Suit := 'Spades';

elsif RND_NUM = 2 then  -- Card is a Heart
  Suit := 'Hearts';

elsif RND_NUM = 3 then -- Card is a Diamond
  Suit := 'Diamonds';

elsif RND_NUM = 4 then -- Card is an Club
  Suit := 'Clubs';

end if;

RETURN Suit;
END GET_SUIT;

......并且这样称呼它:

declare
    l_suit varchar2(10);
    rnd_num pls_integer;
begin
     SELECT dbms_random.value(1,4) into RND_NUM from dual;
     dbms_output.put_line('Random number 2 is : ' || RND_NUM);
     l_suit := GET_SUIT(RND_NUM);
     dbms_output.put_line('Suit of card is : ' || l_Suit);   
end;
/