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
相关产品推荐
相关产品推荐

