Une procédure PL/SQL continue a tourné malgré l'arret de SQL plus

Une procédure PL/SQL continue a tourné malgré l'arret de SQL plus - SQL/NoSQL - Programmation

Marsh Posté le 26-10-2005 à 14:30:34    

Bonjour
quelque chose me turlupine.  :jap:  
 
j'ai une procedure "test" comme suit:
PROCEDURE     TEST IS
BEGIN
    delete from SIB_LOG;
    commit;
    WRITELOG ('A');
    commit;
    dbms_lock.sleep(3);
    WRITELOG ('B');
    commit;
    dbms_lock.sleep(3);
    WRITELOG ('C');
    commit;
    dbms_lock.sleep(3);
    WRITELOG ('D');
    commit;
    dbms_lock.sleep(3);
    WRITELOG ('E');
    commit;
    dbms_lock.sleep(3);
    WRITELOG ('F');
    commit;
    dbms_lock.sleep(3);
    WRITELOG ('G');
    commit;
EXCEPTION WHEN OTHERS THEN RAISE;
END;
 
 
WRITELOG est un sous procedure qui ecrit dans une table de la base.
 
si j'excecute la procédure avec SQL+ de la maniere suivante:
BEGIN
  test;
EXCEPTION
WHEN OTHERS THEN
  dbms_output.put_line('Error '||TO_CHAR(SQLCODE)||': '||SQLERRM);
RAISE;
END;
 
si parallèlement, je fais des requetes select dans ma table WRITELOG, je voit bien que la procédure "test" est en train de travailler... Cela dit, si je quitte SQL+ (Ctr-Alt_Suppr par exemple), et bien ma procédure test continue malgré tout a etre excécute!!!!! (si je fais des select sur la table WRITELOG, je vois que de nouvelles lignes sont inserrée !!!!
 
comment cela est possible??? comme alors pouvons nous arreter l'excecution d'une procédure????
 
merci pour vos réponses   :bounce:  :bounce:

Reply

Marsh Posté le 26-10-2005 à 14:30:34   

Reply

Marsh Posté le 26-10-2005 à 14:57:39    

Tu ne quittes pas SQLPLUS, tu le killes ... l'exécution va se poursuivre quelque temps, jusqu'à un timeout Oracle, donc c'est logique de voir des INSERTs se faire encore ...
 
En fait, le processus SQLPLUS et le processus qui tourne sur la base sont 2 process distincts, tu ne tues que le processus SQLPLUS.

Reply

Marsh Posté le 26-10-2005 à 15:01:33    

merci beegee
 
ok. et ya til donc des commandes pour killer le processus? peut t-on regler le timeout oracle (par exemple le regler a 1seconde)?  
 
 

Reply

Marsh Posté le 26-10-2005 à 15:24:49    

Quelques infos ici :
 
http://home.planet.nl/~heuve345/databases/oraclea.html
 
Q: I’ve powered off my PC while a SQL statement was running. Although my PC is powered off, the table on which the SQL statement was running is still locked. What should I do?
 
A: To prevent this:
Some OS’s automatically detect when an client has died. In this case, you don’t have to do anything to automatically kill an Oracle process.
However, there are OS’s (like Windows NT) which don’t have this feature; in that case try the following.
 
   1. Open the file \ORANT\NETWORK\ADMIN\SQLNET.ORA on the server with a text editor (e.g. notepad).
   2. Change or add:
      sqlnet.expire_time = n
      in which n is a positive integer unequal to zero.
   3. Save the file and close the editor.
   4. Reboot the server.
 
Every n minutes, the server will send a small packet to the client,. If the server doesn’t get an answer, it assumes the client is dead, and it will ROLLBACK its transactions and then kill the session).
To kill a process:
 
   1. Make sure all the users are logged out.
   2. Start any SQL tool you like.
   3. Connect to the database as user sys or system.
   4. Execute the following query.
      SELECT * FROM v$session;
   5. Note down the SID and SERIAL# of the remaining sessions.
   6. For every session you want to kill, execute the following statement.
      ALTER SYSTEM KILL SESSION '<SID>,<SERIAL#>';
      Don’t forget the qoutes!
   7. Query v$session again. The sessions should either have been disappeared or have the STATUS 'KILLED'.


Message édité par Beegee le 26-10-2005 à 15:26:27
Reply

Marsh Posté le 26-10-2005 à 16:46:42    

merci  
 
j'ai utilisé la methode du alter system kill session. c'est excactement ce que je recherchais
 
merci beegee

Reply

Marsh Posté le 26-10-2005 à 17:29:13    

Attention cependant : d'après mon expérience, le process OS associé à la session Oracle n'est pas forcément tué immédiatement. "pmon" est chargé du nettoyage mais je n'en sais pas plus.
 
A l'aide de V$SESSION et de V$PROCESS (faire une jointure), tu peux retrouver le PID sur l'OS et faire un ps -p pour vérifier.
 
A expérimenter, à moins que beegee en sache un peu plus.
 
[:pingouino]


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed