Regexp_like работает на веб-сайте отладчика, но не работает на Oracle SQL Developer - PullRequest
1 голос
/ 01 июня 2019

Я работаю над триггером, который предоставляет «домен» для столбца 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)

1 Ответ

1 голос
/ 01 июня 2019

Это работает для последних опубликованных правил. Учитывая, что вы хотите проверить действительные значения чисел при их публикации, это невозможно сделать в одном выражении регулярного выражения (по крайней мере, насколько я знаю):

CREATE OR REPLACE FUNCTION moltepl_valido(mol VARCHAR2) RETURN CHAR IS
BEGIN
    IF regexp_like(mol, '\d+\.\.\d+$')
        and to_number(regexp_substr(mol,'\d+', 1, 2)) > to_number(regexp_substr(mol,'\d+', 1, 1)) then
        RETURN 't';
    ELSIF regexp_like(mol, '^\d+$')
        and to_number(regexp_substr(mol,'\d+')) > 0 then
        RETURN 't';    
    ELSIF regexp_like(LOWER(mol), '(^\d+)\.\.\*$|^\*$') THEN
        RETURN 't';
    ELSE
        RETURN 'f';
    END IF;
END;
/

Принимает следующие значения molteplicità ...

  • 2..*
  • 23..*
  • 0..*
  • 2
  • *
  • 2..3
  • 0..3
  • 23..32
  • 23

... и отклоняет ...

  • 2..A
  • *..*
  • A..B
  • 3..2
  • 2..2

Если это не те правила, которые вы хотите применить, пожалуйста, отредактируйте свой вопрос , включив полный набор требований.

На db <> fiddle есть демоверсия .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...