【问题标题】:Invalid number during insert query插入查询期间的数字无效
【发布时间】:2016-03-03 19:37:54
【问题描述】:

插入 SQL

INSERT INTO TB.SDL
  (
    SOL_ID,
    LOCKER_TYPE,
    LOCKER_NO,
    CUST_ID,
    STAFF_FLG,
    RENT_AMOUNT_CHARGED,
    PERCENT_RENT,
    START_DATE,
    LCHG_TIME,
    LCHG_USER_ID,
    RCRE_TIME,
    RCRE_USER_ID,
    DEL_FLG,
    BANK_ID
  )
  VALUES
  (
    '42' ,
    'KUK' ,
    'KU19' ,
    '00080' ,
    'N',
    '49.50' ,
    '33,33',
    sysdate,
    sysdate,
    'AAY' ,
    sysdate,
    'AAY' ,
    'N',
    '01'
  );

错误

-ORA-01722:无效号码

INSERT INTO TB.SDL
  (
    SOL_ID,
    LOCKER_TYPE,
    LOCKER_NO,
    CUST_ID,
    STAFF_FLG,
    RENT_AMOUNT_CHARGED,
    PERCENT_RENT,
    START_DATE,
    LCHG_TIME,
    LCHG_USER_ID,
    RCRE_TIME,
    RCRE_USER_ID,
    DEL_FLG,
    BANK_ID
  )
  VALUES
  (
    '42' ,
    'KUK' ,
    'KU19' ,
    '00080' ,
    'N',
    49.50 ,
    '33,33',
    sysdate,
    sysdate,
    'AAY' ,
    sysdate,
    'AAY' ,
    'N',
    '01'
  );

表格说明

-1 行插入

我想在 percent_rent 列中插入 33,33,但它不允许我这样做。 请问为什么case1失败了?我也插入了列描述图像。

【问题讨论】:

  • '33.33' 是一个字符串,而不是一个数字。
  • 您传递的是字符串而不是数字。另外,尝试使用点作为小数分隔符(而不是逗号):33.3
  • 在欧洲系统中,我们使用 33,33 作为分隔符,而不是 33.33,如果我输入 33,33 而没有引号,这将是一个问题,因为 sql 会认为它来分隔数字。
  • @Abid 您必须明确提及 NLS_NUMERIC_CHARACTERS 才能这样做。

标签: sql oracle oracle11g sql-insert number-formatting


【解决方案1】:

除了上述答案...您表示 RENT_AMOUNT_CHARGED 用句点表示小数点,而 PERCENT_RENT 使用 coimma。两者都在字符串中,但只有一个可以转换为数字,如您在错误中得到的输出所示。

为什么不尝试在 pct 中添加一个句点来尝试建议呢?只要您的两个字符串中有不同的制造商,设置 NLS_NUMERIC_CHARACTERS 将无济于事。您必须选择一种方式来指定小数点。

【讨论】:

  • 所有组合都可以在单独的 SQL 级别处理。
【解决方案2】:

您的表描述显示列PERCENT_RENTNUMBER(9,6) 数据类型。问题是您插入的值 '33,33'string 而不是 number

按原样插入数字,不需要单引号

例如,

SQL> CREATE TABLE t(A NUMBER(9,6));

Table created.

SQL> INSERT INTO t(A) VALUES(33.33);

1 row created.

SQL> COMMIT;

Commit complete.

我想在 percent_rent 列中插入 33,33,但它不允许我这样做

格式由NLS_NUMERIC_CHARACTERS参数控制。

您可以在会话级别单个 SQL 级别指定它。

如果您想以所需格式插入数字,则必须使用TO_NUMBER

例如,

SQL> INSERT INTO t (a)
  2    VALUES
  3    (
  4      TO_NUMBER('33,33','9G999D00', 'NLS_NUMERIC_CHARACTERS = '',.''')
  5    );

1 row created.

 SQL> COMMIT;

Commit complete.

SQL> SELECT * FROM t;

         A
----------
     33,33

现在,要以所需格式显示数字,请使用TO_CHAR

例如,

SQL> SELECT TO_CHAR(A,'9G999D00', 'NLS_NUMERIC_CHARACTERS = '',.''') my_number_format
  2  FROM t;

MY_NUMBER
---------
    33,33

【讨论】:

  • 在欧洲系统中,我们使用 33,33 作为小数分隔符,而不是 33.33,如果我输入 33,33 没有引号,这将是一个问题,因为 sql 会认为它来分隔数字。
  • @Abid 您必须明确提及 NLS_NUMERIC_CHARACTERS 才能这样做。加了几个例子,看答案。
  • 谢谢,但是我想问一下,当我以字符串格式将“33”插入到 TB.SDL(SOL_ID,LOCKER_TYPE,LOCKER_NO,CUST_ID,STAFF_FLG,RENT_AMOUNT_CHARGED, PERCENT_RENT,START_DATE,LCHG_TIME,LCHG_USER_ID,RCRE_TIME,RCRE_USER_ID,DEL_FLG,BANK_ID) 值('42','KUK','KU19','00080','N',49.50,'33',sysdate,sysdate,'AAY ' ,sysdate, 'AAY' ,'N', '01' );
  • @Abid 我不是一开始就解释了吗? '33,33' 是字符串而不是数字。单引号之间的任何内容都是字符串。因此,您需要按照我的说明使用 TO_NUMBER
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-14
  • 1970-01-01
相关资源
最近更新 更多