0

我在 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, idate, itime, MDOCM) timdelta,
    to_decimal('0.0',25,6) as mydiff,
    VLCOD,
    LEAD(vlcod, 1) OVER ( ORDER BY equnr,idate,itime,MDOCM) as nxtVlcod,    
    TO_DECIMAL('0.0',25,6) as T_PRESS_RUN,    
    TO_DECIMAL('0.0',25,6) as T_PRESS_DWN,    
    TO_DECIMAL('0.0',25,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, idate, itime, MDOCM;

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

奇怪的是,几乎完全相同的语句在 HANA 边车的 HANA Studio SQL 控制台中运行良好。

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

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

我很感激你们能提供的任何帮助。

4

2 回答 2

1

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, idate, itime, MDOCM), '0001-01-01 00:00:00') timdelta,
   to_decimal('0.0',25,6) as mydiff,
   VLCOD,
   LEAD(vlcod, 1) OVER ( ORDER BY equnr,idate,itime,MDOCM) as nxtVlcod,
   TO_DECIMAL('0.0',25,6) as T_PRESS_RUN,
   TO_DECIMAL('0.0',25,6) as T_PRESS_DWN,
   TO_DECIMAL('0.0',25,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, idate, itime, MDOCM;
于 2021-05-24T20:16:08.167 回答
0

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

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

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

where equnr = :v_equnr  

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

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

于 2021-04-14T21:30:59.833 回答