RODBC - 值不适合数字

Posted

技术标签:

【中文标题】RODBC - 值不适合数字【英文标题】:RODBC - Value does not fit into a numeric 【发布时间】:2015-01-26 23:20:20 【问题描述】:

您好,提前感谢您。我使用RODBC 与 Netezza 数据库建立了 ODBC 连接,并且我正在尝试将数据框写入数据库表。我不断收到以下错误:

HY000 46 ERROR:  Numeric overflow.  Value does not fit in a numeric(10,10)

我不明白我是如何得到它的,因为我所有的数值都四舍五入到最接近的数字!我有我的 SQL 查询,我在下面创建了表和我的 R 代码,其中包含我试图写入数据库的示例:

SQL 代码

                CREATE TABLE R_FORECAST
                (
                          ID INTEGER NOT NULL,
                          NUMBER CHARACTER(7) NOT NULL,
                          ITEM_NO INTEGER NOT NULL,
                          ITEM_DESC VARCHAR(50),
                          FORECASTDATE DATE NOT NULL,
                          MEANFORECAST NUMERIC(10,10),
                          UPPER50 NUMERIC(10,10),
                          UPPER75 NUMERIC(10,10),
                          UPPER90 NUMERIC(10,10),
                          LOWER50 NUMERIC(10,10),
                          LOWER75 NUMERIC(10,10),
                          LOWER90 NUMERIC(10,10),
                          CREATED_DT TIMESTAMP DEFAULT "TIMESTAMP"(now(0)::"VARCHAR"),
                          TRANSACTION_DT DATE NOT NULL
                )
                DISTRIBUTE ON (ID);

R 代码

    loadprod <- odbcConnect(dsn="dsn", uid = "uid", pwd = "pwd",case="nochange", colQuote=c() )
    
    head(FORECAST)
    
        TRANSACTION_DT  ID  NUMBER  ITEM_NO ITEM_DESC   FORECASTDATE    MEANFORECAST    UPPER50 UPPER75 UPPER90 LOWER50 LOWER75 LOWER90 CREATED_DT
        1/26/2015   4192    2239    9664    DESC    2/16/2015   11  13  17  22  9   7   2   1/26/2015 16:38
        1/26/2015   4192    2239    9664    DESC    2/17/2015   14  16  19  24  11  10  7   1/26/2015 16:38
        1/26/2015   4192    2239    9664    DESC    2/18/2015   13  15  18  21  10  9   6   1/26/2015 16:38
        1/26/2015   4192    2239    9664    DESC    2/19/2015   13  15  18  24  10  8   6   1/26/2015 16:38
        1/26/2015   4192    2239    9664    DESC    2/20/2015   15  18  21  26  13  11  9   1/26/2015 16:38
        1/26/2015   4192    2239    9664    DESC    2/21/2015   13  16  19  24  11  9   7   1/26/2015 16:38

sqlSave(loadprod, FORECAST, tablename = "R_FORECAST", append = T,
            rownames = F, colnames = FALSE, verbose = T,
            safer = TRUE, addPK = FALSE, 
            varTypes <- tmp$TYPE_NAME,
            fast = TRUE, test = FALSE, nastring = NULL)

【问题讨论】:

【参考方案1】:

NUMERIC(10,10) 只会保存小于 1 的值。NUMERIC 的类型定义中的第一个值是精度,即存储的总位数,第二个值是小数位数,这是如何其中许多数字都在小数点之后。

TESTDB.ADMIN(ADMIN)=> create table numeric_test (col1 numeric(10,10), col2 numeric(10,0));
CREATE TABLE
TESTDB.ADMIN(ADMIN)=> insert into numeric_test values (0.1234567890, 1234567890);
INSERT 0 1
TESTDB.ADMIN(ADMIN)=> select * from numeric_test;
     COL1     |    COL2
--------------+------------
 0.1234567890 | 1234567890
(1 row)

如果您尝试在 COL1 中插入任何需要小数点左侧数字的内容,您将收到您遇到的错误。

TESTDB.ADMIN(ADMIN)=> insert into numeric_test values (10, 11);
ERROR:  Numeric overflow.  Value does not fit in a numeric(10,10)

如果您要存储整数值,通常应该使用 INTEGER 而不是 NUMERIC。这提供了许多好处,包括通常更好的存储效率和对区域地图的支持。

【讨论】:

现在看起来很简单!一旦我将值更改为 (10,0) 它就起作用了!非常感谢!

以上是关于RODBC - 值不适合数字的主要内容,如果未能解决你的问题,请参考以下文章

获取一个从0到n的数字列表,其中没有相邻的连续数字并且数字的值不等于它的索引

以数字作为字段名称中的第一个字符进行查询

使用 json_encode,有没有办法强制某些值不转换为数字?

强制 mySQL 查询为 R 中的非数字字符

Seaborn 热图相关性不适合注释数字

数字签名与数字证书