2015-03-25 84 views
0

每当我将预处理器子句添加到外部表语句中时,我似乎遇到了问题。如果没有预处理器行,它一切正常,但只要我添加它,我得到什么样的错误取决于我把它放在访问参数块中,它们是否必须按特定顺序?我在网上找不到任何类似的问题。Oracle外部表中的预处理器

编辑:另外作为一个附注,我知道你可以使用预处理器将压缩文件送入外部表。如果我想读取一个压缩文件并追加文件名,就像把它全部放在一个shell文件中一样简单?

CREATE TABLE (
    column1 VARCHAR2(40), 
    column2 VARCHAR2(40) 
) 
ORGANIZATION EXTERNAL 
(
    TYPE ORACLE_LOADER 
    DEFAULT DIRECTORY DMPDIR 
    ACCESS PARAMETERS(
     RECORDS DELIMITED BY NEWLINE 
     LOGFILE DMPDIR:'test.log' 
     BADFILE DMPDIR:'test.bad' 
     fields terminated by '^' 
     MISSING FIELD VALUES ARE NULL 
     REJECT ROWS WITH ALL NULL FIELDS 
     preprocessor DMPDIR: 'append_filename.sh' 
    ) 
LOCATION (DMPDIR: 'testfile.dat') 
); 

append_filename.sh

#!/bin/bash 
sed -e 's!$!,'"${1##*/}"'!' $1 
+0

是我们应该去猜测错误?我们应该猜测你的Oracle版本吗? – 2015-03-25 11:13:08

+0

Oracle 11.2.0.3.0所以支持预处理器我相信。我可以给你这些错误,但这是一个不同的错误,这取决于我将预处理器语句移动到access_parameters块内的哪一行......所以我想知道是否需要某个顺序或者我做了一些明显错误的事情。 – 2015-03-25 11:16:21

+0

我在回答中发布了一个示例。 – 2015-03-25 11:20:12

回答

2

这里是一个小例子来创建使用PREPROCESSOR一个external table。我这样做对12C:

SQL> select banner from v$version where rownum = 1; 

BANNER 
---------------------------------------------------------------------------- 
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production 

SQL> DROP TABLE validation_header; 

Table dropped. 

SQL> 
SQL> CREATE TABLE validation_header (
    2 header1 VARCHAR2(5), 
    3 header2 number, 
    4 header3 VARCHAR2(8), 
    5 header4 number 
    6 ) 
    7 ORGANIZATION EXTERNAL (
    8 TYPE oracle_loader 
    9 DEFAULT DIRECTORY data_pump_dir 
10 ACCESS PARAMETERS (
11 RECORDS DELIMITED BY NEWLINE 
12 PREPROCESSOR import_ppm:'script.ksh' 
13 LOGFILE import_ppm:'script.log' 
14 FIELDS TERMINATED BY ',' 
15 (header1,header2,header3, header4 
16 )) 
17 LOCATION ('script_file.txt') 
18 ); 

Table created. 

SQL> 

从文档,

KUP-04094: preprocessing cannot be performed if Database Vault is installed

  • Cause: The Database Vault option did not permit the execution a program from an Oracle directory object.

  • Action: If preprocessing must be performed, then the Database Vault option must not be installed.

+0

我想这是我们的数据库的问题,然后因为我的例子得到同样的问题。 SQL开发人员在预处理器行开头显示红色语法错误行,并出现以下错误:KUP-04094:安装Database Vault时无法执行预处理 29913. 00000 - “执行%s标注时出错” – 2015-03-25 11:29:04

+0

请参阅我的更新在答案中。 – 2015-03-25 11:32:51

+0

那么不是好消息,我们经常使用数据保险库访问,所以没有机会去任何地方。我将不得不取消预处理器,并在Perl中进行一些预处理,或者在到达外部表之前进行一些预处理。 – 2015-03-25 11:42:17