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

Oracle Discussion :

Ma procédure n'insert rien dans ma table


Sujet :

Oracle

  1. #1
    Candidat au Club
    Inscrit en
    Octobre 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 5
    Points : 3
    Points
    3
    Par défaut Ma procédure n'insert rien dans ma table
    Bonjour,

    J'ai créé une procédure dans un package et quand je fais appel à cette proc dans une application développée avec (HTMLDB maintenant appelé APEX) j'obtient cet erreur :
    ORA-20001: ORA-01403: no data found Erreur signalee ETAPE : 4.

    J'ai mis la variable ETAPE pour savoir à quel moment l'erreur survient, tout se passe comme si la première insertion ne se fait pas.

    voici mon package (merci de m'aider à trouver ce qui ne va pas):

    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
    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
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    create or replace package POIR_1_PKG as
        PROCEDURE proc_ajouter(p_nom in VARCHAR2,nom in VARCHAR2,n_app_r in VARCHAR2,n_civ_r in VARCHAR2,t_rue_r in VARCHAR2,n_rue_r in VARCHAR2,cp_r in VARCHAR2,cellu_r in VARCHAR2,v_r in VARCHAR2,p_r in VARCHAR2,n_app_b in VARCHAR2,n_civ_b in VARCHAR2,t_rue_b in VARCHAR2,n_rue_b in VARCHAR2,cp_b in VARCHAR2,cellu_b in VARCHAR2,v_b in VARCHAR2,p_b in VARCHAR2);
    END POIR_1_PKG;
     
     
    /****************   BODY   ******************************************************/
     
    create or replace package BODY POIR_1_PKG as
    	PROCEDURE proc_ajouter(p_nom in VARCHAR2,nom in VARCHAR2,n_app_r in VARCHAR2,n_civ_r in VARCHAR2,t_rue_r in VARCHAR2,n_rue_r in VARCHAR2,cp_r in VARCHAR2,cellu_r in VARCHAR2,v_r in VARCHAR2,p_r in VARCHAR2,n_app_b in VARCHAR2,n_civ_b in VARCHAR2,t_rue_b in VARCHAR2,n_rue_b in VARCHAR2,cp_b in VARCHAR2,cellu_b in VARCHAR2,v_b in VARCHAR2,p_b in VARCHAR2)
    	is
    	id_Type_Rue number;
    	id_Ville number;
    	id_Type_Adresse number;
    	id_adresse_res number;
    	id_adresse_bur number;
            Etape number;
            l_count number;      
           	Begin
    	     --BEGIN TRANSACTION 'debut';
     
    	     Etape := 0;
    	     -- Prendre l id du type de rue de la residence
    	     select IdTypeRue into id_Type_Rue from TYPE_RUE where Nom = t_rue_r;
     
    	     Etape := Etape + 1;
    	     -- Prendre l id de la ville de la residence
    	     select idVille into id_Ville from VILLE where Nom = v_r AND IdProvince = (select IdProvince from PROVINCE where Nom = p_r);
     
    	     Etape := Etape + 1;	     
    	     -- SAVEPOINT ajout_adresse_res;
    	     -- L'adresse existe deja ne pas la rajouter dans la base, prendre son id
    		select count(*) into l_count from Adresse where
    		UPPER(NumeroAppartement) = UPPER(n_app_r) AND
    		UPPER(NumeroCivic) = UPPER(n_civ_r) AND
    	     	idTypeRue = id_Type_Rue AND
    	     	UPPER(NomRue) = UPPER(n_rue_r) AND
    	     	UPPER(Cellule) = UPPER(cellu_r) AND
    	     	UPPER(CodePostal) = UPPER(cp_r) AND
    	     	IdVille = id_Ville AND
    	     	IdTypeAdresse = 2;
     
    	     Etape := Etape + 1;
    	     if (l_count = 0) then   -- donc l'adresse n'existe pas dans la table
    	     	Etape := Etape + 1;
    	     	insert into ADRESSE (NumeroAppartement,NumeroCivic, IdTypeRue,NomRue,Cellule,CodePostal,IdVille,IdTypeAdresse) values(n_app_r,n_civ_r,id_Type_Rue,n_rue_r, cellu_r,cp_r,id_Ville,2);
    	     end if;
     
    	     Etape := Etape + 1;
    	     -- Prendre idadresse de la residence
    	     select IdAdresse into id_adresse_res from Adresse where
    		UPPER(NumeroAppartement) = UPPER(n_app_r) AND
    		UPPER(NumeroCivic) = UPPER(n_civ_r) AND
    	     	idTypeRue = id_Type_Rue AND
    	     	UPPER(NomRue) = UPPER(n_rue_r) AND
    	     	UPPER(Cellule) = UPPER(cellu_r) AND
    	     	UPPER(CodePostal) = UPPER(cp_r) AND
    	     	IdVille = id_Ville AND
    	     	IdTypeAdresse = 2;
     
    	     Etape := Etape + 1;
    	     -- Prendre l id du type de rue du bureau
    	     select IdTypeRue into id_Type_Rue from TYPE_RUE where Nom = t_rue_b;
     
    	     Etape := Etape + 1;
    	     -- Prendre l id de la ville du bureau
    	     select idVille into id_Ville from VILLE where Nom = v_b AND IdProvince = (select IdProvince from PROVINCE where Nom = p_b);	     
     
    	     -- SAVEPOINT ajout_adresse_bur;	     
    	     -- Si l'adresse existe deja ne pas la rajouter dans la base, prendre son id
    		select count(*) into l_count from Adresse where
    		UPPER(NumeroAppartement) = UPPER(n_app_b) AND
    		UPPER(NumeroCivic) = UPPER(n_civ_b) AND
    	     	idTypeRue = id_Type_Rue AND
    	     	UPPER(NomRue) = UPPER(n_rue_b) AND
    	     	UPPER(Cellule) = UPPER(cellu_b) AND
    	     	UPPER(CodePostal) = UPPER(cp_B) AND
    	     	IdVille = id_Ville AND
    	     	IdTypeAdresse = 1;
     
    	     if (l_count = 0) then   -- donc l'adresse n'existe pas dans la table
    	     	insert into ADRESSE(NumeroAppartement,NumeroCivic, IdTypeRue,NomRue,Cellule,CodePostal,IdVille,IdTypeAdresse) values(n_app_b,n_civ_b,id_Type_Rue,n_rue_b, cellu_b,cp_b,id_Ville,1);
    	     End if;
     
    	     -- Prendre idadresse du bureau
    	     select IdAdresse into id_adresse_bur from Adresse where
    		UPPER(NumeroAppartement) = UPPER(n_app_b) AND
    		UPPER(NumeroCivic) = UPPER(n_civ_b) AND
    	     	idTypeRue = id_Type_Rue AND
    	     	UPPER(NomRue) = UPPER(n_rue_b) AND
    	     	UPPER(Cellule) = UPPER(cellu_b) AND
    	     	UPPER(CodePostal) = UPPER(cp_B) AND
    	     	IdVille = id_Ville AND
    	     	IdTypeAdresse = 1;
     
    	     -- AJOUT DANS TABLE cONTACTS
    	     -- SAVEPOINT ajout_contacts;	     
    	     Insert into Contacts(Matricule,Nom,Prenom,IdTypeRessource,IdAdresseResidence,IdFonction,IdAdresseBureau,Courriel,IdDepartement) values(mat,nom, p_nom, 2, id_adresse_res, 3, id_adresse_bur,courriel,205);
     
    	     COMMIT;
    	     EXCEPTION
        	     	WHEN OTHERS THEN
        	     	BEGIN
                 		ROLLBACK; -- TO ajout_adresse_res;
                 		RAISE_APPLICATION_ERROR (-20001,SQLERRM(SQLCODE) || ' Erreur signalee ETAPE : ' || Etape);
                    END; 
     
    	End;
     
    END POIR_1_PKG;

  2. #2
    Membre du Club Avatar de gaboo_bl
    Profil pro
    Inscrit en
    Août 2006
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2006
    Messages : 67
    Points : 58
    Points
    58
    Par défaut
    Bonjour,
    votre 4eme incrémentation d'Etape est dans un bloc if, si ce bloc n'est pas vérifié etape vaux toujours 4 dans le select suivant, je pense donc que c'est celui là qui génère l'erreur no_data_found.

    Utilisez des messages "en dur" quand vous debuggez avec une variable ou DBMS_OUTPUT, car un compteur peut vous induire en erreur (comme c'est le cas ici). Par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Etape := 'Etape1';
    --du code
    Etape := 'Etape2';
    --etc...

  3. #3
    Candidat au Club
    Inscrit en
    Octobre 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Bonjour gaboo_bl,

    mon l_count est toujours = 0 car l'adresse n'est pas dans la table donc l'insertion doit s'executer. Mais étape ne prendra pas la valeur 5 car la selection qui suit ne trouve pas l'adresse que je viens d'inserrer ce qui me laisse croire que l'insertion ne sait pas faite.

    J'avais mis COMMIT juste après l'insertion et en même temps j'avais enlevé les commentaires dans les lignes :
    SAVEPOINT ajout_adresse_res;
    et
    ROLLBACK; -- TO ajout_adresse_res;
    je voulais qu'en cas d'erreur que tout ce qui a été fait soit enlevé mais j'avais l'erreur du genre 'ajout_adresse_res' n'existe pas.

    Benn

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    Citation Envoyé par bennbenn
    je voulais qu'en cas d'erreur que tout ce qui a été fait soit enlevé mais j'avais l'erreur du genre 'ajout_adresse_res' n'existe pas.
    bah c'est cette erreur là qu'il faut traiter

    Merci de penser aux balises CODE la prochaine fois

  5. #5
    Membre du Club Avatar de gaboo_bl
    Profil pro
    Inscrit en
    Août 2006
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2006
    Messages : 67
    Points : 58
    Points
    58
    Par défaut
    Si je déroule le programme en posant l_count != 0, dans ce cas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Etape <- 0
    1er select
    Etape <- 1
    2eme select 
    Etape <- 2
    3eme select
    Etape <- 3
    if --vérifié
    Etape <- 4
    l'insertion s'éxecute 
    Etape <- 5
    le select s'éxecute -- ici çà plante.
    Dans ce cas vous constatez que Etape devrait valoir 5 dans le bloc exception. Ce n'est pas le cas. Et un insert ne provoque pas l'erreur 1403, (enfin çà ne me semble pas avoir de sens, un no_data_found sur une insertion)
    Vous devriez quand même vérifier en remplaçant votre compteur avec la manip indiquée dans mon précédent post, histoire d'être sur de l'endroit exact ou s'arrête votre programme.

    D'autre part, çà n'est pas une histoire de commit, car à l'interieur d'une proc stockée, vous êtes dans la même transaction (dans votre cas en tout cas c'est vrai) donc vous voyez les modifications non commitée de votre procédure.

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    NO_DATA_FOUND, TOO_MANY_ROWS ou autre ?

Discussions similaires

  1. Insertion croisée dans deux tables mysql
    Par tiger33 dans le forum Requêtes
    Réponses: 6
    Dernier message: 19/09/2006, 08h55
  2. Insertion directe dans une table
    Par zzinfo dans le forum SQL
    Réponses: 2
    Dernier message: 28/02/2006, 15h17
  3. [9i] insertion sequentiel dans une table
    Par djalil dans le forum Oracle
    Réponses: 4
    Dernier message: 17/11/2005, 19h06
  4. [JSP]probleme d'insertion float dans une table
    Par karamazov994 dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 14/04/2005, 11h49
  5. Insertion valeure dans une table
    Par krfa1 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 29/03/2005, 10h50

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