Regexp_like 在调试器网站上工作,但不在 Oracle SQL Developer 上工作
Posted
技术标签:
【中文标题】Regexp_like 在调试器网站上工作,但不在 Oracle SQL Developer 上工作【英文标题】:Regexp_like working on a debugger website but not working on Oracle SQL Developer 【发布时间】:2019-06-01 11:23:02 【问题描述】:我正在为一个触发器工作,该触发器使用函数在名为 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);
我的触发器说“无效类型”(函数返回 false,但它应该插入)
我收到以下错误:
ORA-20002 无效类型
ORA-06512:AT "dominioMolteplicità",第 3 行
ORA-04088:执行触发器“dominioMolteplicità”时出错
更多 当我执行以下语句时
insert into Partecipa(molteplicità, className, codAss)
values ('*..*', 'Impiegato', 42);
它正确插入(但它不应该根据link
相关编辑:
我希望我的触发器对列 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)
【问题讨论】:
我不熟悉RAISE_APPLICAZION_ERROR
。如果你有这个,那么触发器可能没有正确定义。
* 在正则表达式中表示“任何东西”。如果要引用 * 字符,则需要对其进行转义。当验证返回“f”时,您的触发器会引发错误。如果您想插入无效记录,则需要更改它。
即使我在正则表达式中插入了 ESCAPE*,问题仍然存在
【参考方案1】:
这适用于发布的最新规则集。鉴于您想在发布数字时验证其实际值,因此不可能在单个正则表达式中执行此操作(至少据我所知):
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
如果这些不是您想要强制执行的规则,请编辑您的问题以包含完整的要求。
有a demo on db<>fiddle。
【讨论】:
以上是关于Regexp_like 在调试器网站上工作,但不在 Oracle SQL Developer 上工作的主要内容,如果未能解决你的问题,请参考以下文章