尝试创建外部表时出错

时间:2017-06-26 17:12:36

标签: sql oracle external-tables

我是一个SQL初学者,我试图创建一个外部表。这是我拥有的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;

我想也许在顶部有一个CUST_FAV_NUMBER作为NUMBER有问题,但在Access Parameters中有char,但我发现的每个例子都以相同的方式设置。当我尝试运行它时,它说它在第3行失败并出现错误

  

ORA-30657:外部组织表不支持操作。

我看不出有什么问题,我错过了什么?

1 个答案:

答案 0 :(得分:1)

我认为最初的问题是monitoring:有关于设置外部表统计信息的技巧,但我认为默认的监控行为不起作用。

  

“我不明白为什么”

监控是一个后台流程Oracle运行以跟踪表中的更改 - 插入,更新,删除 - 以便它可以评估收集的统计信息的过时性。当有足够的变化时,我们可以刷新统计数据。 Oracle无法对外部表进行跟踪,因为数据位于OS文件中。它可以告诉整个文件已经改变,但就是这样。

删除monitoring子句后,您会发现我们无法在外部表上放置主键约束,因为主键需要not null检查约束。显然,数据库无法强制执行此类检查约束,因为数据位于OS上的文件中,而不是实际数据库中。通过覆盖OS文件,可以随时替换外部数据。

由于完全相同的原因,无法在外部表上构建索引(这是添加主键失败的另一个原因)。