2011-06-02 100 views
0
執行此存儲功能,我得到一個錯誤

我的存儲功能需要輸入,並應返回贏得ATLEAST兩項大獎成員的數量...而在甲骨文

這裏是我的代碼;

CREATE OR REPLACE FUNCTION calculateaward 
(
    i_PLAYERID VARCHAR2 
) RETURN VARCHAR2 AS 
cnt NUMBER; 
BEGIN 

SELECT * INTO cnt FROM 
(
    SELECT COUNT(*) AS NOM FROM 
    (
    SELECT PLAYERID, USERNAME FROM MEMBER R 
    WHERE R.USERNAME IN 
    (
     SELECT USERNAME FROM 
     (
     SELECT USERNAME, COUNT(*) AS cnt FROM MEMBERAWARD 
     GROUP BY USERNAME 
    ) 
     WHERE cnt >= 2 
    ) 
) 
    WHERE player= I_PLAYERID 
    GROUP BY PLAYERID 
); 

    RETURN cnt; 
END calculateaward; 

我想執行的函數如下 EXEC calculateaward(「P0001」),但它不能正常工作,請大家幫忙。

+2

定義「不起作用」。預期的行爲是什麼?觀察到的行爲是什麼? – David 2011-06-02 14:55:14

+0

你得到的錯誤是什麼?由於沒有提供DDL和數據,給出錯誤代碼/消息可以幫助解決問題... – Chandu 2011-06-02 14:55:28

回答

3

您不能執行使用EXEC不像存儲procedures..Instead函數試試這個:

SELECT calculateaward('P0001') FROM DUAL; 

還有,爲什麼定義函數的返回VARCHAR2當你返回一個數字,這不是因爲一個錯誤數字將自動轉換爲VARCHAR2,但返回與返回的數據類型相同的數據類型通常會更好返回

+0

其實我們可以執行函數。 – APC 2011-06-02 15:10:20

+0

Thnx!它工作 – 2011-06-02 15:24:54

+0

@APC:你能提供一個樣本嗎? – Chandu 2011-06-02 15:31:12

2

函數返回值:這就是將它們與程序區分開來的原因。所以,當我們執行他們,我們需要爲返回值提供了一個插座:

在SQL * Plus,這將是

SQL> var whatever varchar2(30) 
SQL> exec :whatever := calculateaward('P0001') 

順便說一句,因爲你的函數執行一個查詢的resulot是COUNT,返回的值應該具有NUMBER的數據類型而不是VARCHAR2。