Sql 在Oracle中执行此存储函数时出错
我的存储函数需要输入,并应返回至少获得两个奖项的成员数 这是我的密码Sql 在Oracle中执行此存储函数时出错,sql,oracle,function,Sql,Oracle,Function,我的存储函数需要输入,并应返回至少获得两个奖项的成员数 这是我的密码 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
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 CalculateWard('P0001'),但它不起作用,请提供帮助。与存储过程不同,不能使用exec执行函数。请尝试以下操作:
SELECT calculateaward('P0001') FROM DUAL;
另外,为什么在返回数字时将函数定义为返回VARCHAR2?这不是错误,因为数字将自动转换为VARCHAR2,但最好返回由returns定义的相同数据类型。与存储过程不同,您不能使用exec执行函数。请尝试以下方法:
SELECT calculateaward('P0001') FROM DUAL;
另外,为什么在返回数字时将函数定义为返回VARCHAR2,这不是错误,因为数字将自动转换为VARCHAR2,但最好返回返回函数返回内容定义的相同数据类型:这就是它们与过程的区别。因此,当我们执行它们时,我们需要为返回值提供一个容器: 在SQL*中,加上
SQL> var whatever varchar2(30)
SQL> exec :whatever := calculateaward('P0001')
顺便说一下,当您的函数执行一个查询,其结果是一个计数时,返回值的数据类型应该是NUMBER,而不是VARCHAR2 函数返回东西:这就是它们与过程的区别。因此,当我们执行它们时,我们需要为返回值提供一个容器: 在SQL*中,加上
SQL> var whatever varchar2(30)
SQL> exec :whatever := calculateaward('P0001')
顺便说一下,当您的函数执行一个查询,其结果是一个计数时,返回值的数据类型应该是NUMBER,而不是VARCHAR2 定义“不工作”。什么是预期的行为,什么是观察到的行为?你得到的错误是什么?由于未提供DDL和数据,提供错误代码/消息有助于解决问题…定义“不起作用”。预期的行为和观察到的行为是什么?您得到的错误是什么?由于未提供DDL和数据,提供错误代码/消息有助于解决问题…实际上我们可以执行函数。@APC:您能提供示例吗?实际上我们可以执行函数。@APC:您能提供示例吗?