【问题标题】:Error numeric overflow oracle when call execute immediate调用立即执行时错误数字溢出oracle
【发布时间】:2020-12-20 04:49:37
【问题描述】:

我定义了一个程序,将一个公式(类型值字符串)解析为一个数值: 公式中的某些 case 值可以执行或引发错误数字溢出。 代码:

DECLARE
    formula VARCHAR2(1000) := '1111111111 * 2';
    val NUMBER;
BEGIN
    EXECUTE IMMEDIATE 'BEGIN :res := '||formula||'; END;' USING OUT val;
    DBMS_OUTPUT.PUT_LINE ( 'formula = ' || formula );
    DBMS_OUTPUT.PUT_LINE ( 'val = ' || val );
END;

在这种情况下,然后引发错误数字溢出。当我增加值操作数多于/少于 10 个字符 1 时,它可以正常工作。

如果公式中的值包含数字 1,我会尝试检查一些值并查看大部分错误。 是这个原因吗?

谢谢大家!

【问题讨论】:

    标签: oracle numeric execute-immediate


    【解决方案1】:

    当你在 PL/SQL 中乘以整数时,它实际上是在使用 pls_integers。

    pls_integer 2,147,483,647 有一个上限,您的示例中使用的乘法 2,222,222,222 超过了上限,因此导致数字溢出。

    来自官方文档以及来自 Ask Tom 网站:

    具有溢出 PLS_INTEGER 范围的两个 PLS_INTEGER 值的计算会引发溢出异常,即使您将结果分配给 NUMBER 数据类型也是如此。

    为了摆脱这种情况,我们可以将表达式中的一个值设为数字。

    案例 1:CAST

    DECLARE
        formula VARCHAR2(1000) := 'cast(1111111111 as number) * 2';
        val NUMBER;
    BEGIN
        EXECUTE IMMEDIATE
        'BEGIN '||
        ' :res := '||formula||';'||
        'END;' USING OUT val;
        DBMS_OUTPUT.PUT_LINE ( 'formula = ' || formula );
        DBMS_OUTPUT.PUT_LINE ( 'val = ' || val );
    END;
    /
    

    案例 2:通过将表达式之一设为十进制,Oracle 将隐式将其转换为数字

    DECLARE
        formula VARCHAR2(1000) := '1111111111 * 2.0';
        val NUMBER;
    BEGIN
        EXECUTE IMMEDIATE
        'BEGIN '||
        ' :res := '||formula||';'||
        'END;' USING OUT val;
        DBMS_OUTPUT.PUT_LINE ( 'formula = ' || formula );
        DBMS_OUTPUT.PUT_LINE ( 'val = ' || val );
    END;
    /
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    • 2023-04-06
    相关资源
    最近更新 更多