暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 外部表-跳过列

ASKTOM 2020-07-13
414

问题描述



我有一个使用外部表的问题。未填充字段时,将忽略该字段,并将该值保留在上一列中。我正在使用的SQL排序的一个示例是

CREATE TABLE "EXT_TABLE_TEST" 
   ("COLUMN1" VARCHAR2(100 BYTE), 
 "COLUMN2" VARCHAR2(100 BYTE), 
 "COLUMN3" VARCHAR2(100 BYTE), 
 "COLUMN4" VARCHAR2(100 BYTE)
   ) 
   ORGANIZATION EXTERNAL 
    ( TYPE ORACLE_LOADER
      DEFAULT DIRECTORY "DIR"
      ACCESS PARAMETERS
      ( records delimited  by newline
    BADFILE 'Test.bad'  
    LOGFILE 'Test.log'
    fields terminated by 0x'09'
    OPTIONALLY ENCLOSED BY '"'
    MISSING FIELD VALUES ARE NULL 
    )
      LOCATION
       ( "DIR":'Test.txt'
       )
    )
   REJECT LIMIT UNLIMITED;


例如,如果我有一个包含

a b c d
a   c d
a b   d


目前,数据在查询中显示为

a b c d 
a c d
a b d 


如您所见,第二行和第三行中的数据未在正确的列中显示数据。

如果我将源文件更改为逗号分隔,则似乎可以强制执行正确的列顺序,但tab delimited不会。

有任何想法是否可以解决此问题?

干杯伊恩



专家解答

问题来自此:

   OPTIONALLY ENCLOSED BY '"'


当您有此子句和字段没有附件 (双引号) 时,数据库会修剪任何前导空格。因此,当源具有两个相邻的选项卡时,第二个将成为下一个字段的 (忽略) 前导空格的一部分。

要克服此问题,请排除以下条款:

CREATE TABLE "EXT_TABLE_TEST"  (
 "COLUMN1" VARCHAR2(100 BYTE), 
 "COLUMN2" VARCHAR2(100 BYTE), 
 "COLUMN3" VARCHAR2(100 BYTE), 
 "COLUMN4" VARCHAR2(100 BYTE)
) ORGANIZATION EXTERNAL ( 
  TYPE ORACLE_LOADER
  DEFAULT DIRECTORY tmp
  ACCESS PARAMETERS
  ( records delimited  by newline
    BADFILE 'Test.bad'  
    LOGFILE 'Test.log'
    fields terminated by 0x'09'
    MISSING FIELD VALUES ARE NULL 
  )
  LOCATION
   ( tmp:'test.txt' )
)
REJECT LIMIT UNLIMITED;

declare
  f utl_file.file_type;
begin
  f := utl_file.fopen ('TMP', 'test.txt', 'w');
  utl_file.put_line(f, 'a' || chr ( 9 ) || 'b' || chr ( 9 ) || 'c' || chr ( 9 ) || 'd');
  utl_file.put_line(f, 'a' || chr ( 9 ) || chr ( 9 ) || 'c' || chr ( 9 ) || 'd');
  utl_file.put_line(f, 'a' || chr ( 9 ) || 'b' || chr ( 9 ) || chr ( 9 ) || 'd');
  utl_file.fclose(f);
end;
/

select *
from   EXT_TABLE_TEST;

COLUMN1    COLUMN2    COLUMN3    COLUMN4   
a          b          c          d          
a               c          d          
a          b               d 

文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论