oracle 如果存在主键则更新(update),否则添加新纪录(insert)怎么写。
Create Or Replace Procedure p_Update_Add(Pn_Id In Number, --传入的id
Ln_Code Number, --返回码
Lr_Reinfo Number) Is
Ln_Flags Number;
Begin
Select Count(1) Into Ln_Flags From t_Test Where Id = Pn_Id; --t_test为测试表
If Ln_Flags > 0 Then
--有一条或多条记录存在,表示主键已经存在,进行更新操作
Update t_Test Set Xxx = Xxx;
Lr_Code := 1;
Lr_Reinfo := '进行更新';
Elsif Ln_Flags = 0 Then
--没有记录,进行添加操作
Insert Into t_Test Values (Xx, Xxx, Xxx, Xxx);
Lr_Code := 2;
Lr_Reinfo := '进行新增';
Else
Lr_Code := -1;
Lr_Reinfo := '操作失败';
End If;
Exception
When Others Then
Dbms_Output.Put_Line('出现异常');
Rollback;
End;
merge into 目标表
using(select ……) -----这里是要更新或要插入的数据,一般用select来构造
on ……------这里是更新判断时的关联条件
when match then update 表名 set 字段名=…… -----如果能匹配(即有数据)则更新
WHEN NOT MATCHED THEN
INSERT (字段列表)
values(值列表)
大致如此,具体更详细的用法你可以进一步百度MERGE的用法,资料很多的,这里不赘述了
MERGE INTO table_name alias1 --需要做更新或新增记录的表
USING (table|view|sub_query) alias2 -- 对照表
ON (join condition) --关联条件
WHEN MATCHED THEN -- 当匹配上则更新
UPDATE table_name
SET col1 = col_val1,
col2 = col_val2
WHEN NOT MATCHED THEN -- 无匹配记录则 新增数据
INSERT (column_list) VALUES (column_values);
2017-08-07
可以用merge语句。给你举个例子
CREATE OR REPLACE PROCEDURE test (in_deptno IN NUMBER,
in_dname IN VARCHAR2,
in_loc IN VARCHAR2)
AS
t_record scott.dept%ROWTYPE;
BEGIN
SELECT in_deptno, in_dname, in_loc INTO t_record FROM DUAL;
---用merge语句
MERGE INTO scott.dept dept
USING (SELECT t_record.deptno, t_record.dname, t_record.loc
FROM DUAL)
ON (dept.deptno = t_record.deptno)
WHEN MATCHED
THEN
UPDATE SET dept.dname = t_record.dname, dept.loc = t_record.loc
WHEN NOT MATCHED
THEN
INSERT (deptno, dname, loc)
VALUES (t_record.deptno, t_record.dname, t_record.loc);
END;