我是一个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:外部组织表不支持操作。
我看不出有什么问题,我错过了什么?
答案 0 :(得分:1)
我认为最初的问题是monitoring
:有关于设置外部表统计信息的技巧,但我认为默认的监控行为不起作用。
“我不明白为什么”
监控是一个后台流程Oracle运行以跟踪表中的更改 - 插入,更新,删除 - 以便它可以评估收集的统计信息的过时性。当有足够的变化时,我们可以刷新统计数据。 Oracle无法对外部表进行跟踪,因为数据位于OS文件中。它可以告诉整个文件已经改变,但就是这样。
删除monitoring
子句后,您会发现我们无法在外部表上放置主键约束,因为主键需要not null
检查约束。显然,数据库无法强制执行此类检查约束,因为数据位于OS上的文件中,而不是实际数据库中。通过覆盖OS文件,可以随时替换外部数据。
由于完全相同的原因,无法在外部表上构建索引(这是添加主键失败的另一个原因)。