利用merge语句实现单表新增更改

在做开发中经常遇到需要先select一条,判断有没有存在记录,有则update,若没有存在则insert一条新记录。

如果是通过程式判断,需要两条SQL语句,一条执行select,再根据返回结果做判断。这样效率明显不如用一条语句解决,在oracle中可以用merge

1 MERGE INTO T_CONFIGFIELDS T1
2 USING (SELECT 'TEST1' CONFIG_ID FROM DUAL) T2
3 ON (T1.CONFIG_ID = T2.CONFIG_ID)
4 WHEN MATCHED THEN
5 UPDATE SET T1.CONFIG_STR = 'ABC'
6 WHEN NOT MATCHED THEN
7 INSERT (CONFIG_ID, CONFIG_STR) VALUES ('TEST1', 'ABC')

上面一条既解决了判断表T_CONFIGFIELDS中是否存在CONFIG_ID为'TEST1'的记录,如果存在则将其字段CONFIG_STR更新为'ABC',若不存在则新增一条记录。采用存储过程效率会更高。

 1 CREATE OR REPLACE PROCEDURE PRC_MERGECONFIGFIELDS(P_CONFIGID  IN VARCHAR2,
2 P_CONFIGSTR IN VARCHAR2) IS
3 V_SQL VARCHAR2(2000) := '';
4 BEGIN
5 V_SQL := 'MERGE INTO T_CONFIGFIELDS T1 USING (SELECT ''' || P_CONFIGID ||
6 ''' CONFIG_ID FROM DUAL) T2 ON (T1.CONFIG_ID = T2.CONFIG_ID) WHEN MATCHED THEN ' ||
7 'UPDATE SET T1.CONFIG_STR =''' || P_CONFIGSTR ||
8 ''' WHEN NOT MATCHED THEN INSERT (CONFIG_ID, CONFIG_STR) VALUES (''' ||
9 P_CONFIGID || ''',''' || P_CONFIGSTR || ''')';
10 --DBMS_OUTPUT.put_line(V_SQL);
11 EXECUTE IMMEDIATE V_SQL;
12 END PRC_MERGECONFIGFIELDS;




posted @ 2012-03-31 12:01  lzone6  阅读(2932)  评论(0)    收藏  举报