Sql db2临时表“with…as()”算术溢出

Sql db2临时表“with…as()”算术溢出,sql,math,db2,overflow,temporary,Sql,Math,Db2,Overflow,Temporary,我在用户定义的函数中使用以下临时表构造来计算斐波那契数。 不幸的是,临时表构造给了我一个高值的算术溢出错误,但我不知道如何更改临时表使用的数据类型 WITH FIB_SQL(I, RES_1, RES) AS ( SELECT 1, 0, 1 FROM SYSIBM.SYSDUMMY1 UNION ALL SELECT I+1, RES, RES+RES_1 FROM FIB_SQL WHERE I < 50 ) SELECT MAX(RES) FROM FIB_S

我在用户定义的函数中使用以下临时表构造来计算斐波那契数。 不幸的是,临时表构造给了我一个高值的算术溢出错误,但我不知道如何更改临时表使用的数据类型

WITH FIB_SQL(I, RES_1, RES) AS (
    SELECT 1, 0, 1 FROM SYSIBM.SYSDUMMY1
    UNION ALL
    SELECT I+1, RES, RES+RES_1 FROM FIB_SQL WHERE I < 50
)
SELECT MAX(RES) FROM FIB_SQL;
它适用于I<40的情况,但不适用于I<50的情况。RES和RES_1中的值足够大,因此当对这两个值求和时,它会产生一个大于数据类型将存储的值

假设数据类型当前为整数,可以按如下方式将数据类型强制转换为bigint:

WITH FIB_SQL(I, RES_1, RES) AS (
    SELECT 1, cast(0 as bigint), cast(1 as bigint) FROM SYSIBM.SYSDUMMY1
    UNION ALL
    SELECT I+1, RES, cast(RES as bigint) + cast(RES_1 as bigint) FROM FIB_SQL WHERE I < 50
)
SELECT MAX(RES) FROM FIB_SQL;

我刚刚修复了一个打字错误,我忘了将锚中的0也作为bigint进行转换。现在应该可以工作了。另外,这个解决方案将允许您上升到I<92,但是I<93仍然会给出算术溢出错误,b/c那么您超出了允许的BIGINT值的范围。
WITH FIB_SQL(I, RES_1, RES) AS (
    SELECT 1, CAST(0.0 AS decimal(31, 0)), CAST(1 AS decimal(31, 0))
    UNION ALL
    SELECT I+1, RES, CAST(RES +  RES_1 AS decimal(31, 0)) FROM FIB_SQL WHERE I < 150
)
SELECT MAX(RES) FROM FIB_SQL 
--OPTION (MAXRECURSION 150) --in SQL Server this is needed to increase the max recursion setting, not sure if this is needed in DB2 or not.
;