【问题标题】:INVALID NUMBER ORA-01722 with correct Data无效的数字 ORA-01722 具有正确的数据
【发布时间】:2022-01-25 23:11:55
【问题描述】:

ERROR OF THE LOG AFTER EXECUTE SQLDR我正在尝试在字段中插入数值,但我一直收到相同的错误 INVALID NUMBER ORA-01722。我不知道错误在哪里,因为我正在为字段 IMP_NPVFRONT 插入声明为 NUMBER (18,6) 的十进制数,并且该值被强制转换为这个长度,但它不起作用。我正在使用此代码:

echo "OPTIONS (SKIP=1)" >> $TEPR_NFICHCONTROLCTL
echo "LOAD DATA" >> $TEPR_NFICHCONTROLCTL
echo "APPEND" >> $TEPR_NFICHCONTROLCTL
echo "INTO TABLE TERM.TTERMNZI" >> $TEPR_NFICHCONTROLCTL
echo "FIELDS TERMINATED BY ';' ">> $TEPR_NFICHCONTROLCTL
echo "OPTIONALLY ENCLOSED BY '\"' " >> $TEPR_NFICHCONTROLCTL
echo "TRAILING NULLCOLS" >> $TEPR_NFICHCONTROLCTL
echo "(" >> $TEPR_NFICHCONTROLCTL
echo " COD_CURRPL CHAR NULLIF COD_CURRPL=\"\"," >> $TEPR_NFICHCONTROLCTL
echo " COD_IDINST INTEGER EXTERNAL," >> $TEPR_NFICHCONTROLCTL
echo " COD_COUNTER CHAR NULLIF COD_COUNTER=\"\"," >> $TEPR_NFICHCONTROLCTL
echo " XTI_INTERNA CHAR NULLIF XTI_INTERNA=\"\"," >> $TEPR_NFICHCONTROLCTL
echo " COD_PRTFOLIO CHAR NULLIF COD_PRTFOLIO=\"\",">> $TEPR_NFICHCONTROLCTL
echo " COD_FAMILY CHAR NULLIF COD_FAMILY=\"\"," >> $TEPR_NFICHCONTROLCTL
echo " COD_GRUPO CHAR NULLIF COD_GRUPO=\"\"," >> $TEPR_NFICHCONTROLCTL
echo " COD_TIPOPER CHAR NULLIF COD_TIPOPER=\"\"," >> $TEPR_NFICHCONTROLCTL
echo " FEC_EXPIRY DATE \"DD/MM/RRRR\"," >> $TEPR_NFICHCONTROLCTL
echo " COD_STATUS CHAR NULLIF COD_STATUS=\"\"," >> $TEPR_NFICHCONTROLCTL
echo " FEC_INICIO   DATE \"DD/MM/RRRR\"," >> $TEPR_NFICHCONTROLCTL
echo " COD_INSTRMNT CHAR NULLIF COD_INSTRMNT=\"\"," >> $TEPR_NFICHCONTROLCTL
echo " COD_ENTITY CHAR NULLIF COD_ENTITY=\"\"," >> $TEPR_NFICHCONTROLCTL
echo " IMP_NONFMV CHAR \"to_number(:IMP_NONFMV, '999999999999999999D999999', 'NLS_NUMERIC_CHARACTERS = ''.,''')\"," >> $TEPR_NFICHCONTROLCTL
echo " IMP_CAMBIO CHAR \"to_number(:IMP_CAMBIO, '999999999999999999D999999', 'NLS_NUMERIC_CHARACTERS = ''.,''')\","  >> $TEPR_NFICHCONTROLCTL
echo " COD_APLICFO CHAR,"  >> $TEPR_NFICHCONTROLCTL
echo " IMP_NPVFRONT CHAR \"to_number(:IMP_NPVFRONT,'999999999999999999D999999', 'NLS_NUMERIC_CHARACTERS = ''.,''')\"," >> $TEPR_NFICHCONTROLCTL
echo " FEC_PROCESO \"to_date('$3', 'DD/MM/RRRR')\" ," >> $TEPR_NFICHCONTROLCTL
echo " COD_FICHERIN CONSTANT \"$4\" ," >> $TEPR_NFICHCONTROLCTL
echo " FEC_LOADER SYSDATE ," >> $TEPR_NFICHCONTROLCTL
echo " XTI_ESTADO CONSTANT 0 " >> $TEPR_NFICHCONTROLCTL
echo " )" >> $TEPR_NFICHCONTROLCTL

echo "$TEPR_HLOG Fichero de control $TEPR_NFICHCONTROLCTL generado correctamente"

echo "$TEPR_HLOG Fin Ejecucion de: $TEPR_NSCRIPT"

exit 0

上面生成了一个包含如下内容的控制文件:

