Ну, тут, похоже, много проблем.
Давайте начнем без проблем с данными.Если вы используете INTO в select statment и select не возвращает строк, вы получите исключение «no data found».Это может быть обработано с помощью блока anonymouse begin end с обработчиком исключений внутри, но я считаю, что это не так.Как пример:
declare
v_value number;
begin
select null
into v_value
from dual
where 1=2;
exception
when NO_DATA_FOUND then
null; -- Ignore exception and continue
end;
Условие 1 = 2 никогда не выполняется, и поэтому выборка всегда не возвращает строк, это всегда приводит к ошибке «Обнаруженные данные».С обработчиком исключений мы решаем, что делать дальше.В этом примере Null ничего не сделает.
Возвращаясь к вашей функции, ваше условие, если переменная lv_date_created меньше или равна текущей дате, тогда что-то сделать.Это никогда не сработает, поскольку lv_date_created будет в момент выполнения равным нулю.Он был объявлен в вашей функции, а затем использован в вашем выборе.Это всегда приводит к значению false, и поэтому select всегда будет возвращать не строки и исключение для найденных данных.
Вы также упоминали, что хотите, чтобы функция возвращала varchar2, но в вашем определении говорится, что она возвращает дату.Также переменная lv_date_created имеет тип date, и это переменная, которая возвращается, и вы заполняете ее значением varchar2, так что, очевидно, Oracle выполняет некоторое неконтролируемое преобразование значения, это не вызывает исключения относительно ожидаемых типов данных.
Такжеусловие lv_date_created <= sysdate может указывать на то, что select найдет множественные значения, а с INTO это вызовет исключение слишком большого числа строк, если найдены множественные строки. </p>
Теперь давайте приступим к исправлению этой функции.Главный вопрос - нужно ли что-то выбирать в этом или нет.Выбор чего-то подобного обычно используется, чтобы проверить, существует ли запись в таблице, и никакие найденные данные исключений не скажут нам, что запись не существует.Если это общая функция, которая будет использоваться в нескольких местах в вашей БД, тогда я думаю, что select не нужен.Я включу оба решения в качестве примера.
Обратите внимание, что для этого первого вы больше не должны создавать dtcreated colume при вызове, кроме idbasket.
CREATE OR REPLACE FUNCTION DAY_ORD_SF
(
P_IDBASKET IN bb_basket.idbasket%type
)
RETURN VARCHAR2 AS
lv_date_created VARCHAR2(240);
BEGIN
SELECT to_char(dtcreated,'DAY') DAY_CREATED
INTO lv_date_created
FROM BB_BASKET
WHERE IDBASKET = P_IDBASKET;
RETURN lv_date_created;
END DAY_ORD_SF;
/
Или
CREATE OR REPLACE FUNCTION DAY_ORD_SF
(
P_DATE_CREATED IN bb_basket.dtcreated%type
)
RETURN VARCHAR2 AS
BEGIN
RETURN to_char(P_DATE_CREATED,'DAY');
END DAY_ORD_SF;
/