微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SAP HANA CX_AMDP_EXECUTION_FAILED 转储 SQL 代码 339 日期 SQL

如何解决SAP HANA CX_AMDP_EXECUTION_FAILED 转储 SQL 代码 339 日期 SQL

我在 AMDP 类中有一个 sqlscript。我得到了以下语句的转储:

sel1 = select mandt,equnr,ROW_NUMBER() OVER ( PARTITION BY equnr ORDER BY equnr,idate,itime,mdocm) as rnum,to_date(idate) as idate,cast(to_varchar(idate) || to_varchar(itime) as "$ABAP.type( TSTMP_BW_EXTRACT )" ) AS mytimestmp,LEAD(cast(to_varchar(idate) || to_varchar(itime) as "$ABAP.type( TSTMP_BW_EXTRACT )" )) OVER ( ORDER 
       BY equnr,MDOCM) timdelta,to_decimal('0.0',25,6) as mydiff,VLCOD,LEAD(vlcod,1) OVER ( ORDER BY equnr,MDOCM) as nxtVlcod,TO_DECIMAL('0.0',6) as T_PRESS_RUN,6) as T_PRESS_DWN,6) as T_UPRESS_DWN    
    from :sel_imrg    
     where equnr = :v_equnr    
       and idate between v_date_begin and v_date_end    
     order by mandt,MDOCM;

问题似乎在于将单独的 idate 和 time 字段转换为时间戳。我为时间戳值尝试了许多不同的数据类型,例如上面显示的 TIMESTAMP 和 ABAP 类型。我也试过 to_timestamp()、cast()、to_decimal() 等

奇怪的是,几乎完全相同的语句在 HANA sidecar 的 HANA Studio sql 控制台中工作得很好。

转储显示 CX_AMDP_EXECUTION_Failed sql 错误 339 “[339](范围 3)无效号码异常:无效号码:“TST”。“SAPTST”。“ZCL_TEST_CLASS=>EXECUTE#stb2#20210405110801”:| |我”

系统是 HANA 2.00.048.00.1591276203 上的 S/4 1809 SAP_ABA 75D SP5

感谢你们提供的任何帮助。

解决方法

SAP 支持帮助我解决了问题。

虽然 SAP 支持没有特别提及它,但似乎在 hana sql 脚本中存在一个错误(或未记录的功能,取决于你如何看待它)

如果您尝试从单独的日期和时间值形成时间戳值,则必须将日期和时间连接在一起,并在“YYYY-MM-DD HH24:MI:SS”之间留一个空格。 但是,您不能只使用 ' ' 作为空格。您必须使用 ascii 表示空间:char(32)。

正如我之前提到的。此代码的原始版本在 HANA 工作室的匿名块中运行良好。只有当它在 AMDP 中时才会转储。

此代码在没有转储的情况下在 AMDP 内成功执行:

sel1 = select mandt,EQUNR,ROW_NUMBER() OVER ( PARTITION BY equnr ORDER BY equnr,idate,itime,MDOCM) as rnum,to_date(idate) as idate,ifnull(to_timestamp( idate || char(32) || itime,'YYYY-MM-DD HH24:MI:SS'),'0001-01-01 00:00:00') AS mytimestmp,ifnull(LEAD(to_timestamp( idate || char(32) || itime,'YYYY-MM-DD HH24:MI:SS')) OVER ( ORDER BY equnr,MDOCM),'0001-01-01 00:00:00') timdelta,to_decimal('0.0',25,6) as mydiff,VLCOD,LEAD(vlcod,1) OVER ( ORDER BY equnr,MDOCM) as nxtVlcod,TO_DECIMAL('0.0',6) as T_PRESS_RUN,6) as T_PRESS_DWN,6) as T_UPRESS_DWN
    from :sel_imrg
     where equnr = :v_equnr
       and idate between v_date_begin and v_date_end
     order by mandt,equnr,MDOCM;
,

错误消息 "[339] (range 3) invalid number exception: invalid number 指的是字符串到数字数据类型的转换失败。

这意味着,这不是将数字或字符串转换为日期或时间戳数据类型。

隐式转换的一个潜在原因是 WHERE 子句的这一部分:

where equnr = :v_equnr  

如果:v_equnr是数值数据类型而列equnr是字符数据类型,则需要进行隐式类型转换,即字符串equnr被类型转换为数字数据类型。当 equnr 列完全包含字符时,这将产生 OP 遇到的错误。

所以,这不仅取决于语句和表结构,还取决于表中的实际数据,这可能是同一语句在另一个系统上工作的原因。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。