Вопрос:
Я написал ниже FUNCTION чтобы проверить, что данный reference number существует.
FUNCTION find_reference_no( p_ref_no IN VARCHAR2) RETURN VARCHAR2 AS v_ref_no varchar2(50); BEGIN select REF_NO into v_ref_no from cash where REF_NO = p_ref_no; EXCEPTION WHEN no_data_found THEN v_ref_no := ‘#’; RETURN v_ref_no; END;
Я вызвал эту функцию в AFTER INSERT TRIGGER. когда я вставляю данные, Ii’m получает ошибку как
ORA-06503: PL/SQL: Function returned without value
Как я могу это решить?
PS: Я не вставляю данные в cash стол. Я вставляю данные в другую таблицу (предположим, что это таблица B) и называет эту функцию в ней (таблица B) AFTER INSERT TRIGGER.
Лучший ответ:
Все функции должны выполнять оператор RETURN. Ваша функция имеет RETURN в своем блоке исключений, так что оператор не будет выполнен в обычных обстоятельствах.
Операция select помощью дополнительного begin end блока со своим собственным сектором exception решит вашу проблему. Таким образом, ваша функция может выглядеть так:
create or replace function find_reference_no( p_ref_no IN VARCHAR2) return varchar2 AS v_ref_no varchar2(50); begin begin select REF_NO into v_ref_no from cash where REF_NO = p_ref_no; exception WHEN no_data_found THEN v_ref_no := ‘#’; end; return v_ref_no; end; Ответ №1
Поскольку функция просто возвращает то же значение, что и параметр, если она существует в таблице, вы можете избежать неудобного использования обработки исключений и переписать это как:
function find_reference_no( ref_no in varchar2) return varchar2 as row_count integer begin select count(*) into row_count from cash where cash.ref_no = find_reference_no.ref_no and rownum = 1 if row_count = 0 return ‘#’ else return ref_no end if; end find_reference_no;
Я бы вернул 1 или 0 (т.е. Значение row_count), чтобы указать, что запись существует или не существует.
function find_reference_no( ref_no in varchar2) return varchar2 as row_count integer begin select count(*) into row_count from cash where cash.ref_no = find_reference_no.ref_no and rownum = 1 return row_count end find_reference_no;