插入或更新表格

时间:2015-08-21 09:08:05

标签: sql oracle syntax sql-merge

我在文件中有一个100k ID列表。我想迭代这些ID:

每个<sam:Order> <Order1> <OrderNo>12345</OrderNo> <OrderDate>13-08-2015</OrderDate> <OrderMode>online</OrderMode> </Order1> </sam:Order>

,检查表中是否有<Order1> <OrderNo>12345</OrderNo> <OrderDate>13-08-2015</OrderDate> <OrderMode>online</OrderMode> </Order1>

  • 如果是,请更新其id标志
  • 如果没有,请添加新记录id

我研究并发现updated_date条款。缺点是,(id, updated_date)要求id在表中。我只允许在必要时创建一个临时表。

任何人能指出我正确的方向吗?它必须是我可以在我的数据库上运行的脚本,而不是代码。

MERGE

编辑:如果这是我唯一的选择,我现在可以使用临时表。

2 个答案:

答案 0 :(得分:1)

鉴于您说您无法创建临时表,一种方法可能是将您的ID列表转换为一组联合所有选择,例如:

123,
234,
...
999

变为

select 123 id from dual union all
select 234 id from dual union all
...
select 999 id from dual

然后您可以在合并声明中使用它:

merge into MyTable x
using (select 123 id from dual union all
       select 234 id from dual union all
       ...
       select 999 id from dual) b
on (x.id = b.id)
when not matched then insert (id, updated_date) values (b.id, sysdate)
when matched then update set x.updated_date = sysdate;

如果您真的有100k ID,那么解析该语句可能需要一段时间!您可能希望拆分查询并使用多个合并语句。

另一个想法 - 是不是现有的GTT你可以&#34;借用&#34;存储您的数据?

答案 1 :(得分:1)

如果您可以从Oracle服务器访问该文件,那么您可以定义一个外部表,这将允许您使用SQL读取该文件。

语法基于SQL * Loader,它可能不是你想要为临时工作做的事情,而是更多的重复性任务。

或者,您可以使用SQL * Loader本身将其加载到表中,甚至从Microsoft Access或类似数据库中加载ODBC。

另一个选择是运行100,000个插入。您可以通过将每个100个左右的插入并将它们包装在一个匿名块中来实现更好的性能,从而节省往返数据库,从而代替:

insert into tmp values(1);
insert into tmp values(12);
insert into tmp values(145);
insert into tmp values(234);
insert into tmp values(245);
insert into tmp values(345);
....
insert into tmp values(112425);

使用......

begin
  insert into tmp values(1);
  insert into tmp values(12);
  insert into tmp values(145);
  insert into tmp values(234);
  ...
  insert into tmp values(245);
end;
/
begin
  insert into tmp values(345);
  ...
  insert into tmp values(112425);
end;
/

如果这是一项常规任务,我肯定会选择外部表格。