3

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

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

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 的外部表定义语法来表达这样的布局?

4

2 回答 2

1

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

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

于 2009-05-22T17:22:49.430 回答
0

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

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;

然后您可以根据记录类型访问然后列声明游标 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;

希望这可以帮助

于 2015-08-01T09:07:35.377 回答