pl-sql как выполнить простую функцию max (дата)

#sql #oracle #plsql #ora-00933

#sql #Oracle #plsql #ora-00933

Вопрос:

здравствуйте, я новичок в oracle db, как я могу просто запросить максимальную дату?

 FUNCTION get_max_date_rec(
  i_value_date                  IN  vat.value_date%TYPE := app_utilities_q.server_sys_date )
RETURN vat.rec_id%TYPE
IS 
 v_date vat.value_date%TYPE; 
BEGIN

  SELECT  MAX(v.value_date)--compiler err
  INTO    v_date
  FROM    vat v 
  WHERE v.value_date < i_value_date 

  RETURN get_rec_by_date(v_date).rec_id;--compiler err

 END get_max_date_rec;
  

РЕДАКТИРОВАТЬ
это ошибка, созданная компилятором
Ошибка (76,7): PL / SQL: инструкция SQL проигнорирована
Ошибка (81,7): PL / SQL: ORA-00933: команда SQL завершилась неправильно

Я хочу вернуть rec_id, как написано выше…

Комментарии:

1. Что вы хотите вернуть: значение REC_ID или всю запись целиком?

2. скорее всего, если вы создаете отдельную функцию, чтобы просто получить максимальное значение, вы слишком все усложняете. Хороший шанс, что эта логика может / должна быть частью большего оператора SQL (select..group by)

Ответ №1:

 FUNCTION get_max_date_rec(
  i_value_date  IN  vat.value_date%TYPE 
    default app_utilities_q.server_sys_date  -- assuming this is a default
  )
RETURN vat.rec_id%TYPE
IS 
 v_date vat.value_date%TYPE; 
BEGIN

  SELECT  MAX(v.value_date)--compiler err
  INTO    v_date
  FROM    vat v 
  WHERE v.value_date < i_value_date 

  RETURN v_date;

 END get_max_date_rec;
  

Один из рисков заключается в том, что если в vat не существует записей за дату, превышающую i_value_date , код завершится ошибкой, вызвав NO_DATA_FOUND исключение. Вам следует подумать, как вы могли бы захотеть обработать это условие — или не обрабатывать его, если это правильно.

Комментарии:

1. В исходном плакате отсутствует точка с запятой после i_value_date в строке WHERE v.value_date < i_value_date . Без полной ошибки компилятора я только предполагаю, но я подозреваю, что это вызывает ошибки компиляции, о которых сообщается.

2. Вы никогда не получите, NO_DATA_FOUND если запрос получает aggregate.

Ответ №2:

проблема заключалась не в добавлении

 ;
  

в конце выберите

   SELECT  MAX(v.value_date)--compiler err
  INTO    v_date
  FROM    vat v 
  WHERE v.value_date < i_value_date ;