IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PL/SQL Oracle Discussion :

Ma commande PL/SQL ne donne ni erreurs ni update.


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Battosaiii
    Invité(e)
    Par défaut Ma commande PL/SQL ne donne ni erreurs ni update.
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    sqlplus -s /nolog >/dev/null <<-EOF
    connect $SCHEMA/$SCHEMAPW
     
    set trimspool on
    spool ./update_tables.log
     
    whenever sqlerror exit 1;
     
    DECLARE
     
    CURSOR c_SAG_DATA IS
    SELECT * FROM SAG_DATA_TEMP;
     
    BEGIN
     
    	FOR j IN c_SAG_DATA LOOP
     
    	update document doc SET (doc.nda,doc.noip) =(SELECT j.nda,j.nip_actif
    	from radiologie rad
    	where rad.id_document_lie = doc.id_document
    	and CONCAT(rad.ID_DEMANDE, rad.ID_EXAMEN) = j.s_aphp_reference_acte_rados);
     
    	update radiologie rad SET (rad.uh_demandeuse,rad.nip) = (SELECT j.code_uh_demande,j.nip_actif
    	WHERE CONCAT(rad.ID_DEMANDE, rad.ID_EXAMEN) = j.s_aphp_reference_acte_rados);
     
    	END LOOP;
    END;
    COMMIT;
     
     
    spool off
    exit
    EOF
     
    echo "FIN"

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2010
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 412
    Par défaut Tu ne me vois pas ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [xxx ~]$ sqlplus xxx/xxx -s @tmp2 >/dev/null
    [xxx ~]$ sqlplus xxx/xxx -s @tmp3 >/dev/null
    Vous pouvez me dire lequel de ces deux scripts a fonctionne?
    Je ne pense pas.

    Un indice, l'un des deux scripts genere une erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    whenever sqlerror exit 1;
    begin
    update existe_pas set n=2;
    end;
    /
    commit;
    Et l'autre est correct, avec un petit dbms_output pour le confirmer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    whenever sqlerror exit 1;
    set serveroutput on
    begin
    dbms_output.put_line('a');
    end;
    /
    commit;
     exit;


    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

  3. #3
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 136
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    UPDATE  document doc 
    SET     doc.nda     = j.nda
        ,   doc.noip    = j.nip_actif
    WHERE   EXISTS
            (   SELECT  1
                FROM    radiologie rad
                WHERE   CONCAT(rad.id_demande, rad.id_examen) = j.s_aphp_reference_acte_rados
                    AND rad.id_document_lie = doc.id_document
            );
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours 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
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 136
    Par défaut
    Après relecture, la seconde n'a pas besoin de SELECT ni de FROM.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    UPDATE  radiologie rad 
    SET     rad.uh_demandeuse   = j.code_uh_demande
        ,   rad.nip             = j.nip_actif
    WHERE   CONCAT(rad.ID_DEMANDE, rad.ID_EXAMEN) = j.s_aphp_reference_acte_rados;
    Par ailleurs, ton expression de jointure sur CONCAT(rad.ID_DEMANDE, rad.ID_EXAMEN) = j.s_aphp_reference_acte_rados risque de ne pas être très performante si tu as de nombreux enregistrements.
    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
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours 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
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  5. #5
    Battosaiii
    Invité(e)
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    sqlplus -s /nolog >/dev/null <<-EOF
    connect $SCHEMA/$SCHEMAPW
     
    set trimspool on
    spool ./update_tables.log
     
    whenever sqlerror exit 1;
    SET serveroutput ON
     
    DECLARE
     
    CURSOR c_SAG_DATA IS
    SELECT * FROM SAG_DATA_TEMP;
     
    BEGIN
    dbms_output.put_line('BEGIN UPDATE SAG');
     
        FOR j IN c_SAG_DATA LOOP
     
    ..... même code que précédemment ici
    J'ai rajouté SET serveroutput ON et aussi dbms_output.put_line('BEGIN UPDATE SAG');. Mais dans les logs je n'observe toujours rien. Quel erreur ai je pu commettre ?


    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

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2010
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 412
    Par défaut Yapakomprendre
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    [xxx ~]$ echo "toto" >/dev/null
    [xxx ~]$ echo "toto" >./tmp
    [xxx ~]$ cat /dev/null
    [xxx ~]$ cat ./tmp
    toto
    Je reprends mes exemples de ce matin, sans faire la redirection dans la grosse poubelle et on voit si on peut obtenir des informations, sur qui de mes scripts tmp2 et tmp3 fonctionne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    [xxx ~]$ sqlplus -s xxx/xxx @tmp2
    update existe_pas set n=2;
           *
    ERROR at line 2:
    ORA-06550: line 2, column 8:
    PL/SQL: ORA-00942: table or view does not exist
    ORA-06550: line 2, column 1:
    PL/SQL: SQL Statement ignored
     
     
    [xxx ~]$ sqlplus -s xxx/xxx @tmp3
    a
     
    PL/SQL procedure successfully completed.
     
     
    Commit complete.
     
    [xxx ~]$ echo "toto" >/dev/null
    Ah ben oui, tmp2 essaye de toucher a une table qui n'existe pas (quel nom bien choisi!). Et on a meme la ligne ou ca ne fonctionne pas.
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sqlplus -s xxx/xxx @monscript
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    PLS-00103: Encoutered the symbol "COMMIT"
    Si c'est bien ca, vu que vous avez la ligne, vous devriez trouver ce que je soupconne etre l'erreur. Et apres il n'y a plus qu'a noter la reponse ici pour que ca serve a quelqu'un d'autre, et mettre le sujet en resolu.


    PS: Si il n'y a aucun rapport avec la redirection de sqlplus, je suis desole pour la perte de temps.

  7. #7
    Battosaiii
    Invité(e)
    Par défaut
    Merci Rams7s de ta réponse

    J'ai modifié la commande sql plus pour obtenir des logs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sqlplus $SCHEMA/$SCHEMAPW >./update_nda_sqlplus.log <<-EOF
    J'obtiens les logs suivants :


    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 ?

    SQL*Plus: Release 9.2.0.6.0 - Production on Lu Jul 25 12:06:01 2011

    Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.


    Connecté à :
    Oracle9i Enterprise Edition Release 9.2.0.6.0 - 64bit Production
    With the Partitioning, OLAP and Oracle Data Mining options
    JServer Release 9.2.0.6.0 - Production

    SQL> Connecté.
    SQL> SQL> SQL> SQL> SQL> SQL> SQL> SQL> 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 Déconnecté de Oracle9i Enterprise Edition Release 9.2.0.6.0 - 64bit Production
    With the Partitioning, OLAP and Oracle Data Mining options
    JServer Release 9.2.0.6.0 - Production

Discussions similaires

  1. Erreur SQL, aucune donnée trouvée
    Par kilwa dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 29/12/2014, 18h05
  2. Creation script Sql de base de données et erreur NOLOCK
    Par miniquick dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 30/04/2009, 09h12
  3. [sql server2000 ed developpeur) Erreur entreprise manager
    Par GéniuS77 dans le forum MS SQL Server
    Réponses: 10
    Dernier message: 26/05/2008, 08h02
  4. [SQL Server][ODBC - BDE]Erreur hstmt
    Par Zatoobux dans le forum Bases de données
    Réponses: 1
    Dernier message: 30/08/2004, 15h06
  5. Modifier le nom d'une base de donnée avec erreur sy
    Par mmn dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 25/11/2003, 10h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo