Проверка столбца не выполняется в интерактивной сетке Oracle APEX

#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, верно? Плохой ли код?

Сеанс для вставки записи с повторяющимся значением столбца - возвращает true

Ответ №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;