从SQL Server调用无参数Oracle函数PK_DM_API_EDIT_ENTITY.DONE后数据未更新求助
问题排查与解决
核心原因:独立会话丢了包上下文
Oracle的PL/SQL包变量是会话级的——你在SQL Server里分三次用EXECUTE ... AT [MSD]调用,每次都会新建一个Oracle会话。前两次CHANGE和SET_VALUE设置的包状态,到第三次调用DONE的会话里就没了,自然不会执行更新。
还有个拼写错误
第三次调用里的包名写成了PK_MDM_API_EDIT_ENTITY.done,但你Oracle里实际是PK_DM_API_EDIT_ENTITY.DONE,多了个字母M,这会直接导致调用失败(要是没报错,大概率是SQL Server没捕获到Oracle的错误)。
正确调用方式
把三个操作塞进同一个PL/SQL块,一次发送给Oracle,保证在同一个会话里执行:
EXECUTE ( 'begin PK_DM_API_EDIT_ENTITY.CHANGE ( ?,? ); PK_DM_API_EDIT_ENTITY.SET_VALUE ( ?,? ); PK_DM_API_EDIT_ENTITY.DONE; end; ', 'dep', '322', 'id_sub', '102') AT [MSD]
额外提醒
- 确认SQL Server的链接服务器
[MSD]事务配置正确,要是需要事务支持,得开启分布式事务。 - 检查SQL Server有没有捕获到Oracle的错误,加个错误处理或者看链接服务器日志能帮你更快排查问题。
内容的提问来源于stack exchange,提问作者Kirik
相关产品推荐
相关产品推荐

