Précédent   Forum des professionnels en informatique > Bases de données > Oracle > Outils > Sql*Plus
Sql*Plus Forum d'entraide sur Oracle Sql*Plus
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 23/05/2006, 17h52   #1
Membre régulier
 
Avatar de pmartin8
 
Inscription : novembre 2003
Messages : 306
Détails du profil
Informations forums :
Inscription : novembre 2003
Messages : 306
Points : 87
Points : 87
Par défaut [SQL +] Problem en PL-SQL

Bonjour

Voici mon code en pl-sql
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
--
-- Add record into TemplateTokenMapping
--
DECLARE 
  lTemplateNo NUMBER;
BEGIN
  -- OMC Request
  SELECT templateno INTO lTemplateNo 
                    FROM template 
                    WHERE requesttype='OMC';
--  INSERT INTO TEMPLATETOKENMAPPING (TOKENNO,TEMPLATENO) VALUES (8, lTemplateNo);
--  INSERT INTO TEMPLATETOKENMAPPING (TOKENNO,TEMPLATENO) VALUES (15, lTemplateNo);
END;
.
run;
Lorsque j'exécute mon code, le processus gèle. Il faut que je kill le processus ensuite...
J'ai essayer le meme code dans Toad et tout est OK

Quelqu'un voit le problème?

Merci
pmartin8 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2006, 17h55   #2
Rédacteur/Modérateur
 
Inscription : janvier 2005
Messages : 2 320
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 2 320
Points : 2 368
Points : 2 368
Il faut voir ce qu'il fait durant son blocage

Code :
1
2
3
 
SELECT event FROM v$session_wait 
WHERE sid = 'SID'
Jaouad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2006, 18h01   #3
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
faut voir les plans d'exécutions aussi
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2006, 18h37   #4
Membre régulier
 
Avatar de pmartin8
 
Inscription : novembre 2003
Messages : 306
Détails du profil
Informations forums :
Inscription : novembre 2003
Messages : 306
Points : 87
Points : 87
Voici en fichier joint le résultat du select * session_wait

Je ne vois pas ou est le probleme...
Vous pouvez maider?
Images attachées
Type de fichier : jpg bug.JPG (86,2 Ko, 12 affichages)
pmartin8 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2006, 18h41   #5
Membre régulier
 
Avatar de pmartin8
 
Inscription : novembre 2003
Messages : 306
Détails du profil
Informations forums :
Inscription : novembre 2003
Messages : 306
Points : 87
Points : 87
Lorsque que je tente de voir le plan dexécution j'obtient
Code :
1
2
3
SP2-0613: 

Unable to verify PLAN_TABLE format or existence
Donc je suis dans un cul-de-sac!



pmartin8 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2006, 19h53   #6
Membre régulier
 
Avatar de pmartin8
 
Inscription : novembre 2003
Messages : 306
Détails du profil
Informations forums :
Inscription : novembre 2003
Messages : 306
Points : 87
Points : 87
Dsl, j'ai fait une erreur dans mon premier message. J'ai mis en commenatire les 2 lignes qui me donne l'erreur. En fait, mon code fait geler mon SQL + lorsque les INSERT sont effectués.

Donc mon VRAI code est
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
--
-- Add record into TemplateTokenMapping
--
DECLARE 
  lTemplateNo NUMBER;
BEGIN
  -- OMC Request
  SELECT templateno INTO lTemplateNo 
                    FROM template 
                    WHERE requesttype='OMC';
  INSERT INTO TEMPLATETOKENMAPPING (TOKENNO,TEMPLATENO) VALUES (8, lTemplateNo);
  INSERT INTO TEMPLATETOKENMAPPING (TOKENNO,TEMPLATENO) VALUES (15, lTemplateNo);
END;
Je cherche toujours...
pmartin8 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2006, 20h31   #7
Expert Confirmé
 
Inscription : février 2006
Messages : 3 433
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 3 433
Points : 3 462
Points : 3 462
Peut-être un problème de verrouillage ? Vérifiez qu'il n'y a pas d'autre connexion qui exécute les mêmes opérations sur les mêmes données.

Un SELECT sans clause FOR UPDATE ne devrait pas être bloqué: c'est probablement un INSERT qui bloque dans le cas d'une attente sur un verrou: essayez d'exécuter vos 3 ordres les uns à la suite des autres en dehors de bloc PL/SQL. Quel est celui qui bloque ?
pifor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2006, 20h35   #8
Membre émérite
 
