#sql #oracle #function
#sql #Oracle #функция
Вопрос:
Моя сохраненная функция требует ввода и должна возвращать количество участников, которые получили по крайней мере две награды…
Вот мой код;
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;
Я пытаюсь выполнить функцию следующим образом
выполните calculateaward(‘P0001’), но это не работает, пожалуйста, помогите.
Комментарии:
1. Определите «не работает». Каково ожидаемое поведение и каково наблюдаемое поведение?
2. Что это за ошибка, которую вы получаете? Поскольку DDL и данные не предоставлены, предоставление кода ошибки / сообщения может помочь решить проблему…
Ответ №1:
Вы не можете выполнить функцию с помощью exec в отличие от хранимых процедур..Вместо этого попробуйте это:
SELECT calculateaward('P0001') FROM DUAL;
Кроме того, зачем определять функцию как возвращающую VARCHAR2, когда вы возвращаете ЧИСЛО, это не ошибка, поскольку число будет приведено к VARCHAR2 автоматически, но всегда лучше возвращать тот же тип данных, который определен returns
Комментарии:
1. На самом деле мы можем выполнять функции.
2. @APC: Можете ли вы предоставить образец?
Ответ №2:
Функции возвращают вещи: это то, что отличает их от процедур. Поэтому, когда мы их выполняем, нам нужно предоставить хранилище для возвращаемого значения:
В SQL * Plus это было бы
SQL> var whatever varchar2(30)
SQL> exec :whatever := calculateaward('P0001')
Кстати, поскольку ваша функция выполняет запрос, результатом которого является КОЛИЧЕСТВО, возвращаемое значение должно иметь тип данных NUMBER, а не VARCHAR2 .