2011-06-02 269 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。