Я получаю сообщение об ошибке при выполнении этой сохраненной функции в Oracle

#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 .