Функция PL/SQL возвращается без значения

Вопрос: Я написал ниже 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. когда я вставляю данные,

Вопрос:

Я написал ниже 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;

Оцените статью
Добавить комментарий