Я получаю сообщение об ошибке при выполнении этой хранимой функции в Oracle - PullRequest
0 голосов
/ 02 июня 2011

Моя сохраненная функция требует ввода и должна возвращать число участников, которые выиграли как минимум две награды ...

Вот мой код;

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 CalculayWard ('P0001'), но это не работает, пожалуйста, помогите.

Ответы [ 2 ]

3 голосов
/ 02 июня 2011

Вы не можете выполнить функцию с помощью exec в отличие от хранимых процедур. Вместо этого попробуйте это:

SELECT calculateaward('P0001') FROM DUAL;

Кроме того, зачем определять функцию как возвращающую VARCHAR2, когда вы возвращаете NUMBER, это не ошибкачисло будет приведено к VARCHAR2 автоматически, но всегда лучше возвращать тот же тип данных, который определен в return

2 голосов
/ 02 июня 2011

Функции возвращают вещи: вот что отличает их от процедур.Поэтому, когда мы выполняем их, нам нужно предоставить приемник для возвращаемого значения:

В SQL * Plus это будет

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

Кстати, поскольку ваша функция выполняет запрос, результат которогоявляется COUNT, возвращаемое значение должно иметь тип данных NUMBER, а не VARCHAR2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...