You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SAP HANA存储过程同会话中断重跑报重复表名错误排查

问题现象

同会话中断正在运行的存储过程后再次执行,抛出错误码288,提示临时表#TMP_TGK_DB_TAGERT_SCEN表名重复,报错详情:

com.sap.db.jdbc.exceptions.JDBCDriverException: SAP DBTech JDBC: 
[288]: cannot use duplicate table name: "TGK_DATA_PD_001"."CPM_SP_E_CACL_ALL": 
line 64 col 2 (at pos 1649): "TGK_DATA_PD_001"."CPM_SP_UPD_MLADJ": line 58 col 2 (at pos 1323): 
#TMP_TGK_DB_TAGERT_SCEN: line 1 col 37 (at pos 36) - SQLState: HY000 - ErrorCode: 288
根因分析

代码中创建的#TMP_TGK_DB_TAGERT_SCEN是会话级本地临时表,生命周期绑定当前数据库会话,而非单次存储过程调用。
现有逻辑把删除临时表的DROP TABLE #TMP_TGK_DB_TAGERT_SCEN;写在存储过程最末尾,只有存储过程全程无中断、无异常执行到最后一步才会触发。一旦中途手动终止存储过程、或者执行过程中抛出其他错误,这条DROP语句不会执行,临时表会一直残留在当前会话内。下次同会话再调用存储过程,执行到CREATE临时表的语句时,就会检测到同名表已存在,抛出重名错误。

修复方案

找到存储过程BEGIN块内创建临时表的代码段,在CREATE语句前增加前置清理逻辑,确保创建新临时表前,会话内残留的同名表已经被清理。修改后的对应代码段如下:

BEGIN

    P_PROJ := :WFDIM_AZI;
    P_USER := :SESSION_USER;

    -- 新增:前置清理可能残留的同名临时表
    DROP TABLE IF EXISTS #TMP_TGK_DB_TAGERT_SCEN;

    CREATE LOCAL TEMPORARY COLUMN TABLE #TMP_TGK_DB_TAGERT_SCEN(
            SCENARIO varchar(64) NULL,
            SCENARIO_CY varchar(64) NULL,
            MONTH_NO numeric(4, 0) NULL
        );


    SELECT ATTRIBUTO1, ATTRIBUTO2, ATTRIBUTO4
      INTO P_Att1, P_Att2, P_Att4
      FROM AZIENDA
     WHERE COD_AZIENDA = :P_PROJ;

    -- 后续原有业务逻辑无需改动,保持原样即可

    -- ... 中间所有原有代码保留 ...

    COMMIT;


    DELETE FROM DATI_SALDI_LORDI
     WHERE COD_AZIENDA   = :P_PROJ
       AND COD_CATEGORIA = :P_Att4
       AND NOTE          = 'N';

    -- 存储过程末尾原有的DROP语句可以保留,不影响逻辑
    DROP TABLE #TMP_TGK_DB_TAGERT_SCEN;
END;
注意事项
  • DROP TABLE IF EXISTS在SAP HANA SPS09及以上版本均支持,执行时会自动判断表是否存在:存在则删除,不存在也不会抛出错误,完全适配当前场景。
  • 如果使用的是极早期不支持该语法的HANA版本,可以通过添加异常捕获块,忽略DROP表时抛出的"表不存在"错误,实现同样的清理效果,目前生产环境极少使用SPS09以下的老版本。
  • 临时表使用前先做存在性检查清理是存储过程开发的通用规范,可以完全覆盖会话中断、执行异常、回滚等场景下的临时表残留问题。

内容的提问来源于stack exchange,提问作者Vinoth Kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 16:54:36