2013-04-23 187 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 

的DBMS引發以下錯誤的做法:

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 2013-04-23 19:15:43

+3

@Duncan - 'create'和'execute'是兩個單獨的語句,錯誤在第二條語句的第一行。 'exec'只是一個SQL * Plus的簡寫,它被擴展爲'begin timestwo(5);最後;',哪一點不明顯,我認爲我錯誤顯示了完整的事情。其中的字符7是函數名稱中最好的't',這也可能增加了混淆。 – 2013-04-23 19:21:56

+1

發生錯誤後,可以使用'list'來查看SQL * Plus發送的內容,其中的行號與錯誤中的行號相匹配。 – 2013-04-23 20:28:29