2013-05-05 60 views
0

請考慮下面的代碼(query.sql的):PL/SQL程序運行不正常

create or replace function age (dateOfBirth date) 
return number 
is 

mAge number(5,2); 

begin 
    mAge:=(sysdate-dateOfBirth)/365.25; 
    return mAge; 
end; 



SQL> @query.sql 
13 
14 
15/

Warning: Function created with compilation errors. 

當我點擊顯示錯誤,我得到如下:

代碼:

SQL> show error 
Errors for FUNCTION AGE: 

LINE/COL ERROR 
-------- ----------------------------------------------------------------- 
5/8  PL/SQL: Item ignored 
5/15  PLS-00325: non-integral numeric literal 5.2 is inappropriate in 
    this context 

8/8  PL/SQL: Statement ignored 
8/8  PLS-00320: the declaration of the type of this expression is 
    incomplete or malformed 

9/5  PL/SQL: Statement ignored 
9/12  PLS-00320: the declaration of the type of this expression is 
    incomplete or malformed 

LINE/COL ERROR 
-------- ----------------------------------------------------------------- 

我試着做以下選項:Oracle Procedure

1) SQL> set role none; 

2) SELECT ON DBA_TAB_COLUMNS; 

但高於第二查詢投擲錯誤:缺少表達。

請讓我知道所有上述的東西有什麼問題。

感謝

回答

2

你缺少BEGIN和您的電話號碼變量應該用逗號不是句號聲明。

create or replace function age (
    pDateOfBirth date) return number is 

    l_age number(5,2); 

begin  
    l_age := (sysdate - pDateOfBirth)/365.25; 
    return l_age; 
end; 
/

你現在編輯的問題,包括對BEGIN,但你有沒有固定的變量的聲明。由於您的錯誤信息說:

PLS-00325:非整數數字文字5.2是不合適在這方面

就個人而言,我相信你計算年齡不正確。一年有365或366天。我應該這樣做,而不是,它採用Oracle內部日期函數:

function get_age (pDOB date) return number is 
    /* Return the the number of full years between 
     the date given and sysdate. 
     */  
begin  
    return floor(months_between(sysdate, pDOB)/12);  
end; 

也就是說,如果你只想要整年數。

+0

謝謝指出。我在這裏粘貼代碼並忘記了BEGIN。修復。我遇到了BEGIN.Anyways出現的錯誤,我會檢查您提到的內容並通知您。 – Tan 2013-05-05 20:59:23

+0

我剛剛檢查了你的第一部分代碼,我得到了「不足的特權」錯誤。如何獲得這個鑽機? – Tan 2013-05-05 21:01:55

+0

很可能你沒有創建函數@AaK的權限;如果是這種情況,則需要以SYS或其他DBA用戶身份登錄,並且將創建過程授予,其中''是您嘗試創建函數的模式的名稱。請參閱文檔:http:/ /docs.oracle.com/cd/B19306_01/network.102/b14266/authoriz.htm#i1009241 – Ben 2013-05-05 21:05:30