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

SQL Oracle Discussion :

Procédure d'insertion qui ne s'exécute pas très bien


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Lucas Panny
    Invité(e)
    Par défaut Procédure d'insertion qui ne s'exécute pas très bien
    Bonjour,

    Voici une procédure stockée qui consiste clairement à insérer un enregistrement dans la table TableCategories !!
    Je lance en fait cette procédure à partir de mon programme (en VB) sous ADO avec l'instruction Execute().
    Et ben, la fonction vb s'exécute sans exception/erreur mais rien est fait du côté de la base, pas de nouvel enregistrement dans la table TableCategories alors que je pense que cette procédure est OK non ?
    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
    37
    38
    39
    40
    CREATE  OR REPLACE procedure NewFieldInCateg
       (v_LastUser varchar2 ,
      v_LastWorkstation varchar2 ,
      v_DS int,
      v_IDCategory varchar2,
      v_Name varchar2 ,
      v_Class varchar2 ,
      v_Type int,
      v_ID varchar2,
      v_IDClass out varchar2,
      v_Result out int )
     
    AS
     
     
    BEGIN
      v_Result := -1;
     
      SELECT ID into v_IDClass FROM TableClasses WHERE Name = v_Class;
     
      insert into TableCategories (ID, system, Name, IDParentCategory, IDClass, Type, DocumentStatus, DateCreation, DateModification, LastUser, LastWorkstation, CreatorUser, CREATORWORKSTATION)
          values (v_ID, 1, v_Name, v_IDCategory, v_IDClass, v_Type,v_DS,localtimestamp,localtimestamp, v_LastUser, v_LastWorkstation, v_LastUser, v_LastWorkstation);
     
          update TableCategories set "SYSTEM" = 0
    	  where id = v_ID;
     
     
     if (v_ID IS NOT NULL) then
    		COMMIT ;
    		Return;
     END IF;
     
    ROLLBACK ;
     
    EXCEPTION
       when others then
         dbms_output.put_line(SQLCODE);
     
     
    end NewFieldInCateg;
    Comment tester cette procédure sous SQL+ par exemple ou d'une autre manière que dans mon application vb

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Par défaut
    Vous pouvez tester un appel de procédure avec les commandes SQL*Plus suivantes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    variable n number;
    variable s varchar2(10);
     
     
    begin
    :n := 1;
    :s := 'test';
    end;
    /
    exec maprocedure(:n, s:);

    Attention dans cette partie de code en cas de levée d'exception, vous perdez l'exception:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    EXCEPTION
       when others then
         dbms_output.put_line(SQLCODE);

    Il vaut mieux écrire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    EXCEPTION
       when others then
         dbms_output.put_line(SQLCODE);
         raise;
    Et pour avoir l'affichage de DBMS_OUTPUT dans SQL*Plus, il faut ajouter:
    Voir aussi le tutoriel Deplphi Oracle pour la partie gestion des exceptions:
    http://laurent-dardenne.developpez.c...s-applicative/

  3. #3
    Lucas Panny
    Invité(e)
    Par défaut
    J'ai fait ce que tu as indiqué : raise;et SET serveroutput ON
    et alors j'ai exécuté comme suit sous sql plus le test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SET serveroutput ON
     
    variable n number;
    variable s varchar2(10);
     
     
    begin
    :n := 1;
    :s := 'test';
    end;
    /
    exec newfieldincateg('lucaspan\','pc04\',1,0,'CategPN04','','','{B4352A87-4B48-4B05-9250-6F0C03CAFFA1}',:s, :n);
    Voici les erreurs, est-ce normal et pourquoi après "Procédure PL/SQL terminée avec succès.", il y a encore une erreur:
    Procédure PL/SQL terminée avec succès.

    100
    BEGIN newfieldincateg('lucaspan\','pc04\',1,0,'CategPN04','','','{B4352A87-4B48-4B05-9250-6F0C03CAFFA1}',:s, :n); END;

    *
    ERREUR à la ligne 1 :
    ORA-01403: Aucune donnée trouvée
    ORA-06512: à "MYSCHEMA.NEWFIELDINCATEG", ligne 38
    ORA-06512: à ligne 1

  4. #4
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    begin
    :n := 1;
    :s := 'test';
    end;
    /
    se termine avec succés (1° message) mais tu as un SELECT qui ne retourne aucun résultat dans ta procédure.

  5. #5
    Lucas Panny
    Invité(e)
    Par défaut
    L'erreur c'est en fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Procédure PL/SQL terminée avec succès.
     
    100
     
    Procédure PL/SQL terminée avec succès.
    Comment interpréter ce "100" qui devient "-6503" quand on change certains paramètres de la procédure à exécuter.
    Même si le select ne retourne rien, ça retourne au moins une chaine vide qui n'affecte en rien l'INSERT alors pourquoi y a pas d'insertion ?

    Curiosité :Existe-t-il un outil Oracle pour déboguer un script pl/sql pas à pas comme dans les EDI puissants (Visual Basic, Visual C++, etc.) c-à-d un SQL PLUS plus évolué
    Dernière modification par Lucas Panny ; 20/02/2008 à 13h14.

  6. #6
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    Citation Envoyé par Lucas Panny Voir le message
    Même si le select ne retourne rien, ça retourne au moins une chaine vide qui n'affecte en rien l'INSERT alors pourquoi y a pas d'insertion ?
    non, si le SELECT ne retourne rien tu pars en NO_DATA_FOUND qui là n'est pas géré donc dans le OTHERS.

    D'ailleurs, on se demande bien pourquoi tu fait pas tout simplement un INSERT... SELECT... ton UPDATE n'est sensé mettre à jour que la nouvelle ligne insérée ?

  7. #7
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Citation Envoyé par Lucas Panny Voir le message
    ...
    Curiosité :Existe-t-il un outil Oracle pour déboguer un script pl/sql pas à pas comme dans les EDI puissants (Visual Basic, Visual C++, etc.) c-à-d un SQL PLUS plus évolué
    SQL Developer fourni gratuitement par Oracle.

  8. #8
    Lucas Panny
    Invité(e)
    Par défaut
    Citation Envoyé par orafrance
    non, si le SELECT ne retourne rien tu pars en NO_DATA_FOUND qui là n'est pas géré donc dans le OTHERS.
    Et oui, c'est ça l'erreur "Aucune donnée trouvée". Est-ce une spécificité d'Oracle car en Access, c'est une chaine vide ? En fait, une chaîne vide c'est '' ou ' ' (il y a un espace) ??
    Pour détourner ce retour de NO_DATA_FOUND
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if  v_Class =' ' then
             v_IDClass := null;
        else
     
        SELECT ID into v_IDClass FROM TableClasses WHERE Name = v_Class; 
     
        end if ;
    ______________________________
    Citation Envoyé par mnitu
    SQL Developer fourni gratuitement par Oracle.
    Merci !

Discussions similaires

  1. Fichier exécutable qui ne s'exécute pas ?!
    Par bnadem35 dans le forum Linux
    Réponses: 4
    Dernier message: 12/07/2006, 11h35
  2. Réponses: 8
    Dernier message: 08/05/2006, 20h40
  3. probleme de requete mysql qui ne s'exécute pas
    Par anto48_4 dans le forum Requêtes
    Réponses: 6
    Dernier message: 23/03/2006, 10h51
  4. [MySQL] requete sql qui ne s'exécute pas
    Par anto48_4 dans le forum PHP & Base de données
    Réponses: 15
    Dernier message: 16/03/2006, 09h12
  5. 2 SELECT Qui ne s'entendent pas très bien entre eux :(
    Par moutanakid dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 05/08/2004, 16h46

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