ORA-01438: 大于指定精度的值允许此列 - 我如何获得它所指的列?

Posted

技术标签:

【中文标题】ORA-01438: 大于指定精度的值允许此列 - 我如何获得它所指的列?【英文标题】:ORA-01438: value larger than specified precision allows for this column - How do i get which column it is referring to? 【发布时间】:2015-09-18 15:07:03 【问题描述】:

我们是否有任何标准的 oracle 错误表或任何东西来识别表中的哪一列我输入了一个大于指定精度的值。

ORA-01438: value larger than specified precision allows for this column - 我如何获得它所指的列?

【问题讨论】:

好问题,我能想到的最好的方法是进行选择并将每个字段转换为正确的类型作为目标表。 那么你要更新或插入多少列是十进制类型 完整的错误由几个部分组成:消息、上下文和附加信息。该列是附加信息的一部分,而不是消息本身的一部分。确保在运行 SQL 语句时使用能够提供完整错误信息的工具,而不仅仅是消息。 我必须纠正自己。列名不是错误的一部分。但是错误的行号和列号应该准确地指向查询中的有问题的表达式。 @mihai:我在插入语句中有大约 12 列十进制类型。 【参考方案1】:

我认为你必须编写一个程序并尝试一一更新列。

假设您有这样的更新:

UPDATE TABLE_1 a SET (COL_1, COL_2, COL_3) = 
   (SELECT COL_1, COL_2, COL_3 FROM TABLE_2 b WHERE a.COL_ID = b.COL_ID);

然后您可以通过以下方式遍历所有列:

DECLARE
    CURSOR TabColumns IS 
    SELECT column_id, column_name, data_precision, data_scale
    FROM USER_TAB_COLUMNS 
    WHERE table_name = 'TABLE_2'
       AND column_name <> 'COL_ID'
    ORDER BY 1;

BEGIN
    FOR aCol IN TabColumns LOOP
    BEGIN 
        sqlstr := 
            'UPDATE TABLE_1 a SET '||aCol.column_name ||' = '
                ||' (SELECT '||aCol.column_name ||
                ||' FROM TABLE_2 b '
                ||' WHERE  a.COL_ID = b.COL_ID)'

            EXECUTE IMMEDIATE sqlstr USING CalcDate, CalcDate;
    EXCEPTION
        WHEN OTHERS THEN
            DBMS_OUTPUT.PUT_LINE ( 'Error at column '|| aCol.column_id||CHR(9)|| aCol.column_name||CHR(9)||SQLERRM);
            DBMS_OUTPUT.PUT_LINE ( sqlstr );
    END;
    END LOOP;

END;    

效率不高,您应该会看到错误。

【讨论】:

【参考方案2】:

如果您正在执行 INSERT,请根据您正在插入的查询或值 (SELECT FROM DUAL) 创建一个视图。然后将视图与您要插入的表进行区分。您应该能够找到数据类型在大小/精度/比例上不匹配的位置。

【讨论】:

以上是关于ORA-01438: 大于指定精度的值允许此列 - 我如何获得它所指的列?的主要内容,如果未能解决你的问题,请参考以下文章

插入 3 时出现“ORA-01438: 值大于此列允许的指定精度”

插入 3 时出现“ORA-01438: 值大于此列允许的指定精度”

错误:“ORA-01438:值大于此列允许的指定精度”故障因素:“空”详细信息:org.kxml2.kdom.Node@99c0b9c

ORA-01438: 该列允许的值大于指定的精度

ORA-01438 错误

Python %f 怎么指定精度? 比我想指定到小数点后两位?