OPTIONS (SKIP=1)
LOAD DATA
APPEND
INTO TABLE TERM.TTERMNZI
FIELDS TERMINATED BY ';' 
OPTIONALLY ENCLOSED BY '"' 
TRAILING NULLCOLS
(
 COD_CURRPL CHAR NULLIF COD_CURRPL="",
 COD_IDINST INTEGER EXTERNAL,
 COD_COUNTER CHAR NULLIF COD_COUNTER="",
 XTI_INTERNA CHAR NULLIF XTI_INTERNA="",
 COD_PRTFOLIO CHAR NULLIF COD_PRTFOLIO="",
 COD_FAMILY CHAR NULLIF COD_FAMILY="",
 COD_GRUPO CHAR NULLIF COD_GRUPO="",
 COD_TIPOPER CHAR NULLIF COD_TIPOPER="",
 FEC_EXPIRY DATE "DD/MM/RRRR",
 COD_STATUS CHAR NULLIF COD_STATUS="",
 FEC_INICIO   DATE "DD/MM/RRRR",
 COD_INSTRMNT CHAR NULLIF COD_INSTRMNT="",
 COD_ENTITY CHAR NULLIF COD_ENTITY="",
 IMP_NONFMV CHAR "to_number(:IMP_NONFMV, '999999999999999999D999999', 'NLS_NUMERIC_CHARACTERS = ''.,''')",
 IMP_CAMBIO CHAR "to_number(:IMP_CAMBIO, '999999999999999999D999999', 'NLS_NUMERIC_CHARACTERS = ''.,''')",
 COD_APLICFO CHAR,
 IMP_NPVFRONT CHAR "to_number(:IMP_NPVFRONT,'999999999999999999D999999', 'NLS_NUMERIC_CHARACTERS = ''.,''')",
 FEC_PROCESO "to_date('', 'DD/MM/RRRR')" ,
 COD_FICHERIN CONSTANT "" ,
 FEC_LOADER SYSDATE ,
 XTI_ESTADO CONSTANT 0 
 )

提前谢谢你,对不起我的英语:)

创建表:

CREATE TABLE TTERMNZI 
(
  COD_IDINST VARCHAR2(150 BYTE) NOT NULL 
, COD_FICHERIN VARCHAR2(20 BYTE) 
, FEC_PROCESO DATE 
, COD_OPERORI VARCHAR2(100 BYTE) 
, XTI_ESTADO NUMBER(1, 0) 
, COD_ESTADO NUMBER(4, 0) 
, COD_PRTFOLIO VARCHAR2(20 BYTE) 
, COD_DEALID VARCHAR2(20 BYTE) 
, COD_EVENT VARCHAR2(20 BYTE) 
, COD_CURRCON VARCHAR2(20 BYTE) 
, COD_COUNTER VARCHAR2(20 BYTE) 
, FEC_ALTA DATE 
, FEC_MATURITY DATE 
, FEC_FRONTVAL DATE 
, FEC_RKVAL DATE 
, IMP_NPVFRNEU NUMBER(18, 6) 
, IMP_NPVBO NUMBER(18, 6) 
, IMP_NPVBOEU NUMBER(18, 6) 
, COD_CURRPL VARCHAR2(4 BYTE) 
, IMP_MVPAGO NUMBER(18, 6) 
, IMP_MVRECIBO NUMBER(18, 6) 
, IMP_MVCONSA NUMBER(18, 6) 
, IMP_MVCONEU NUMBER(18, 6) 
, COD_FAMILY VARCHAR2(20 BYTE) 
, COD_GRUPO VARCHAR2(20 BYTE) 
, COD_STATUS VARCHAR2(8 BYTE) 
, COD_TIPOPER VARCHAR2(4 BYTE) 
, FEC_EXPIRY DATE 
, FEC_INICIO DATE 
, COD_INSTRMNT VARCHAR2(20 BYTE) 
, COD_ENTITY VARCHAR2(20 BYTE) 
, COD_APLICFO VARCHAR2(5 BYTE) NOT NULL 
, FEC_LOADER DATE 
, COD_USUARIO VARCHAR2(5 BYTE) 
, XTI_INTERNA VARCHAR2(1 BYTE) 
, IMP_NONFMV NUMBER(18, 6) 
, IMP_CAMBIO NUMBER(18, 6) 
, IMP_NPVFRONT NUMBER(18, 6) 
, CONSTRAINT CTERMNZI PRIMARY KEY 
  (
    COD_IDINST 
  , COD_APLICFO 
  )
  USING INDEX 
  (
      CREATE UNIQUE INDEX CTERMNZI ON TTERMNZI (COD_IDINST ASC, COD_APLICFO 
ASC) 
      LOGGING 
      TABLESPACE ETERM01 
      PCTFREE 10 
      INITRANS 2 
      STORAGE 
      ( 
        INITIAL 65536 
        NEXT 1048576 
        MINEXTENTS 1 
        MAXEXTENTS UNLIMITED 
        BUFFER_POOL DEFAULT 
      ) 
      NOPARALLEL 
  )
  ENABLE 
) 
LOGGING 
TABLESPACE ETERM01 
PCTFREE 10 
INITRANS 1 
STORAGE 
( 
  INITIAL 65536 
  NEXT 1048576 
  MINEXTENTS 1 
  MAXEXTENTS UNLIMITED 
  BUFFER_POOL DEFAULT 
) 
NOCOMPRESS 
NOPARALLEL;

