我一直在尝试在 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;
除非您有一个名为
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'