|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Membre actif
![]() Inscription : mai 2004 Messages : 725 ![]() |
Bonjour,
J'ai réalisé un code en PL SQL pour faire des updates sur des tables. Malheureusement lorsque j'execute mes commandes PL SQL il n'y a ni update ni erreur. Pourtant il devrait y avoir une update en cas de succes. Voici mes commandes PL SQL : Y a t il des erreurs notables dans ces commandes ? Je le lance depuis mon script sh : Code :
|
||
|
|
00
|
|
|
#2 | ||||||
|
Membre expérimenté
![]() François Inscription : février 2010 Messages : 305 ![]() |
Code :
Je ne pense pas. ![]() Un indice, l'un des deux scripts genere une erreur: Code :
Code :
Enlevez donc le mode silence et la redirection de sortie. Je connais pas beaucoup de gens qui preferent faire du bricolage dans le noir, en regle generale on essaye de voir ce qu'on fait. Ca vous aidera probablement a voir le soucis, qui est effectivement une erreur notable quand on souhaite executer un block PL/SQL. Indice: Votre erreur est corrigee dans mes exemples. Va falloir apprendre a déboguer, c'est du temps de gagner pour toute la vie |
||||||
|
|
10
|
|
|
#3 | ||
![]() ![]() Alain Ingénieur d'études décisionnel Inscription : mai 2002 Messages : 4 445 ![]() |
Il est étonnant que tu n'aies pas d'erreur alors qu'il manque un FROM dans la sous-requête SELECT de la seconde requête UPDATE.
Par ailleurs, tes requêtes pourraient s'écrire plus simplement avec EXISTS. Par exemple pour la première : Code :
__________________
Modérateur Langage SQL N'oubliez pas le bouton et pensez aux balises [code]Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur ![]() |
||
|
|
11
|
|
|
#4 | ||
![]() ![]() Alain Ingénieur d'études décisionnel Inscription : mai 2002 Messages : 4 445 ![]() |
Après relecture, la seconde n'a pas besoin de SELECT ni de FROM.
Code :
Si tu as un index sur rad.ID_DEMANDE, rad.ID_EXAMEN, tu as plus intérêt à découper j.s_aphp_reference_acte_rados et faire une jointure sur rad.ID_DEMANDE = SUBSTR(j.s_aphp_reference_acte_rados, 1, ?) AND rad.ID_EXAMEN = SUBSTR(j.s_aphp_reference_acte_rados, ? + 1)
__________________
Modérateur Langage SQL N'oubliez pas le bouton et pensez aux balises [code]Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur ![]() |
||
|
|
10
|
|
|
#5 | ||
|
Membre actif
![]() Inscription : mai 2004 Messages : 725 ![]() |
Merci pour ces réponses rapides.
Rams7s : J'ai modifié mon script pour rajouter des logs comme dans ton exemple. Malgré tout il n'y a aucune différence car je n'observe rien dans les logs . Voici comment j'ai modifié le script : Code :
al1_24 : Je pense que je vais chercher à optimiser ces requetes comme tu las fait. Mais pour l'instant ma requete ne marche pas. Je vais trouver d'abord un moyen de faire marcher ces requetes; As tu remarquer des anomalies dans ces requetes ? Merci Merci |
||
|
|
00
|
|
|
#6 | ||||
|
Membre expérimenté
![]() François Inscription : février 2010 Messages : 305 ![]() |
Ben j'ai du comprendre de travers.
Ou alors, vous ne voulez pas lancer sqlplus "normalement"? Sans faire de redirection. Aussi loin que je sache, faire une redirection dans /dev/null ca revient a dire 'jette a la poubelle tout ce qui devrait apparaitre sur mon ecran' Code :
Code :
Note: La ligne, c'est la ligne du block PL/SQL, c'est a dire apres le begin, c'est pour ca que dans mon message de 14h37, ca va correspondre a la ligne 3. Maintenant, a mon humble avis, si vous lancez vous allez obtenir une ligne vide sans rien, toujours aps tres pratique. Enlevez l'option -s quand vous lancez SQL*Plus. De la, vous devriez avoir un petit numero qui s'incremente petit a petit. Avec eventuellement si vous trouvez le caractere magique et si je me base sur votre premier script un message d'erreur Code :
PLS-00103: Encoutered the symbol "COMMIT"
PS: Si il n'y a aucun rapport avec la redirection de sqlplus, je suis desole pour la perte de temps. |
||||
|
|
10
|
|
|
#7 | |||
|
Membre actif
![]() Inscription : mai 2004 Messages : 725 ![]() |
Merci Rams7s de ta réponse
J'ai modifié la commande sql plus pour obtenir des logs : Code :
Je ne comprend pas pourquoi il incremente 29 fois alors que dans ma table il y a 6 elements dans la table SAG_DATA_TEMP. Comment interpréter ce résultat ? Citation:
|
|||
|
|
00
|
|
|
#8 | ||
|
Membre actif
![]() Inscription : mai 2004 Messages : 725 ![]() |
J'ai simplifié ma commande sql mais le script ne semble jamais finir.
Pourtant SAG_DATA_TEMP ne contient que 6 elements. Pourquoi cette commande ne semble jamais finir ? Code :
|
||
|
|
00
|
|
|
#9 |
![]() ![]() Alain Ingénieur d'études décisionnel Inscription : mai 2002 Messages : 4 445 ![]() |
Qu'est-ce que SAG_DATA_TEMP ?
Une table ou une vue ? Si c'est une vue, sur quelles tables porte-t-elle ?
__________________
Modérateur Langage SQL N'oubliez pas le bouton et pensez aux balises [code]Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur ![]() |
|
|
10
|
|
|
#10 | ||
|
Membre Expert
![]() Pacman PacmanBusiness analyst Inscription : juin 2004 Messages : 1 417 ![]() |
Salut !
L'écriture d'Al1 n'est pas seulement une optimisation : elle produit un autre résultat ! En fait, quand tu fais : Code :
Du coup, tu mets toute ta table documents à jour, ce qui en fonction de sa taille peut être long, et encore plus s'il y a des locks qui trainent...
__________________
(c'est ma photo) Paku, Paku ! Pour les jeunes incultes : non, je ne suis pas un pokémon... Le pacblog : http://pacmann.over-blog.com/ |
||
|
10
|
|
|
#11 | ||
|
Membre actif
![]() Inscription : mai 2004 Messages : 725 ![]() |
Merci de vos réponses.
al1_24 : SAG_DATA_TEMP est une table. pacmann : J'ai pas l'impression que la table document a été changé même si c'est dur de vérifier tous les elements : il y en a 140 000 elements dans la table document !!! De plus la solution d'al1_24 avec le Exists est une solution que j'employais avant. Cette solution marche. C'est une requete tres longue a executer. Elle prend plusieurs jours sur des tables tres importantes(des tables de + de 100 000 elements). C'est pourquoi je cherche une solution alternative a la solution avec le EXISTS. Avant j'utilisais : Code :
Merci |
||
|
|
00
|
|
|
#12 |
|
Membre Expert
![]() Pacman PacmanBusiness analyst Inscription : juin 2004 Messages : 1 417 ![]() |
En fait, si ta requête ne se termine pas, tu ne peux pas vérifier (tant que tu ne commit pas, tu ne verras pas le résultat à partir d'une autre session !)
Question perfs, plusieurs jours pour l'update, ce n'est pas normal... Les questions qu'il faut se poser : => Combien d'éléments doivent être mis à jour dans la table document ? => Quel est le plan d'exécution ? En fonction de ces deux premiers points, tu pourras voir s'il faut peut être poser un index au bon endroit Et si tu es en 10g ou plus, tu peux utiliser MERGE (qui permet de faire le filtre et l'update en un coup)
__________________
(c'est ma photo) Paku, Paku ! Pour les jeunes incultes : non, je ne suis pas un pokémon... Le pacblog : http://pacmann.over-blog.com/ |
|
10
|
|
|
#13 |
|
Membre actif
![]() Inscription : mai 2004 Messages : 725 ![]() |
Merci de vos reponses.
Ma question original a été résolu car il n'y a plus d'erreurs . Les requetes sql s'executent correctement. par contre les requetes sql n'update pas correctement mais cela est un autre probleme. |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com