在oracle中插入和更新文件中的行

时间:2013-11-15 14:41:06

标签: sql oracle bash sql-loader ctl

我在linux中有一个文件,该文件类似于: (我有数百万行)

 date              number      name           id          state
20131110            1089      name1          123           start
20131110            1080      name2          122           start
20131110            1082      name3          121           start
20131114            1089      name1          120           end
20131115            1082      name3          119           end

我在Oracle中有一个表,其中包含以下文件:

init_table

start_date
end_date
number
name
id

问题是我读到我可以插入带有sqlloader的数据,(我有数百万行,然后创建一个时间表来插入,稍后用触发器更新,另一个表不是很好)问题是我有一个开始日期为X的用户,例如数字1089的开始日期为:20131110,该用户的end_date为:20131114,然后我需要先在我的表中插入start_date,之后当我找到end_date,更新我插入的数字表,在我的例子中是1089,结束日期是:20131114。

如何使用ctl或其他东西。

谁能帮助我。感谢

3 个答案:

答案 0 :(得分:2)

什么版本的Oracle?

我会使用外部表。定义与您的平面文件完全匹配的外部表。然后,您应该能够通过两次传递,一次插入,一次更新来解决这个问题。

这样的事情应该这样做:

insert into init_table select to_date(date,'YYYYMMDD'),null,number,name,id from external_table where state='start';

update init_table set end_date=(select date from external_table where state='end' and init_table.number=external_table.number);

请注意,您实际上不能拥有名为“date”或“number”的列,因此,上面的sql实际上并不像写入的那样工作。您必须更改这些列名称。

希望有帮助...

答案 1 :(得分:1)

$ cat sqlldrNew.ctl

load data
 infile '/home/Sameer/employee.txt'
 into table employee
 fields terminated by X'9'
 ( date, -->select number from employee where name=[Name from the file record], name, id, state )

$ sqlldr scott/tiger control=/home/Sameer/sqlldrNew.ctl

我认为这应该有用。

答案 2 :(得分:1)

如果使用外部表方法,则可以将外部表中的数据连接到自身,以生成可以插入的单个记录。虽然连接很昂贵,但总的来说它应该是一个有效的过程,只要我期望使用的散列连接保留在内存中。

就像......

insert into init_table (
  start_date,
  end_date,
  number,
  name,
  id)
select
  s.date,
  e.date,
  s.number,
  s.name,
  s.id
from external_table s
join external_table e on s.number = e.number
where
  s.state = 'start' and
  e.state = 'end'

假设每个开始日期总会有一个结束日期,并且该表中的数字不存在 - 如果其中任何一个条件不成立,那么在前一种情况下将需要外连接,以及后者需要合并。