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