【问题标题】:Oracle External Tables: Advanced Flat File LayoutOracle 外部表:高级平面文件布局
【发布时间】:2009-05-22 16:55:32
【问题描述】:

我希望在 Oracle 数据库中创建一个外部表,从服务器上的平面文件中检索其数据。这个文件的格式很重要。此文件中的每一行都可以是几种不同布局中的一种,具体取决于行的前缀(前缀本身始终是固定长度)。例如,以'TYPE1' 开头的行与以'TYPE2' 开头的行的布局不同。

我了解到外部表可以利用 SQLLoader 的控制文件提供的所有结构。但是,我读过的任何文档都只用于处理琐碎的平面文件布局,其中所有行共享一个共同的布局。 SQL加载器控制文件可以使用WHEN 子句轻松处理这种情况:

WHEN (1:5) = 'TYPE1'
(
    field1 POSITION(10:18),
    field2 POSITION(26:35)
)
WHEN (1:5) = 'TYPE2'
(
    field1 POSITION(23:27),
    field2 POSITION(15:19)
)

如何使用 Oracle 的外部表定义语法来表达这样的布局?

【问题讨论】:

    标签: oracle external sql-loader


    【解决方案1】:

    这是来自 9.2 文档,但您需要 LOAD WHEN 子句。

    http://download.oracle.com/docs/cd/B10500_01/server.920/a96652/ch12.htm

    【讨论】:

    • 感谢链接,非常有用! :) 但是,根据该文档,LOAD WHEN 子句不用于在几种字段布局之一之间进行选择:“LOAD WHEN condition_spec 子句用于标识应传递给数据库的记录。评估方法各不相同: " 您是否碰巧有此子句在不同字段布局之间进行选择而不是选择要导出哪些记录的示例?
    • 您最终会得到多个外部表。一个表用于 TYPE1 记录,另一个用于 TYPE2 记录。如果您考虑一下,一个表格不能有多个布局。
    • 我想知道我是否必须走那条路。我知道一张桌子不能有多个布局。但是,在我的例子中,所有线型都指定了相同的字段,只是在不同的位置。谢谢你的提示! :) 您想编辑您的答案以包含您的最新评论吗?
    • 其实你让我好奇,现在我知道的更多了。稍后再“玩”这个。
    【解决方案2】:

    如果你有固定记录试试这个

    create table EXT_TABLE
    (
      record_type        char(2),
      customer_id        char(10),
      customer_name      char(60),
      item_id            char(12)
      quantity           char(10)
    )
    organization external
    (
      type ORACLE_LOADER
      default directory DIR_FLUX_DEV
      access parameters
      (
        RECORDS DELIMITED BY NEWLINE
         BADFILE 'ext_table.bad'
         LOGFILE 'ext_table.log'
         SKIP 0
         FIELDS
        (
         TP_REC               position(1:2)   char(2),
         customer_id          position(3:10)  char(10),
         customer_name        position(13:60) char(60),
         item_id              position(3:12)  char(12),
         quantity             position(15:10) char(10)
        )
      )
      location (DIR_FLUX_DEV:'file.txt')
    )
    reject limit 0;
    

    然后您可以根据记录类型访问 then 列 宣布 光标 c1 是

    select e.* from ext_table;
    
    begin
      for r in c1 loop
        if r.tp_rec = '02' then
           dbms_output.put_line(r.tp_rec || ' ' || r.customer_id);
        elsif r.tp_rec = '03' then
           dbms_output.put_line(r.tp_rec || ' ' || r.item_id);
        end if;
      end loop;
    end;
    

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-21
      • 1970-01-01
      相关资源
      最近更新 更多