2017-06-26 8 views
1

私は少し初心者ですが、外部テーブルを作成しようとしています。ここで私が持っているSQLがそれのためです:外部テーブルを作成しようとしたときにエラーが発生しました

CREATE TABLE BACKEND.EXT_DATA_LOAD 
(
    CUST_SESSIONID   VARCHAR2(255 BYTE), 
    CUST_SESSION_DATE   DATE, 
    CUST_ID     VARCHAR2(10 BYTE), 
    CUST_FAV_NUMBER   NUMBER 
) 
ORGANIZATION EXTERNAL 
    ( TYPE ORACLE_LOADER 
    DEFAULT DIRECTORY INCOMING_DIR 
    ACCESS PARAMETERS 
     (  RECORDS DELIMITED BY NEWLINE 
     BADFILE 'custData.bad' 
     NODISCARDFILE 
     LOGFILE 'custData.log' 
     FIELDS TERMINATED BY ',' 
     OPTIONALLY ENCLOSED BY '"' AND '"' 
     MISSING FIELD VALUES ARE NULL 
     REJECT ROWS WITH ALL NULL FIELDS 
     (
     CUST_SESSIONID    char, 
     CUST_SESSION_DATE   char date_format DATE MASK 'dd/mm/yyyy', 
     CUST_ID     char, 
     CUST_FAV_NUMBER   char 
     )) 
    LOCATION (INCOMING_DIR:'custData.csv') 
) 
REJECT LIMIT Unlimited 
NOPARALLEL 
MONITORING; 

ALTER TABLE BACKEND.EXT_DATA_LOAD 
ADD PRIMARY KEY 
    (CUST_SESSIONID) 
ENABLE VALIDATE; 

私は多分、頂部におけるNUMBERとしてCUST_FAV_NUMBERを有する問題が、アクセス・パラメータのcharがあったと思ったが、私が見つけたすべての例では、それを持っています同じように設定してください。これを実行しようとすると、エラー3行目で失敗します。

ORA-30657:操作は外部の編成表ではサポートされていません。

何が間違っているのか、私は何が欠けていますか?

答えて

1

最初の問題はmonitoringだと思います。外部テーブルの統計情報を設定するためのトリックがありますが、デフォルトの監視動作が機能しているとは思われません。挿入、更新、削除を - - それが集まった統計情報の古さを評価することができます

の監視は、Oracleがテーブルに変更を追跡するために実行するバックグラウンド・プロセスである「にもかかわらず、私は理由を理解していない」

。十分な変更があった場合、統計情報を更新することができます。データがOSファイル内にあるため、Oracleは外部表の追跡を実行できません。ファイル全体が変更されたことがわかりますが、それだけです。あなたは主キーがnot nullチェック制約を必要とするため、我々は、外部表に主キー制約を置くことができないことがわかりますmonitoring句を削除すると


。明らかに、データは実際のデータベースではなく、OS上のファイルにあるため、このようなチェック制約を実施することはできません。外部のデータは、OSファイルを上書きすることによっていつでも置き換えることができます。

まったく同じ理由から、外部テーブルにインデックスを作成することはできません(これがプライマリキーの追加が失敗するもう一つの理由です)。

+0

私はあなたが言っていることを見て、それは理にかなっていますが、私はちょうど作成部分(ALTER文を除く)を実行しようとすると、それはまだ実行されず、前と同じエラーが表示されます。別の問題があるはずです。 –

+0

'monitoring'句なしで試してください – APC

+0

それはそうしました。私はなぜか分からないのですか? –

関連する問題