Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regexp_喜欢在调试器网站上工作,但不喜欢在Oracle SQL Developer上工作_Regex_Oracle_Plsql - Fatal编程技术网

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;
/