2013-04-23 2 views
-1

Я хочу взять число и дважды вернуть значение аргумента. Хотя я ожидал бы идти по линииОбъявление функции PLSQL

float timestwo(float num){ num*2; return num;}

PLSQL кажется, однако, требуют более затемненный подхода. Я думал, что я следовал за подход, который требует Oracle 11g, но при попытке выполнить код, приведенный ниже,

exec dbms_output.enable(1000000); --boilerplate 
set serveroutput on   --boilerplate 
CREATE OR REPLACE FUNCTION timestwo (num 
IN number) 
RETURN number IS 
    product number(2) := 0; 
BEGIN 
    product := (num*2); 
    RETURN product; 
END; 
/
EXECUTE timestwo(5); 
show error      --boilerplate 

СУБД выдает следующее сообщение об ошибке:

ERROR at line 1: 
ORA-06550: line 1, column 7: 
PLS-00221: 'TIMESTWO' is not a procedure or is undefined 
ORA-06550: line 1, column 7: 
PL/SQL: Statement ignored 
No errors 

Очевидно, что функция объявления неверна, но кто-нибудь знает, как правильно реализовать этот простой код?

ответ

7

Функция действительна, но вы вызываете ее неправильно. Вы определили функцию. но вы называете это процедурой, как показывает ошибка.

Вы можете сделать:

select timestwo(5) from dual; 

Или в SQL * Plus:

var result number; 
exec :result := timestwo(5); 
print result 

Ваша функции фактически не нужно иметь переменную product определена; Вы могли бы упростить немного, как:

create or replace function timestwo(num in number) 
return number is 
begin 
    return num*2; 
end; 
/

... который также не будет ошибок при больших входных чисел (например, 10), которые обеспечивают продукт с более чем двумя цифрами. Если это не было намеренно, конечно ... * 8-)

+0

Я понятия не имел, что это вызов функции, который был виноват! Возможно, если бы ошибка указала на строку 11 вместо строки 1, это было бы еще более очевидно! Благодаря! – Stumbler

+3

@ Duncan - 'create' и' execute' - два отдельных оператора, а ошибка - в строке 1 второго оператора. 'exec' - это просто сокращение SQL * Plus, которое расширяется до' begin timestwo (5); end; ', которые не будут очевидны, подумал, что ошибка показала полную вещь. Символом 7 этого является имя 't' в имени функции, которое также могло бы добавить к путанице. –

+1

После ошибки можно использовать 'list', чтобы увидеть, что отправил SQL * Plus, с номерами строк, которые соответствуют номерам строк в ошибке. –

Смежные вопросы