"无效的数字异常:无效的数字:不是有效的数字字符串"调用存储过程时

时间:2017-01-02 12:17:19

标签: sql hana

我有一个小的存储过程:

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);
  

无效号码例外:无效号码:不是有效号码字符串&#39; DE666&#39;

但是&#39; D666&#39;看起来像一根绳子 - 至少对我而言。这有什么不对吗?

PS:id不是保留字。

2 个答案:

答案 0 :(得分:1)

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

所以,这是关于错误信息。 你提到的第二点是“ID”的基本列实际上是一个NVARCHAR列,所以它不是很清楚,为什么首先会有类型转换。根据我的经验,这种转换是由于隐式转换而发生的,而这些转换并没有被开发人员所关注。例如。 “XYZ :: DATA”的返回类型定义(可以是视图或表函数)可能已被声明为数字。这很容易被忽视,并不罕见。

如果找不到这种错误的类型声明,请将所有DDL贴出来重现问题。

答案 1 :(得分:0)

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

发生错误的部分类似于

where m.member = 'id'

所以我把它改成了

where m.member like 'id%'

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

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

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