Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在oracle中插入和更新文件中的行_Sql_Oracle_Bash_Sql Loader_Ctl - Fatal编程技术网

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

Sql 在oracle中插入和更新文件中的行,sql,oracle,bash,sql-loader,ctl,Sql,Oracle,Bash,Sql Loader,Ctl,我在linux中有一个文件,该文件类似于: 我有数百万行 date number name id state 20131110 1089 name1 123 start 20131110 1080 name2 122 start 20131110 1082

我在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,该用户的结束日期为:20131114,然后我需要先在我的表中插入开始日期,然后当我找到结束日期时,更新我正在插入的数字的表,在我的示例中是1089,结束日期是:20131114

如何使用ctl或其他东西来实现


谁能帮我。谢谢

什么版本的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实际上不能像编写的那样工作。您必须更改这些列名


希望这对…有帮助。

什么版本的Oracle

$ 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 我会用外置的桌子。定义与平面文件完全匹配的外部表。然后,您应该能够通过两次传递、一次插入和一次更新来解决这个问题

像这样的东西应该可以做到:

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实际上不能像编写的那样工作。您必须更改这些列名

希望这有助于

$ 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 我认为这应该行得通


我认为这应该行得通。

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

所以有点像

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'

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

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

所以有点像

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'

这假设每个开始日期都有一个结束日期,并且该数字在表中不存在-如果其中任何一个条件不成立,则在前一种情况下需要外部联接,在后一种情况下需要合并。

版本为Oracle Database 10g Enterprise Edition 10.2.0.4.0 64bi。但是我不明白如何插入bash文件?版本是Oracle Database 10g Enterprise Edition 10.2.0.4.0 64bi。但我不明白你是如何插入bash文件的?情况是,这个文件没有必要有结束日期,而开始日期,你今天有这个文件,但是在1个月或2个月后,我可以将文件的结束日期设置为2个月前的开始日期。在这种情况下,您可以将开始记录和结束记录完全连接起来,并对目标表执行合并。这种情况下,文件不必具有结束日期,如果具有开始日期,您今天就拥有此文件,但是在1或2个月内,我可以拥有一个结束日期为2个月前的开始日期的文件。在这种情况下,您可以将开始和结束记录完全连接起来,并对目标表执行合并。