1

SQL Server側でストアドプロシージャを実行しています。この手順の一部では、リモートのOracleプロシージャは今日キャンセル時にSQLプロシージャからOracleプロシージャをキャンセルします。

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

を使用して呼び出され、私は、SQL Serverの側でクエリをキャンセル使用しているので、この手順の実行を停止する必要がありました。

問題は、リモートプロシージャが停止するまでSQL Serverがプロシージャを停止できなかったことです(リモート側からそれを強制終了する必要がありました)。

SQL Server側のストアドプロシージャからプロシージャをキャンセルする必要があるとOracle側から何らかの形で通知する方法はありますか?

答えて

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サイトの私のユーザーは、いくつかのプロシージャに対して読み取り権限とexec権限しか持っていません。/ – Damian

+0

次に、このようなプロシージャを作成する必要がありますあなたはリモートDB上にあり、あなたのユーザに与えられたアクセス権を実行します。 –

関連する問題