Database Oracle外部表预处理器功能

Database Oracle外部表预处理器功能,database,oracle,Database,Oracle,我必须通过外部表读取一个文件,但该文件位于ACFS内的另一个目录中。 作为第一步,我必须移动文件 因此,我决定使用运行脚本的预处理器功能 这是我的表格(前提:所有权限设置正确等) 创建表EXT\u文件 (“REC”VARCHAR2(3字节), “VAL”VARCHAR2(4字节), ... ) 组织外部 (类型为ORACLE_加载器) 默认目录“ACFS\u EXECDIR” 访问参数 (以换行符分隔的记录) 预处理器ACFS_EXECDIR:'preprocess.sh' 字段LDRTRI

我必须通过外部表读取一个文件,但该文件位于ACFS内的另一个目录中。 作为第一步,我必须移动文件 因此,我决定使用运行脚本的预处理器功能

这是我的表格(前提:所有权限设置正确等)


创建表EXT\u文件
(“REC”VARCHAR2(3字节),
“VAL”VARCHAR2(4字节),
...
) 
组织外部
(类型为ORACLE_加载器)
默认目录“ACFS\u EXECDIR”
访问参数
(以换行符分隔的记录)
预处理器ACFS_EXECDIR:'preprocess.sh'
字段LDRTRIM
缺少的字段值为空
拒绝包含所有空字段的行
(
“REC”(1:3)字符(3),
“瓦尔”(4:7)查(4),
...
)
)
位置
('file.ftp'
)
)
拒绝限制无限;

此文件位于一个文件夹中,脚本(preprocess.sh)位于另一个文件夹中 所以我想这样做: *将文件移到ACFS_EXECDIR目录中

所以在执行

从EXT_文件中选择*

,则“预处理”功能将执行移动文件的脚本 进入默认目录(ACFS\u EXECDIR),然后读取它

但它不工作..因为它找不到文件

KUP-04040:ACFS\u EXECDIR中未找到file.ftp文件
2991300000-“执行%s调用时出错”
*原因:执行指定的调用导致错误。
*操作:检查错误消息并采取适当的操作。

所以我创建了一个空白文件只是为了传递异常,它成功了。 我以为该功能会先执行脚本,然后再阅读它 文件当然不在那里

我做的另一个测试是用脚本名替换文件名,以再次“绕过”异常。成功了

位置('preprocess.sh')

  • 文件是否必须在执行之前进入目录 预处理器的脚本?它是否检查文件是否存在
  • 我必须对文件进行cat操作才能在表中查看它吗?再说一次,我 我以为外部表会在之后自动“查看”文件 脚本的执行
  • 我找不到oracle此功能的文档 11g,你能提供一个链接吗
多谢各位

脚本:

    #!/bin/bash 
     #my dir
     DIR_FTP='...'
     DIR_ACFS='...' 
     /bin/mv $DIR_FTP/file.ftp $DIR_ACFS/file.ftp
     /bin/cat $DIR_ACFS/file.ftp # without cat cannot view the file
引自文章:

预处理器程序必须将输入数据直接流到外部表,而不是创建另一个输入文件

没有明确说明,但是是的,文件必须已经存在。其概念是预处理指定的文件,而不是在加载开始之前执行任意操作

传递给预处理器脚本的参数是文件的完整操作系统路径,因此Oracle正在根据目录对象的路径和位置文件名构建该路径,并可能在执行任何其他操作之前检查它是否存在

如您所见,您可以通过将位置指向一个虚拟文件来解决这个问题,并让预处理器脚本完成所有工作—它甚至不需要将文件复制到正确的目录中,只要它最终对其进行了分类。(这是否是一个好主意是另一回事;请确保您已注意此功能的安全警告)

但是,您必须对文件进行cat:

预处理器程序将数据转换为access驱动程序支持的记录格式,然后将转换后的记录数据写入标准输出(stdout),access驱动程序将其读取为输入


文档中的一个示例是使用
zcat
将文件解压缩为标准输出;如果它最终看到原始文件名(仍然是压缩文件),那就没有意义了。

感谢您的回复我一直在寻找oracle 11g的文档,不管怎样,现在我得到了11gR2的文档。虽然你似乎必须点击左边的“最新消息”才能看到;同样的文件也是。和。