#oracle #plsql #oracle-apex
#Oracle #plsql #oracle-apex
Вопрос:
Я разрабатываю простое приложение в Oracle APEX, и одним из требований является создание сообщения об ошибке, если дублирующийся столбец (который также является частью таблицы) сохраняется в интерактивной сетке. Я создал пакет поддержки, а затем проверку столбцов в APEX, которая вызывает функцию в пакете поддержки.
Когда я впервые внедрил код и вызов, все работало и отображалось правильное сообщение об ошибке. Однако я думаю, что я неосознанно изменил настройку свойства или что-то в этом роде, потому что теперь я не могу запустить проверку — если пользователь вводит повторяющееся значение столбца и нажимает сохранить, они получают общее сообщение об ошибке «нарушение ограничений», которое выдает Oracle. Единственным процессом IG в этом приложении является кнопка автоматической обработки строк — Сохранить.
Кто-нибудь знает, почему проверка столбца игнорируется? Я прошел через стек ошибок «нарушения ограничений», и все, что я вижу, это процесс сохранения и общие сообщения об ошибках Oracles.
Функция пакета поддержки:
`FUNCTION Prod_Family_Exists (
i_id IN NUMBER
,i_prod_family IN VARCHAR2
) RETURN BOOLEAN IS
v_cnt NUMBER;
BEGIN
SELECT COUNT(*)
INTO v_cnt
FROM adm_prod_families
WHERE prod_family = i_prod_family
AND id <> i_id
;
IF v_cnt = 0 THEN
RETURN(FALSE);
ELSE
RETURN(TRUE);
END IF;
EXCEPTION
WHEN OTHERS THEN
RETURN(FALSE);
END Prod_Family_Exists;
END Z_TEST;`
Вызов проверки в функции APEX — PL / SQL (возвращает логическое значение):
BEGIN
IF z_test.prod_family_exists( i_id => :id
,i_prod_family => :prod_family)
THEN
RETURN FALSE;
ELSE
RETURN TRUE;
END IF;
END;
Основываясь на приведенном ниже изображении и предоставленном мной коде, мое пользовательское сообщение об ошибке будет выдаваться только в том случае, если результат проверки вернул FALSE, верно? Плохой ли код?
Ответ №1:
Я понял это. Необходимо было изменить код для вызова проверки функции пакета поддержки. Новый код:
BEGIN
IF z_test.prod_family_exists( i_id => NVL(:id,0)
,i_prod_family => :prod_family)
THEN
RETURN FALSE;
ELSE
RETURN TRUE;
END IF;
END;