2015-03-08 2 views
-1

Не могу понять, как вызвать функцию в SQL Developer. Я пытаюсь вызвать функцию GET_SUIT, но он говорит, что я использую неправильный номер или тип аргументов в вызове «GET_SUIT»:PLS-00306: неправильное количество или типы аргументов при вызове функции

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

Из всего, что я прочитал, мне нужно передать одно целое в функцию, это правильно? Любая помощь была бы оценена. Я знаю, что это базовый уровень, но у меня есть другие функции, которые я бы хотел использовать, и я даже не могу заставить этот простой работать.

ответ

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; 
/
Смежные вопросы