Regexp_喜欢在调试器网站上工作,但不喜欢在Oracle SQL Developer上工作
我正在寻找一个触发器,它使用一个函数为名为Regexp_喜欢在调试器网站上工作,但不喜欢在Oracle SQL Developer上工作,regex,oracle,plsql,Regex,Oracle,Plsql,我正在寻找一个触发器,它使用一个函数为名为Partecipa的表中的列Molteplicitá提供一个“域” 我创建的触发器如下所示: CREATE OR REPLACE TRIGGER dominioMolteplicità BEFORE INSERT OR UPDATE ON partecipa FOR EACH ROW BEGIN IF moltepl_valido(:NEW.molteplicità) = 'f' THEN RAISE_APPLICATION_ER
Partecipa
的表中的列Molteplicitá
提供一个“域”
我创建的触发器如下所示:
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);
insert into Partecipa(molteplicità, className, codAss)
values ('*..*', 'Impiegato', 42);
我的触发器显示“无效类型”(函数返回false,但它应该插入)
我发现以下错误:
ORA-20002无效类型
ORA-06512:“dominioMolteplicitá”第3行
ORA-04088:执行触发器“dominioMolteplicitá”时出错
更多
当我执行以下语句时
insert into Partecipa(molteplicità, className, codAss)
values ('2', 'Impiegato', 42);
insert into Partecipa(molteplicità, className, codAss)
values ('*..*', 'Impiegato', 42);
它正确插入(但不应根据
相关编辑:
我希望触发器为列Molteplicitá
强制以下值:
接受(仅在这些情况下):
这适用于最新发布的一组规则。由于您希望在发布数字时验证数字的实际值,因此无法在单个正则表达式中执行此操作(至少据我所知): 它接受以下值
molteplicitá
2..*
23..*
0..*
2
*
2..3
0..3
23..32
23
2..A
*..*
A..B
3..2
2..2
有。我不熟悉
RAISE\u application\u ERROR
。如果您有此问题,则可能无法正确定义触发器。*表示“任何”在regexp中。如果要引用*字符,则需要对其进行转义。当验证返回“f”时,触发器会引发错误。如果要插入无效记录,则需要更改该错误。即使我在regexp中插入了转义*,问题仍然存在
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;
/