数据文件:

EST;3773909;8EUK;N;RF_STARTY;IRD;BOND;S;18/10/2024;LIVE;25/09/2020;OCD 0 184534;0018234537;-2402029;1;0;MX;-2402029.000000
EST;8223589;A4805;N;SW_STARTY;IRD;IRS;B;22/12/2045;LIVE;29/09/2014;EUROPE;001345297;-217726.721335;1;0;MX;-217726.721335

【问题讨论】:

  • 提供一个产生错误的可运行测试用例。使用您执行的确切 sqlldr 命令以及要向其中导入数据的表的 CREATE TABLE 语句更新问题,以及在加载时导致错误的示例输入数据。这个测试用例应该是可运行的并产生你所询问的错误。
  • 它不会抛出任何新信息,只会添加图像中的信息
  • 你误会了。您(您的问题)需要提供一个可运行的测试用例,任何人都可以在没有进一步猜测的情况下执行它,而不仅仅是产生的错误。您在哪里发布了“TTERMNZI”表的CREATE TABLE 语句?您导入的确切数据文件在哪里(只需几行即可产生错误)?
  • 对不起,你是对的,我不太擅长 sql 语言,它对我来说是新的。我添加您要求的信息
  • 请从您的问题中删除除引起问题的 1 列之外的所有列,这将减少噪音并使您的问题清晰而集中。阅读MCVEHow to ask

标签: sql oracle


【解决方案1】:

问题似乎是 IMP_NPVFRONT 在两个示例记录中都有值“MX”,导致尝试对其应用 to_number 表达式时出错。

COD_CURRPL COD_IDINST COD_COUNTER XTI_INTERNA COD_PRTFOLIO COD_FAMILY COD_GRUPO COD_TIPOPER FEC_EXPIRY COD_STATUS FEC_INICIO COD_INSTRMNT COD_ENTITY IMP_NONFMV IMP_CAMBIO COD_APLICFO IMP_NPVFRONT FEC_PROCESO COD_FICHERIN FEC_LOADER XTI_ESTADO
EST 3773909 8EUK N RF_STARTY IRD BOND S 18/10/2024 LIVE 25/09/2020 OCD 0 184534 0018234537 -2402029 1 0 MX -2402029.000000
EST 8223589 A4805 N SW_STARTY IRD IRS B 22/12/2045 LIVE 29/09/2014 EUROPE 001345297 -217726.721335 1 0 MX -217726.721335

当我设置 IMP_NPVFRONT filler(所以它被跳过)时,文件加载。您将需要检查您的数据以及应该如何加载它。 (我还在测试文件中添加了一个标头,以匹配控制文件中的OPTIONS (SKIP=1)。)

其他要点:

  1. COD_CURRPL CHAR NULLIF COD_CURRPL="" 和所有其他字段如果没有值则设置为 null - 这似乎没有任何作用,因此我删除了“nullif”表达式。

  2. COD_IDINST INTEGER EXTERNAL - 此数据类型用于二进制数据,而不是表示数字的文本字符。老实说,我从来没有使用过它。根据日志文件,SQL*Loader是忽略的,反正列是字符串。

OPTIONS (SKIP=1)
LOAD DATA
APPEND
INTO TABLE TTERMNZI
FIELDS TERMINATED BY ';' 
OPTIONALLY ENCLOSED BY '"' 
TRAILING NULLCOLS
(
 COD_CURRPL CHAR,
 COD_IDINST CHAR,
 COD_COUNTER CHAR,
 XTI_INTERNA CHAR,
 COD_PRTFOLIO CHAR,
 COD_FAMILY CHAR,
 COD_GRUPO CHAR,
 COD_TIPOPER CHAR,
 FEC_EXPIRY DATE "DD/MM/RRRR",
 COD_STATUS CHAR,
 FEC_INICIO DATE "DD/MM/RRRR",
 COD_INSTRMNT CHAR,
 COD_ENTITY CHAR,
 IMP_NONFMV CHAR "to_number(:IMP_NONFMV, '999999999999999999D999999', 'NLS_NUMERIC_CHARACTERS = ''.,''')",
 IMP_CAMBIO CHAR "to_number(:IMP_CAMBIO, '999999999999999999D999999', 'NLS_NUMERIC_CHARACTERS = ''.,''')",
 COD_APLICFO CHAR,
 IMP_NPVFRONT filler, --CHAR "to_number(:IMP_NPVFRONT,'999999999999999999D999999', 'NLS_NUMERIC_CHARACTERS = ''.,''')",
 FEC_PROCESO "to_date('', 'DD/MM/RRRR')" ,
 COD_FICHERIN CONSTANT "" ,
 FEC_LOADER SYSDATE,
 XTI_ESTADO CONSTANT 0 
 )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-14
    • 1970-01-01
    • 2021-10-30
    • 2017-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-21
    相关资源
    最近更新 更多