"invalid number exception: invalid number: not a valid number string"调用存储过程时

"invalid number exception: invalid number: not a valid number string" when call a stored procedure

我有一个小的存储过程:

CREATE PROCEDURE "XYZ"."TEST" (
    IN KKK_ID NVARCHAR(12),
    IN START_DATE SECONDDATE, 
    IN END_DATE SECONDDATE,
    IN INTER INTEGER
)
    SELECT
        *,
        ROW_NUMBER() OVER(ORDER BY "DATES") AS "INDEXX"
    FROM "XYZ::DATA"
    WHERE
        "DATES" >= :START_DATE
        AND
        "DATES" <= :END_DATE
        AND
        "ID" = :KKK_ID
    ORDER BY "DATES";

当我尝试调用此过程时,收到此错误消息:

CALL "XYZ"."TEST"('DE666', '2014-01-01', '2015-12-31', 2234);

invalid number exception: invalid number: not a valid number string 'DE666'

但是 'D666' 看起来像一个字符串 - 至少对我来说是这样。这里有什么问题吗?

PS: id 不是保留字。

好的,错误消息并没有说“'DE666' 不是有效的字符串。”它说的是“'DE666' 不是有效的 数字 字符串”。这意味着对于 HANA,此字符串不是数字的有效字符串表示形式。 有效的表示是那些可以转换成数字的表示,例如'1'、'2.34'、'4,323,252.2354' 等。 字符串中的 'DE' 位对数据类型转换例程没有意义。

所以,这就是关于错误消息的内容。 您提出的第二点是 "ID" 的基列实际上是一个 NVARCHAR 列,所以不太清楚为什么首先要进行类型转换。根据我的经验,这种转换是由于隐式转换而发生的,而开发人员并未注意到。例如。 "XYZ::DATA" 的 return 类型定义(可以是视图或 table 函数)可能已声明为数字。这很容易被忽视,而且并不少见。

如果找不到这样的错误类型声明,则放置 post 所有 DDL 以重现问题。

我在 运行 长查询时遇到了类似的错误。

错误发生的地方是

where m.member = 'id'

所以我把它改成了

where m.member like 'id%'

瞧!有效!该错误不再出现。

我仍然不知道错误首先出现的背后原因或如何解决问题,但是嘿,只要解决方案有效。

只是发布这个以防其他像我这样的人将来遇到这个问题。