1

J'exécute une procédure stockée côté SQL Server. Dans une partie de cette procédure, une procédure Oracle à distance est appelée à l'aideAnnuler la procédure Oracle à partir de la procédure SQL Server lors de l'annulation

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

Aujourd'hui, je avais besoin d'arrêter l'exécution de cette procédure, donc je l'ai utilisé sur le côté requête annuler SQL Server.

Le problème est que SQL Server n'a pas pu arrêter la procédure tant que la procédure distante n'a pas été arrêtée (j'ai dû la supprimer du côté remotedb).

Est-il possible d'informer le côté Oracle que la procédure doit être annulée à partir d'une procédure stockée du côté de SQL Server?

Répondre

0

Votre problème est qu'une fois que vous avez envoyé une commande à Oracle, elle ne sera pas renvoyée avant la fin de la commande. Donc, sauf si execute() at remotedb a des paramètres spécifiques qui encapsuler l'appel dans un sous-processus qui peut être arrêté par l'appelant (improbable, mais pourquoi pas?), Vous devez créer votre propre fonction Oracle qui va tuer votre long terme session. Donc, ma solution est de créer une autre fonction ou procédure Oracle pour tuer votre session de longue durée, et l'appeler à partir d'un processus séparé.

Obtenez vos sessions en cours:

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

Utilisez ensuite au-dessus d'info pour le tuer, en utilisant EXECUTE IMMEDIATE ALTER SYSTEM:

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

Bonjour, Merci pour la réponse. Le problème est que je n'ai pas accès à des vues globales comme v $ session ... Mon utilisateur sur le site Oracle n'a que des droits de lecture et des exec pour plusieurs procédures:/ – Damian

+0

Ensuite, vous devrez peut-être créer une telle procédure pour vous sur la base de données distante, et exécuter l'autorisation accordée à votre utilisateur. –