Une procédure PL/SQL continue a tourné malgré l'arret de SQL plus - SQL/NoSQL - Programmation
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.
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)?
Marsh Posté le 26-10-2005 à 15:24:49
Quelques infos ici :
http://home.planet.nl/~heuve345/databases/oraclea.html
Q: Ive 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 OSs automatically detect when an client has died. In this case, you dont have to do anything to automatically kill an Oracle process.
However, there are OSs (like Windows NT) which dont 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 doesnt 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#>';
Dont forget the qoutes!
7. Query v$session again. The sessions should either have been disappeared or have the STATUS 'KILLED'.
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
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.
Marsh Posté le 26-10-2005 à 14:30:34
Bonjour
quelque chose me turlupine.
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