我有几个输入文件正在Oracle中的外部表中读取。我想在所有文件的内容上运行一些查询,但是,在某些查询中,我想根据数据来自的输入文件筛选数据。有没有办法在select语句中访问外部表的源文件名,或者在外部表中创建一个包含位置源的列。
这里有一个例子:
CREATE TABLE MY_TABLE (
first_name CHAR(100 BYTES)
last_name CHAR(100 BYTES)
)
ORGANIZATION EXTERNAL
TYPE ORACLE_LOADER
DEFAULT DIRECTORY TMP
ACCESS PARAMETERS
(
RECORDS DELIMITED BY NEWLINE
SKIP 1
badfile 'my_table.bad'
discardfile 'my_table.dsc'
LOGFILE 'my_table.log'
FIELDS terminated BY 0x'09' optionally enclosed BY '"' LRTRIM missing field VALUES are NULL
(
first_name char(100),
last_name
)
)
LOCATION ( TMP:'file1.txt','file2.txt')
)
REJECT LIMIT 100;
select distinct last_name
from MY_TABLE
where location like 'file2.txt' -- This is the part I don't know how to code
有什么建议吗?
始终可以选择将文件名作为附加列添加到输入文件本身。理想情况下,我希望避免这种工作。
ALL_EXTERNAL_LOCATIONS数据字典视图包含有关外部表位置的信息。还有DBA_*和USER_*版本。
编辑:(如果我彻底阅读这个问题会有所帮助。)
您不仅想读取外部表的位置,还想知道哪一行来自哪个文件。基本上,你需要:
- 创建一个shell脚本,将文件位置添加到文件内容中,并将其发送到stdin
- 将PREPROCESSOR指令添加到外部表定义中以执行脚本
- 更改外部表定义以包含一列,以显示第一步中附加的文件名
下面是asktom的一篇文章,对其进行了详细的解释。