Я работаю над триггером, который предоставляет «домен» для столбца Molteplicità
в таблице с именем Partecipa
с использованием функции.
Триггер, который я создал, выглядит следующим образом:
CREATE OR REPLACE TRIGGER dominioMolteplicità
BEFORE INSERT OR UPDATE ON partecipa
FOR EACH ROW
BEGIN
IF moltepl_valido(:NEW.molteplicità) = 'f' THEN
RAISE_APPLICATION_ERROR(-20002, 'Invalid type');
END IF;
END;
, которая использует следующую функцию:
CREATE OR REPLACE FUNCTION moltepl_valido(mol VARCHAR2) RETURN CHAR IS
BEGIN
IF regexp_like(LOWER(mol), '[\d]+\.\.[\*]|[\d]|[\*]') THEN
RETURN 't';
ELSE
RETURN 'f';
END IF;
END;
Таблица Partecipa
имеет следующие столбцы:
CodP INT,
molteplicità VARCHAR2,
codAss INT,
className VARCHAR2,
PRIMARY KEY (codP),
FOREIGN KEY (className) REFERENCES class(name),
FOREIGN KEY (codAss) REFERENCES associazione(cod)
Когда я выполняю следующую инструкцию
insert into Partecipa(molteplicità, className, codAss)
values ('2', 'Impiegato', 42);
мой триггер говорит "Неверный тип" (функция возвращает false, но он должен вставить)
Я получаю эти ошибки:
ORA-20002 НЕВЕРНЫЙ ТИП
ORA-06512: AT "dominioMolteplicità", строка 3
ORA-04088: ОШИБКА ВО ВРЕМЯ ИСПОЛНЕНИЯ ТРИГГЕРА "dominioMolteplicità"
Больше
Когда я выполняю следующее заявление
insert into Partecipa(molteplicità, className, codAss)
values ('*..*', 'Impiegato', 42);
вставляется правильно (но не в соответствии с ссылкой
Соответствующее редактирование:
Я хочу, чтобы в моем триггере использовались следующие значения для столбца Molteplicità
:
принять (только в этих случаях) :
'n..m' (where n>=0, m > 0 and n<m)
'*' (where * is literally the character *)
'n..*' (where n>=0 and * is literally the character *)
'n' (where n>0)
не принимают :
'*..*' (where * is any character)
'*..n' (where * is literally the character * and for any value of n)
'n..m' (where n>=0, m > 0 and n>=m)