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

Oracle 外部表: 只有一条被拒绝的记录被加载到坏文件中

askTom 2018-07-05
255

问题描述

Oracle数据库12c企业版版本12.1.0.2.0-64位生产

我正在使用以下代码来创建外部表。

V_SQL := 'CREATE TABLE ' || L_EXT_TABLE || ' (' || L_CNAMES || ') 
    ORGANIZATION EXTERNAL (
      TYPE ORACLE_LOADER 
      DEFAULT DIRECTORY ' || P_DIR || ' 
      ACCESS PARAMETERS( 
       RECORDS DELIMITED BY NEWLINE CHARACTERSET WE8MSWIN1252
       BADFILE ''' || L_EXT_TABLE || '.bad''
       ' || CASE WHEN P_NOLOG THEN ' NOLOGFILE ' ELSE 'LOGFILE '''||L_EXT_TABLE||'.log''' END || '
       SKIP ' || P_IGNORE_HEADERLINES || ' FIELDS TERMINATED BY ''' || P_DELIMITER ||  ''' LDRTRIM
            MISSING FIELD VALUES ARE NULL
      )
      LOCATION( ''' || P_FILENAME || ''')
    )
    REJECT LIMIT UNLIMITED;
复制


文件包含13080记录。13070记录被加载到外部表中。
只有一条被拒绝的记录被加载到外部表的坏文件中。为什么?我在等10点。
数据看起来不错,并且与数据类型和长度匹配。如何识别确切原因?

我感谢所有专家的任何建议/帮助。

专家解答

我添加了一些缺失值,因此我们可以有一个 * 测试用例 * 并且无法重现您的发现,例如

SQL> host cat c:\temp\xxx.dat
1,2,3
1,2,3
1,2,3
1,2,3
z,z,z
w,s,s
q,q,q
s,s,s

SQL> set serverout on
SQL> declare
  2    l_ext_table varchar2(10) := 'mytab';
  3    L_CNAMES varchar2(100) := 'c1 number,c2 number,c3 number';
  4    P_DIR varchar2(10) := 'TEMP';
  5    P_NOLOG boolean := false;
  6    P_IGNORE_HEADERLINES varchar2(10) := '1';
  7    P_DELIMITER varchar2(10) := ',';
  8    P_FILENAME varchar2(10) := 'xxx.dat';
  9    v_sql varchar2(1000);
 10  begin
 11
 12  V_SQL := 'CREATE TABLE ' || L_EXT_TABLE || ' (' || L_CNAMES || ')
 13      ORGANIZATION EXTERNAL (
 14        TYPE ORACLE_LOADER
 15        DEFAULT DIRECTORY ' || P_DIR || '
 16        ACCESS PARAMETERS(
 17         RECORDS DELIMITED BY NEWLINE CHARACTERSET WE8MSWIN1252
 18         BADFILE ''' || L_EXT_TABLE || '.bad''
 19         ' || CASE WHEN P_NOLOG THEN ' NOLOGFILE ' ELSE 'LOGFILE '''||L_EXT_TABLE||'.log''' END || '
 20         SKIP ' || P_IGNORE_HEADERLINES || ' FIELDS TERMINATED BY ''' || P_DELIMITER ||  ''' LDRTRIM
 21              MISSING FIELD VALUES ARE NULL
 22        )
 23        LOCATION( ''' || P_FILENAME || ''')
 24      )
 25      REJECT LIMIT UNLIMITED';
 26
 27  dbms_output.put_line(v_sql);
 28  end;
 29  /
CREATE TABLE mytab (c1 number,c2 number,c3 number)
    ORGANIZATION EXTERNAL (
      TYPE ORACLE_LOADER
      DEFAULT DIRECTORY
TEMP
      ACCESS PARAMETERS(
       RECORDS DELIMITED BY NEWLINE CHARACTERSET WE8MSWIN1252
       BADFILE 'mytab.bad'

LOGFILE 'mytab.log'
       SKIP 1 FIELDS TERMINATED BY ',' LDRTRIM
            MISSING FIELD VALUES ARE NULL
      )

LOCATION( 'xxx.dat')
    )
    REJECT LIMIT UNLIMITED

PL/SQL procedure successfully completed.



SQL> CREATE TABLE mytab (c1 number,c2 number,c3 number)
  2      ORGANIZATION EXTERNAL (
  3        TYPE ORACLE_LOADER
  4        DEFAULT DIRECTORY TEMP
  5        ACCESS PARAMETERS(
  6         RECORDS DELIMITED BY NEWLINE CHARACTERSET WE8MSWIN1252
  7         BADFILE 'mytab.bad'
  8  LOGFILE 'mytab.log'
  9         SKIP 1 FIELDS TERMINATED BY ',' LDRTRIM
 10              MISSING FIELD VALUES ARE NULL
 11        )
 12  LOCATION( 'xxx.dat')
 13      )
 14      REJECT LIMIT UNLIMITED
 15  /

Table created.

SQL> select * from mytab;

        C1         C2         C3
---------- ---------- ----------
         1          2          3
         1          2          3
         1          2          3

3 rows selected.


SQL> select * from mytab;

        C1         C2         C3
---------- ---------- ----------
         1          2          3
         1          2          3
         1          2          3

3 rows selected.

SQL> host cat c:\temp\mytab.bad
z,z,z
w,s,s
q,q,q
s,s,s


复制


所以我们需要看到一个从上到下的测试用例。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论