【问题标题】:Insert and update rows from a file in oracle在 oracle 中插入和更新文件中的行
【发布时间】:2013-11-15 14:41:05
【问题描述】:

我在 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 或其他东西来做到这一点。

谁能帮帮我。谢谢

【问题讨论】:

    标签: sql oracle bash sql-loader ctl


    【解决方案1】:

    什么版本的 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);
    

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

    希望对您有所帮助...

    【讨论】:

    • 版本为Oracle数据库10g企业版10.2.0.4.0 64bi。但我不明白你是如何插入 bash 文件的?
    【解决方案2】:

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

    类似...

    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'
    

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

    【讨论】:

    • 情况是文件没有必要有 end_date,有 start_date,你今天有这个文件,但是在 1 或 2 个月内我可以有 start_date 的 end_date 为 2 个月的文件以前
    • 在这种情况下,您将完全外连接开始和结束记录并针对目标表执行合并。
    【解决方案3】:
    $ 猫 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

    我认为这应该可行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-12
      • 2021-11-25
      • 2021-10-19
      • 2015-09-06
      • 1970-01-01
      • 1970-01-01
      • 2021-05-07
      相关资源
      最近更新 更多