2012-07-01 91 views
6

在PL/SQL中,下面的代碼將失敗。它不允許定義varchar2參數的大小。你知道爲什麼嗎?我如何解決它?PL/SQL函數參數

create or replace function logMessage(msg varchar2(2000)) 
return number as 
begin 
    null;  
    return 1; 
end logMessage; 
/

錯誤消息是

1/33 PLS-00103:出現符號 「(」 在需要下列 之一時:

:=),@%默認字符符號「:=」替換爲 「(」繼續。

回答

9

您可以通過刪除大小約束來修復它。它不是ne eded:

create or replace function logMessage (msg in varchar2) 
return number is 
begin 
    null;  
    return 1; 
end logMessage; 
/

我假設你的函數比這個稍微複雜一些?

create function聲明from the documentation完整的語法是:

CREATE [OR REPLACE] FUNCTION [Owner.]FunctionName 
    [(arguments [IN|OUT|IN OUT][NOCOPY] DataType [DEFAULT expr][,...])] 
    RETURN DataType [InvokerRightsClause] [DETERMINISTIC] 
    {IS|AS} 

的信息很多各地the specifics如果你有興趣,但你可能會發現TECH on the Net更加有用。


在回答你的第一個問題,爲什麼我不知道,並不能找到答案。但to quote APC

這很煩人,但它的方式PL/SQL的工作,所以我們不得不忍受 它。

簡單地說,你應該知道運行時間長的東西是怎麼回事是和能,因此,對付它。有幾個選項,你可以儘管考慮:

如果你知道你想要的消息是,你可以定義一個變量是什麼長度,默認值是該參數的substr

create or replace function logmessage (msg in varchar2) return number is 

    l_msg varchar2(2000) := substr(msg,1,2000); 

begin 
    return 1; 
end; 

或者,您可以檢查函數本身的長度:

create or replace function logmessage (msg in varchar2) return number is 

begin 

    if length(msg) > 2000 then 
     return 0; 
    end if; 

    return 1; 
end; 
3

參數用數據類型聲明,但沒有數據類型長度或精度。這意味着一個參數可能被聲明爲VARCHAR2,但它不會被聲明爲一個長度組件(VARCHAR2(30)將無效)。