избегая дубликатов oracle aapex - PullRequest
0 голосов
/ 28 февраля 2020

Я пытаюсь избежать дубликатов в таблице с именем 'входящий запрос', моя таблица выглядит следующим образом

CREATE TABLE "REGISTRY"."INCOMINGREQUEST" 
   (    "ID" NUMBER(30,0), 
    "FILENUMBER" VARCHAR2(30 BYTE), 
    "REQUESTEDFILE" VARCHAR2(300 BYTE), 
    "REQUESTEDDEPARTMENT" VARCHAR2(30 BYTE), 
    "REQUESTDATE" DATE, 
    "STATUS" VARCHAR2(30 BYTE), 
    "URGENCY" VARCHAR2(30 BYTE), 
    "VOLUME" NUMBER(30,0), 
    "SUB" NUMBER(30,0), 
    "REGISTRYID" NUMBER(30,0), 
    "TEMPORARY" VARCHAR2(30 BYTE)
   )

, а данные таблицы выглядят следующим образом

filenumber      Filename        requester           status     REQUESTEDDEPARTMENT
   1/11/2       Payments         JOSHUA MITCHELL    PENDING        DAY CARE
   1/11/2       Payments         JOSHUA MITCHELL    Delivered      DAY CARE
   1/11/2       Payments         JOSHUA MITCHELL    PENDING        DAY CARE
   1/11/2       Payments         RAWLE MUSGRAVE     PENDING        COMCORP

Примечание: только я включил важные поля выше для этого сценария (другие поля в таблице содержат данные).

Чего я хочу достичь, так это когда app_user, который в данном случае является отделом (дневной уход), делает тот же запрос, пока предыдущий запрос находится в состоянии ожидания (статус). Я хочу, чтобы произошла ошибка. поэтому 3-я запись / запрос не должны были произойти.

триггер, который я пробую,

create or replace trigger "INCOMINGREQUEST_T1"
BEFORE
insert or update or delete on "INCOMINGREQUEST"
for each row

DECLARE counter INTEGER;
BEGIN
    SELECT * INTO COUNTER FROM
      (SELECT COUNT(rownum) FROM INCOMINGREQUEST  WHERE requesteddepartment = V('APP_USER')
      and status ='PENDING');
    IF counter = 1 THEN
      RAISE_APPLICATION_ERROR(-20012,'Duplicated value');
    END IF;
END;

, но я получаю ошибку

REGISTRY.INCOMINGREQUEST is mutating, trigger/function may not see it ORA-06512: at "REGISTRY.INCOMINGREQUEST_T1", line 3 ORA-04088: error during execution of trigger 'REGISTRY.INCOMINGREQUEST_T1'

Ответы [ 2 ]

0 голосов
/ 01 марта 2020

Вы можете использовать процедуру для остановки дубликатов и передачи параметров, которые необходимо вставить в таблицу.

Проблема с использованием триггера для определения текущего состояния заключается в том, что вы не можете запрашивать информацию из таблица, которую вы вставляете / обновляете / удаляете изнутри триггера, так как данные "Mutating".

Для запуска процедуры используйте:

BEGIN

stack_pr c ( «УХОД ЗА ДНЕМ», «В ОЖИДАНИИ»);

END;

Процедура

0 голосов
/ 28 февраля 2020

Вы можете легко достичь желаемого поведения, используя условное UNIQUE index следующее:

CREATE UNIQUE INDEX INCOMINGREQUEST_IDX ON
    T1 ( CASE WHEN STATUS = 'PENDING'   
              THEN FILENUMBER
         END );

Cheers !!

...