---先来一个多个参数的例子:
实现向表[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