2015-03-25 59 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