Avatar de Yorglaa
 
Inscription : janvier 2004
Messages : 845
Détails du profil
Informations personnelles :
Âge : 41
Localisation : Suisse

Informations forums :
Inscription : janvier 2004
Messages : 845
Points : 939
Points : 939
je vais peut-être dir une bêtise...
mais sous SQLPlus il faut un slash ( / ) après le End;

Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
DECLARE 
  lTemplateNo NUMBER;
BEGIN
  -- OMC Request
  SELECT templateno INTO lTemplateNo 
                    FROM template 
                    WHERE requesttype='OMC';
  INSERT INTO TEMPLATETOKENMAPPING (TOKENNO,TEMPLATENO) VALUES (8, lTemplateNo);
  INSERT INTO TEMPLATETOKENMAPPING (TOKENNO,TEMPLATENO) VALUES (15, lTemplateNo);
END; 
/
alors que sous TOAD il suffit de lancer le code avec F9 SANS le slash !
__________________
Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !

Yorglaa
Yorglaa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2006, 20h38   #9
Membre régulier
 
Avatar de pmartin8
 
Inscription : novembre 2003
Messages : 306
Détails du profil
Informations forums :
Inscription : novembre 2003
Messages : 306
Points : 87
Points : 87
Oui tu as raison.. mais j'ai bien mis mon / a la fin dans SQL +. Il doit y avoir quelque chose d'autres!
pmartin8 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2006, 20h42   #10
Membre émérite
 
Avatar de Yorglaa
 
Inscription : janvier 2004
Messages : 845
Détails du profil
Informations personnelles :
Âge : 41
Localisation : Suisse

Informations forums :
Inscription : janvier 2004
Messages : 845
Points : 939
Points : 939
si tu fais le même insert hors PL/SQL, ça marche ou pas ?

et le Select, hors PL, il ramène bien la valeur attendue ?
__________________
Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !

Yorglaa
Yorglaa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2006, 20h49   #11
Membre régulier
 
Avatar de pmartin8
 
Inscription : novembre 2003
Messages : 306
Détails du profil
Informations forums :
Inscription : novembre 2003
Messages : 306
Points : 87
Points : 87
oui ca marche...
Jai modifié mon code pour mettre mon Select a l'intérieur de mon Insert. C'est pas tres beau mais ca fonctionne.

Si jamais vous comprenez pourquoi SQL + refuse de faire fonctionner ma premiere version du code alors je serais tres intéressé a le savoir!

Merci
pmartin8 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2006, 20h54   #12
Rédacteur/Modérateur
 
Inscription : janvier 2005
Messages : 2 320
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 2 320
Points : 2 368
Points : 2 368
SI ta session est la 10 ne cherche pas plus tu as juste un probléme de lock

tu relance la requête sous TOAD et dans une autre fenêtre tu recherche qui bloque qui grâce à ke requête suivante :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
 
[LEFT]SELECT            bs.username "Blocking User", 
         bs.username "DB User", 
         ws.username "Waiting User", 
         bs.sid "SID", 
         ws.sid "WSID", 
         bs.sql_address "address", 
         bs.sql_hash_value "Sql hash", 
         bs.program "Blocking App", 
         ws.program "Waiting App", 
         bs.machine "Blocking Machine", 
         ws.machine "Waiting Machine", 
         bs.osuser "Blocking OS User", 
         ws.osuser "Waiting OS User", 
         bs.serial# "Serial#", 
         DECODE ( 
            wk.TYPE, 
            'MR', 'Media Recovery', 
            'RT', 'Redo Thread', 
            'UN', 'USER Name', 
            'TX', 'Transaction', 
            'TM', 'DML', 
            'UL', 'PL/SQL USER LOCK', 
            'DX', 'Distributed Xaction', 
            'CF', 'Control FILE', 
            'IS', 'Instance State', 
            'FS', 'FILE SET', 
            'IR', 'Instance Recovery', 
            'ST', 'Disk SPACE Transaction', 
            'TS', 'Temp Segment', 
            'IV', 'Library Cache Invalidation', 
            'LS', 'LOG START OR Switch', 
            'RW', 'ROW Wait', 
            'SQ', 'Sequence Number', 
            'TE', 'Extend TABLE', 
            'TT', 'Temp TABLE', 
            wk.TYPE 
         ) lock_type, 
         DECODE ( 
            hk.lmode, 
            0, 'None', 
            1, 'NULL', 
            2, 'ROW-S (SS)', 
            3, 'ROW-X (SX)', 
            4, 'SHARE', 
            5, 'S/ROW-X (SSX)', 
            6, 'EXCLUSIVE', 
            TO_CHAR (hk.lmode) 
         ) mode_held, 
         DECODE ( 
            wk.request, 
            0, 'None', 
            1, 'NULL', 
            2, 'ROW-S (SS)', 
            3, 'ROW-X (SX)', 
            4, 'SHARE', 
            5, 'S/ROW-X (SSX)', 
            6, 'EXCLUSIVE', 
            TO_CHAR (wk.request) 
         ) mode_requested, 
       object_name , 
         TO_CHAR (hk.id1) lock_id1, 
         TO_CHAR (hk.id2) lock_id2 
