为什么SQL Loader /外部表不能使用空值

问题描述

下面的代码一直有效,但是由于我们已经从12c升级到19c,因此已停止。在other_name和birth_date部分中,这是错误的。其他名称在csv中主要为空白,因此应上传null。现在为空白时,会导致birth_date出错(获取 错误处理数据文件第2行中的BIRTH_DATE列 ORA-01858:在需要数字的地方找到了非数字字符)

如果我自己手动修改文件以将其他内容添加到other_name中,则它可以正常工作。

任何人以前都曾遇到过这样的问题,并且知道如何解决

    ALTER SESSION SET CURRENT_SCHEMA = dbo;

--
-- Product Category File 
--

DROP TABLE mis_product_category_ext;

CREATE TABLE mis_product_category_ext
                         (
                           PACKAGE_LABEL     varchar2(4),PACKAGE_DESCR     varchar2(64),PACKAGE_CAT       varchar2(10)
                        )
           ORGANIZATION EXTERNAL 
           ( 
             TYPE ORACLE_LOADER 
             DEFAULT DIRECTORY SEPA_FILES
             ACCESS ParaMETERS 
             ( 
               records delimited by newline 
               badfile SEPA_FILES:'mis_product_category_ext.bad'
               logfile SEPA_FILES:'mis_product_category_ext.log'
               skip 1
               fields terminated by ','
               missing field values are null 
               ( 
                package_label,package_descr,package_cat
               )
             ) 
             LOCATION ('product_category.csv') 
           ) 
           REJECT LIMIT UNLIMITED; 
           
declare
--
   v_insurer varchar2(10);
--
begin

--
-- Incoming data files from insurers
--

   for i in 1..3 loop
   --
      case i
         when 1 then v_insurer := 'aviva';
         when 2 then v_insurer := 'glohealth';
         when 3 then v_insurer := 'vhi';
      end case;
   --
      for i in (select table_name from all_tables where lower(table_name) = 'mis_mem_verify_ext_'||v_insurer||'') loop
         execute immediate 'DROP TABLE mis_mem_verify_ext_'||v_insurer||'';
      end loop;
   --
      execute immediate
      'CREATE TABLE mis_mem_verify_ext_'||v_insurer||'
                         (
                           REQ_INSURERS_PRIMARY_KEY         varchar2(100),UNIQUE_REFERENCE_ID_1            varchar2(100),NAME_OF_LAST_INSURER             varchar2(10),FirsTNAME                        varchar2(60),SURNAME                          varchar2(60),OTHER_NAME                       varchar2(60),BIRTH_DATE                       date,FirsT_LINE_OF_ADDRESS            varchar2(60),COUNTY                           varchar2(30),UNIQUE_REFERENCE_ID_2            varchar2(15),PRODUCT_TYPE                     varchar2(15),PLAN_NAME                        varchar2(100),START_DATE_OF_POLICY             date,END_DATE_OF_POLICY               date,MEM_MATCH                        varchar2(1),CREDITED_PERIOD                  number(4),UNEMPLOYMENT_PERIOD              number(4),LCR_LOADING                      number,LOADING_OVERRIDDEN               varchar2(1)
                        )
           ORGANIZATION EXTERNAL 
           ( 
             TYPE ORACLE_LOADER 
             DEFAULT DIRECTORY SEPA_FILES
             ACCESS ParaMETERS 
             ( 
               records delimited by newline 
               badfile SEPA_FILES:''mem_verify_'||v_insurer||'_incoming.bad''
               logfile SEPA_FILES:''mem_verify_'||v_insurer||'_incoming.log''
               skip 1
               fields terminated by 0X''09''
               LRTRIM
               missing field values are null 
               ( req_insurers_primary_key,unique_reference_id_1,name_of_last_insurer,firstname,surname,other_name,birth_date char date_format date mask "yyyy-mm-dd",first_line_of_address,county,unique_reference_id_2,product_type,plan_name,start_date_of_policy char date_format date mask "yyyy-mm-dd",end_date_of_policy char date_format date mask "yyyy-mm-dd",mem_match,credited_period,unemployment_period,lcr_loading,loading_overridden
               )
             ) 
             LOCATION (''lcr_mem_verification_'||v_insurer||'_incoming.csv'') 
           ) 
           ParaLLEL 
           REJECT LIMIT UNLIMITED'; 
   --
   end loop;
--
end;
/

spool off;

exit
 

解决方法

从控制文件中删除“由”分隔的行。

SQL * Loader将空格/制表符视为空白。一旦找到空白,当前字段便会终止。将跳过下一个非空白字符之前的所有空白,因此将跳过空列。

  1. 跳过连续定界符的原因是包含了机箱规格“ OPTIONALLY ENCLOSED BY'””

如果附件是可选的,则该字符不必与附件字符匹配,但如果必须,则该字符必须匹配,否则该行将被拒绝。

  1. 将字段指定为fields子句的一部分,并将未出现在columns子句中的字段指定为

  2. 您还可以尝试将定界符从逗号更改为其他内容。

,

我已经准备好了。

将LRTRIM更改为RTRIM,它似乎可以正常工作。不知道为什么,但是这样做