views:

951

answers:

1

I wish to create an external table in an Oracle database, retrieving its data from a flat file on the server. The format of this file is non-trivial. Each line in this file can be one of several different layouts, depending on the line's prefix (the prefix itself is always a fixed length). For example, a line beginning with 'TYPE1' would have a different layout than a line beginning with 'TYPE2'.

I have read that external tables can take advantage of all the constructs made available to SQL*Loader's control files. However, any documentation I have read only seams to deal with trivial flat-file layouts whereby all lines share a common layout. A SQL*Loader control file could easily handle this scenario using the WHEN clause:

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

How can I express such a layout using Oracle's external table definition syntax?

+1  A: 

This is from 9.2 docs but you need the LOAD WHEN clause.

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

David
Thanks for the link, it is very useful! :) However, according to that documentation, the LOAD WHEN clause is not used to choose between one of several field layouts:"The LOAD WHEN condition_spec clause is used to identify the records that should be passed to the database. The evaluation method varies:"Do you happen to have an example of this clause choosing between different field layouts rather than choosing which records will be exported?
Adam Paynter
You are going to end up with multiple external tables. One table for TYPE1 records and another for TYPE2 records. If you think about it a table can not have multiple layouts.
David
I was wondering if I would have to go that route. I understand that a table cannot have multiple layouts. However, in my case, all line types specify the same fields, just in different positions. Thanks for the tip! :) Would you like to edit your answer to include your latest comment?
Adam Paynter
actually you have me curious now I know more. Going to "play" with this a bit later.
David