Oracle
Allen 2025-11-05 13:01:00 76 0 0 0 0
Oracle基础,SQL,本文介绍如何在Oracle数据库中使用SQL语句实现根据某一条件来进行更新或插入操作。在实际的数据库应用中,我们经常遇到这样的需求:如果某一行数据存在,则对其进行更新;如果不存在,则插入一条新的数据。我们可以使用Oracle特有的MERGE语句,实现根据条件来进行更新或插入操作

---先来一个多个参数的例子:

实现向表[endba.enjbparamls]写入和更新数据的功能,

需要传入5个参数:job_no,rev_no,param_who,param_ymd,param_qty

SQL如下:

MERGE INTO endba.enjbparamls el
USING (SELECT :job_no as job_no,:rev_no as rev_no,:param_who as param_who,:param_ymd as param_ymd,:param_qty as param_qty FROM dual) t
ON (el.job_no = t.job_no and el.rev_no=t.rev_no)
WHEN MATCHED THEN
   UPDATE SET el.param_who = t.param_who,el.param_ymd = t.param_ymd,el.param_qty=t.param_qty
WHEN NOT MATCHED THEN
   INSERT (job_no,rev_no,param_who,param_ymd,param_qty) VALUES (t.job_no,t.rev_no,t.param_who,t.param_ymd,t.param_qty)

程序中实现:

                     with dm.QI_ENPARAMLS_010 do begin
                         Close;
                         paramByName('job_no').asString := pJobNo;
                         paramByName('rev_no').asString := pPasRevNo;
                         paramByName('param_who').asString := 'XXX';
                         paramByName('param_ymd').asString := 'XXX';
                         paramByName('param_qty').asString := '0';
                         execsql;                         
                     end;


---------第一种方法:

我们可以使用Oracle特有的MERGE语句,实现根据条件来进行更新或插入操作

---更新数据

在Oracle中,我们可以使用UPDATE语句来更新已存在的数据。下面是一个示例,假设我们有一张名为employees的表,其中包含员工的编号、姓名和部门。

UPDATE employees
SET department = 'Sales'
WHERE employee_id = 100;

上述示例中,我们将employees表中employee_id为100的员工的department字段更新为’Sales’。

---插入数据

如果要插入数据,我们可以使用INSERT INTO语句。下面是一个示例,假设我们要向employees表中插入一条新的员工记录。

INSERT INTO employees (employee_id, name, department)
VALUES (200, 'John Smith', 'Human Resources');

上述示例中,我们插入了一条员工记录,其中包含员工编号、姓名和部门。

---存在则更新,不存在则插入

为了实现根据条件来进行更新或插入操作,我们可以使用Oracle特有的MERGE语句。

下面是一个示例,假设我们有一张名为employees的表,其中包含员工的编号、姓名和薪水。我们要根据员工编号进行操作,如果员工编号为100的员工存在,则更新其薪水为5000;如果不存在,则插入一条新的员工记录,编号为100,薪水为5000。

MERGE INTO employees e
USING (SELECT 100 as employee_id, 5000 as salary FROM dual) t
ON (e.employee_id = t.employee_id)
WHEN MATCHED THEN
   UPDATE SET e.salary = t.salary
WHEN NOT MATCHED THEN
   INSERT (employee_id, salary) VALUES (t.employee_id, t.salary);

上述示例中,我们使用了MERGE INTO语句将employees表与一个临时表进行合并。临时表中的数据是我们要操作的数据,通过SELECT语句指定了员工编号和薪水。MERGE语句中的ON子句指定了合并条件,WHEN MATCHED THEN UPDATE表示当匹配到数据时更新操作,WHEN NOT MATCHED THEN INSERT表示当未匹配到数据时插入操作。

示例二:

MERGE into TEST a using (select * from TEST) b on (a.id = b.id)
    when matched then //如果
    update TEST set NAME='BB'
    when not matched then
    nsert into TEST (ID,NAME) VALUES (1,'AA');

附带一条查询若没有插入的

insert 
when 
(not exists
 (select e.* from 表名 e where e.id ='aaaaaaaaa')
) then
into 表名(id,name) select 'aaaaaaaaa' ,'1111' from dual

通过使用Oracle的MERGE语句,我们可以轻松实现根据条件进行更新或插入操作。这种方式简化了数据库操作,并提高了执行效率。我们可以根据实际需求,在一个语句中完成更新和插入操作,避免了多次数据库查询和操作的麻烦。

-------第二种方法

SQL写法:

begin
  update table_name set salary = 10000 where emp_id = 5;
  if sql%notfound then
   insert into table_name (id,name,salary)values("","","") ;
  end if;
end;

SQL%NOTFOUND 是一个布尔值。与最近的sql语句(update,insert,delete,select)发生交互,当最近的一条sql语句没有涉及任何行的时候,则返回true。否则返回false。这样的语句在实际应用中,是非常有用的。例如要update一行数据时,如果没有找到,就可以作相应操作。

当update emp_id为5的这行记录,如果update影响条数为0,则插入一条数据。 

SQL%FOUND 的用法与sql%notfound用法相反,也是与最近的sql语句发生交互,如果影响行数大于0条,则为true,否则为false。

 SQL%ROWCOUNT在dml语句执行前是null,执行后,对于select into语句,执行成功则值为1,不成功则值为0。

(这个未测试)


Tag: Oracle基础 SQL
欢迎评论
未登录,
请先 [ 注册 ] or [ 登录 ]
(一分钟即可完成注册!)
返回首页     ·   返回[Oracle]   ·   返回顶部