2013-11-14 71 views
0

以下是我的程序。它会插入,但每次执行该过程时都会插入一个重复的行。我不想那样,但我已经尝试了一切,我不知道如何解决这个问题。PL/SQL插入程序,如果行不存在则插入

我的代码:

CREATE OR REPLACE PROCEDURE Insert_Cidades(p_NOME CIDADE.NOME_CIDADE%TYPE) 
IS 
BEGIN 
    INSERT INTO CIDADE(COD_CIDADE,NOME_CIDADE) VALUES(seq_id_cidade.NEXTVAL,p_NOME); 
END Insert_Cidades; 
/

这是在PL/SLQ预言。

回答

1
MERGE INTO CIDADE 
USING (SELECT p_NOME as NOME FROM DUAL) x 
ON (x.NOME = NOME_CIDADE) 
WHEN NOT MATCHED THEN 
    INSERT (COD_CIDADE, NOME_CIDADE) 
    VALUES (seq_id_cidade.NEXTVAL, p_NOME) 

INSERT INTO CIDADE 
SELECT 
    seq_id_cidade.NEXTVAL, 
    p_NOME 
FROM 
    dual 
WHERE NOT EXISTS (SELECT 'x' FROM CIDADE WHERE NOME_CIDADE = p_NOME) 

注意,比较NOME_CIDADE = p_NOME是大小写敏感的,这意味着你仍然可以插入“约翰”,“约翰”,“约翰”和“约翰”。如果您不想要,请将其更改为upper(NOME_CIDADE) = upper(p_NOME)nlssort(NOME_CIDADE) = nlssort(p_NOME)之类的内容。

+1

WHEN _NOT_ MATCHED :-) –

+0

是的,我注意到了。已经修复。谢谢 :) – GolezTrol