1

我在SQL Server端执行存储过程。在此过程中的某些部分,远程Oracle程序使用取消Oracle过程从SQL Server过程取消时

execute (' 
begin 
    oraprocname(procparams); 
end;') 
at remotedb. 

今天叫,我需要停止执行这个程序,所以我使用了取消SQL Server端的查询。

问题是SQL Server无法停止该过程,直到远程过程停止(我需要从远程端杀死它)。

有没有办法以某种方式“通知”Oracle方,该过程需要从SQL Server端的存储过程中取消?

回答

0

您的问题是,一旦您向Oracle发送命令,它将不会返回,直到命令结束。

因此,除非execute() at remotedb具有将调用包装在可以被调用方阻止的子流程中的特定参数(不太可能,但为什么不?),您必须创建自己的Oracle函数,这会消除长时间运行会话。

所以我的解决方案是你创建另一个Oracle函数或过程来杀死你的长时间运行的会话,并从一个单独的进程调用它。

让您运行会话:

select 
    sid 
    , serial# 
from 
    v$session 
where 
     username='<your user>' 
    and status = 'ACTIVE' 

然后利用上述信息来杀死它,使用EXECUTE IMMEDIATE ALTER SYSTEM

begin 
    EXECUTE IMMEDIATE 'ALTER SYSTEM kill session ''<sid>,<serial#>'' '; 
end; 
/
+0

你好,谢谢你的答复。问题是我没有访问像v $ session这样的全局视图......我在Oracle站点上的用户只有几个过程的读权限和执行权限:/ – Damian

+0

然后,您可能需要创建一个这样的过程你在远程数据库上,并执行授予你的用户的权限。 –