如果名称已经太相似,PL/SQL 触发器将不允许插入

问题描述 投票:0回答:1

我一直在尝试在 PL/SQL 中创建一个触发器,如果名称与数据库中已存在的其他名称太相似,则不允许新插入,但我一直在努力创建此触发器(在插入,即使名称非常相似,它也没有任何作用),我能做什么?

代码:

CREATE OR REPLACE TRIGGER similaridade
BEFORE INSERT ON pessoa
FOR EACH ROW
DECLARE
    similaridade_c NUMBER;
BEGIN
    SELECT COUNT(*) INTO similaridade_c
    FROM pessoa
    WHERE SIMILARITY(:NEW.nome, nome) > 0.92;
    
    IF similaridade_c > 0 THEN
        RAISE_APPLICATION_ERROR(-20001, 'Esse nome já existe');
    END IF;
END;
sql oracle plsql triggers
1个回答
0
投票

除非您有一个名为

SIMILARITY
的用户定义函数,否则该函数不存在。您可能需要
UTL_MATCH
包中的功能之一:

CREATE OR REPLACE TRIGGER similaridade
BEFORE INSERT ON pessoa
FOR EACH ROW
DECLARE
    similaridade_c NUMBER;
BEGIN
    SELECT COUNT(*) INTO similaridade_c
    FROM   pessoa
    WHERE  UTL_MATCH.EDIT_DISTANCE_SIMILARITY(:NEW.nome, nome) > 0.92;
    
    IF similaridade_c > 0 THEN
        RAISE_APPLICATION_ERROR(-20001, 'Esse nome já existe');
    END IF;
END;
/

然后,如果你有桌子:

CREATE TABLE pessoa (nome) AS
SELECT 'Anna' FROM DUAL;

然后你插入:

INSERT INTO pessoa (nome) VALUES ('Anya');

然后你会得到错误:

ORA-20001: Esse nome já existe
ORA-06512: at "FIDDLE_DOZWTHWYHQKNLDOVFQZI.SIMILARIDADE", line 9
ORA-04088: error during execution of trigger 'FIDDLE_DOZWTHWYHQKNLDOVFQZI.SIMILARIDADE'

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.