2

我在 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

问题是我读到我可以使用 a 插入数据sqlloader(我有数百万行,然后创建一个要插入的临时表,然后使用触发器更新另一个表不好)问题是我有一个用户开始日期 X,例如数字 1089 的开始日期是:20131110,而这个用户的 end_date 是:20131114,那么我需要先在我的表中插入 start_date,然后当我找到 end_date 时,更新我的数字表我正在插入,在我的示例中为 1089,结束日期为:20131114。

如何用 ctl 或其他东西来做到这一点。

谁能帮我。谢谢

4

3 回答 3

2

什么版本的甲骨文?

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

这样的事情应该这样做:

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);

请注意,您实际上不能有名为“日期”或“数字”的列,因此,上面的 sql 实际上并不能像所写的那样工作。您必须更改这些列名。

希望有帮助...

于 2013-11-15T15:02:28.643 回答
1
$ 猫 sqlldrNew.ctl

加载数据
 infile '/home/Sameer/employee.txt'
 进入表员工
 以 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

我认为这应该有效。

于 2013-11-15T15:42:03.363 回答
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'

假设每个开始日期总是有一个结束日期,并且该数字在表中不存在 - 如果其中任何一个条件不正确,则在前一种情况下将需要外部连接,并且后者需要合并。

于 2013-11-15T16:48:52.380 回答