我在文件中有一个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
编辑:如果这是我唯一的选择,我现在可以使用临时表。
答案 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;
/
如果这是一项常规任务,我肯定会选择外部表格。