FROM     v$lock hk, v$session bs, v$lock wk, v$session ws ,  V$LOCKED_OBJECT a , 
dba_objects b 
WHERE    hk.BLOCK = 1 
AND      hk.lmode != 0 
AND      hk.lmode != 1 
AND      wk.request != 0 
AND      wk.TYPE(+) = hk.TYPE 
AND      wk.id1(+) = hk.id1 
AND      wk.id2(+) = hk.id2 
AND      hk.sid = bs.sid(+) 
AND      wk.sid = ws.sid(+) 
AND      a.object_id=b.object_id 
AND      hk.sid=a.session_id 
ORDER BY 1;[/LEFT]
Jaouad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2006, 21h01   #13
Expert Confirmé
 
Inscription : février 2006
Messages : 3 433
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 3 433
Points : 3 462
Points : 3 462
Citation:
Jai modifié mon code pour mettre mon Select a l'intérieur de mon Insert. C'est pas tres beau mais ca fonctionne.
On peut avoir le code ?

Vous avez combien de connections sqlplus ouvertes et combien de connections sont en train d'exécuter une version de votre code SQL ou PL/SQL ?

Pour être sûr de ne pas vous bloquer vous-même, vous pouvez:
- soit déconnecter chaque connection sqlplus après chaque exécution
- soit rajouter COMMIT dans votre code ou après l'exécution du bloc PL/SQL pour libérer les verrous.
pifor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2006, 13h42   #14
Membre régulier
 
Avatar de pmartin8
 
Inscription : novembre 2003
Messages : 306
Détails du profil
Informations forums :
Inscription : novembre 2003
Messages : 306
Points : 87
Points : 87
Dommage, je n'ai plus acces a la BD du client aujourdhui et jai livré le code fianl en mettant le Select dans mon Insert.

Par contre, j''aimerais bien savoir pourquoi mettre mon Select direct dans mon Insert regle le probleme. Qu'est-ce qu'on probleme de lock? Je me souviens que j'ai essayé de mettre un commit; dans le code et ca changeait rien...
pmartin8 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2006, 14h13   #15
Membre émérite
 
Avatar de Yorglaa
 
Inscription : janvier 2004
Messages : 845
Détails du profil
Informations personnelles :
Âge : 41
Localisation : Suisse

Informations forums :
Inscription : janvier 2004
Messages : 845
Points : 939
Points : 939
peut-être un soucis avec le paramètre ROW_LOCKING du fichier init...

source Metalink, note 30803.1
Citation:
ROW_LOCKING specifies whether row locks are acquired during UPDATE operations.

Values:
  • ALWAYS and DEFAULT
    Row locks are acquired. Table locks are not acquired.
  • INTENT
    In addition to row locks, restricted table-level locks are acquired during UPDATE operations.
The acquisition of table-level locks is a way to ensure data concurrency. However, Oracle Corporation recommends that you use the SQL statement LOCK TABLE for that purpose rather than changing the setting of this parameter from its default setting of ALWAYS.
__________________
Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !

Yorglaa
Yorglaa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2006, 14h20   #16
Membre régulier
 
Avatar de pmartin8
 
Inscription : novembre 2003
Messages : 306
Détails du profil
Informations forums :
Inscription : novembre 2003
Messages : 306
Points : 87
Points : 87
ok merci!

La prochaine fois je vais regarder de ce coté!
pmartin8 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 12h10.


 
 
 
 
Partenaires

Hébergement Web