首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Oracle通过过程插入或更新行

Oracle通过过程插入或更新行
EN

Stack Overflow用户
提问于 2012-10-03 09:39:16
回答 3查看 25.1K关注 0票数 2

我有张桌子

代码语言:javascript
运行
复制
CREATE TABLE STUDENT
(
  ID            INTEGER PRIMARY KEY,
  FIRSTNAME     VARCHAR2(1024 CHAR),
  LASTNAME      VARCHAR2(1024 CHAR),
  MODIFIEDDATE  DATE  DEFAULT sysdate
)

我正在插入一行数据

代码语言:javascript
运行
复制
insert into STUDENT (ID, FIRSTNAME, LASTNAME, MODIFIEDDATE)  values (1,'Scott', 'Tiger', sysdate);

当我必须插入数据记录时,我需要编写一个过程或函数,该过程或函数执行以下操作:

  1. 如果没有相同id的记录,请插入该行。
  2. 如果有相同的id和数据匹配的记录,那么什么也不做。
  3. 如果存在相同id的记录,但数据不匹配,则更新数据。

我是新来的神谕。从java端,可以按id选择记录,然后更新该记录,但这将进行2次数据库调用。为了避免这种情况,我尝试使用一个过程更新表。如果在一个数据库调用中也可以这样做,请说明。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-10-03 09:46:20

对于单个SQL语句解决方案,可以尝试使用合并语句,如本答案https://stackoverflow.com/a/237328/176569中所述。

例如:

代码语言:javascript
运行
复制
create or replace procedure insert_or_update_student(
p_id number, p_firstname varchar2, p_lastname varchar2
) as
begin
    merge into student st using dual on (id = p_id)
         when not matched then insert (id, firstname, lastname) 
           values (p_id, p_firstname, p_lastname)
         when matched then update set 
           firstname = p_firstname, lastname = p_lastname, modifiedate = SYSDATE
end insert_or_update_student;
票数 3
EN

Stack Overflow用户

发布于 2012-10-03 09:47:46

尝试在oracle中使用合并,而不是过程。如果匹配值,它将更新表,如果找不到值,则将插入值。

代码语言:javascript
运行
复制
MERGE INTO bonuses b
USING (
  SELECT employee_id, salary, dept_no
  FROM employee
  WHERE dept_no =20) e
ON (b.employee_id = e.employee_id)
WHEN MATCHED THEN
  UPDATE SET b.bonus = e.salary * 0.1
  DELETE WHERE (e.salary < 40000)
WHEN NOT MATCHED THEN
  INSERT (b.employee_id, b.bonus)
  VALUES (e.employee_id, e.salary * 0.05)
  WHERE (e.salary > 40000)

尝尝这个

票数 3
EN

Stack Overflow用户

发布于 2017-06-08 09:25:44

要解决第二个任务--“如果有相同id和数据匹配的记录,那么什么也不做。”--从10g开始,我们在更新和插入合并操作符的部分中增加了"where“子句。要执行此任务,我们可以添加一些检查数据更改的内容:

代码语言:javascript
运行
复制
    when matched then update
        set student.last_name = query.last_name 
           where student.last_name <> query.last_name

这将只更新匹配的行,并且只更新数据被更改的行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12705752

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档