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 :

Besoin d'aide pour faire une procédure stockée


Sujet :

SQL Oracle

  1. #1
    Membre éclairé Avatar de PoichOU
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2006
    Messages
    328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juillet 2006
    Messages : 328
    Par défaut Besoin d'aide pour faire une procédure stockée
    Bonjour,


    Admettons que j'ai la table suivante :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ---------------------------------
    |         TABLE VEHICULE        |
    ---------------------------------
    | ID | CATEGORIE | MODELE | KM  |
    ---------------------------------
    |  1 | Voiture   | Twingo | 100 |
    |  2 | Voiture   | Clio   |  50 |
    |  3 | Moto      | Burgman|  14 |
    |  4 | Moto      | Tmax   |   5 |
    ---------------------------------


    j'ai 2 autres tables :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ---------------------
    |   TABLE VOITURE   |
    ---------------------
    | ID | MODELE | KM  |
    ---------------------
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ---------------------
    |     TABLE MOTO    |
    ---------------------
    | ID | MODELE | KM  |
    ---------------------
    avec les sequences associées (SEQ_VOITURE, SEQ_MOTO).


    et enfin 2 tables qui font la liaison entre la VEHICULE et VOITURE et MOTO

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ----------------------------
    |     TABLE VEH_VOITURE    |
    ----------------------------
    | ID_VEHICULE | ID_VOITURE |
    ----------------------------
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    --------------------------
    |     TABLE VEH_MOTO     |
    --------------------------
    | ID_VEHICULE | ID_MOTO  |
    --------------------------


    Je voudrais faire une procèdure stockée (ou une fonction ou quelque chose) qui :
    selectionne tous les éléments étant de la CATEGORIE "Voiture" de la table VEHICULE
    les insère dans la table VOITURE avec la sequence correspondante
    met à jour la table VEH_VOITURE avec l'id de la table VEHICULE et l'id de la table VOITURE (généré par la sequence)

    et bien sûr la même chose pour moto (mais si ça marche pour voiture, y aura plus qu'à changer le nom)


    les scripts de créations :
    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
    --table VEHICULE
    create table VEHICULE  (
    	ID 		INTEGER 	not null,
    	CATEGORIE	VARCHAR2(20)	not null,
    	MODELE		VARCHAR2(20)	not null,
    	KM		NUMBER		not null,
        primary key (ID)
    );
     
    --données de la table VEHICULE
    insert into VEHICULE (ID,CATEGORIE, MODELE,KM) 
    values (1, 'Voiture', 'Twingo', 100);
    insert into VEHICULE (ID,CATEGORIE, MODELE,KM) 
    values (2, 'Voiture', 'Clio', 50);
    insert into VEHICULE (ID,CATEGORIE, MODELE,KM) 
    values (3, 'Moto', 'Burgman', 14);
    insert into VEHICULE (ID,CATEGORIE, MODELE,KM) 
    values (4, 'Moto', 'Tmax', 5);
     
    --table VOITURE
    create table VOITURE  (
    	ID 		INTEGER 	not null,
    	MODELE		VARCHAR2(20)	not null,
    	KM		NUMBER		not null,
        primary key (ID)
    );
     
    --table MOTO
    create table MOTO  (
    	ID 		INTEGER 	not null,
    	MODELE		VARCHAR2(20)	not null,
    	KM		NUMBER		not null,
        primary key (ID)
    );
    --Sequence MOTO
    create sequence SEQ_MOTO
    increment by 1
    start with 000001;
     
    --Sequence VOITURE
    create sequence SEQ_VOITURE
    increment by 1
    start with 000001;
     
     
    create table VEH_VOITURE  (
    	ID_VEHICULE	INTEGER 	not null,
    	ID_VOITURE	INTEGER 	not null,
        primary key (ID_VEHICULE,ID_VOITURE)
    );
     
    create table VEH_MOTO  (
    	ID_VEHICULE	INTEGER 	not null,
    	ID_MOTO		INTEGER 	not null,
        primary key (ID_VEHICULE,ID_MOTO)
    );

    Pouvez-vous m'aider ?

    Merci

    PoichOU

    PS : j'espère que la lecture du post ne vous a pas saouler mais j'ai essayer d'être précis.

  2. #2
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Le but du forum n'est pas de développer à votre place mais de résoudre les problèmes rencontrés.

    Voici le lien pour les procédures stockées
    http://sheikyerbouti.developpez.com/...age=Chap4#L4.1

  3. #3
    Membre éclairé Avatar de PoichOU
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2006
    Messages
    328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juillet 2006
    Messages : 328
    Par défaut
    McM, mon but est simplement de comprendre comment marche les procèdures stockées avec un exemple simple. J'ai vu le lien que tu me donnes mais je n'ai pas réussi à mettre les exemples en application. Je débute vraiment avec ce langage et j'espèrai un petit coup de pouce...


    Voilà l'algo que je veux faire :

    Sélectionner toutes les voitures dans la table VEHICULE
    Pour chaque résultat
    récupérer la séquence
    insèrer dans la table VOITURE
    insérer dans la table de liaison


    Voilà ce que j'ai fait pour le mettre en oeuvre:

    ma procèdure générale :
    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
    CREATE OR REPLACE PROCEDURE procedure_voiture()
     
    DECLARE 
    	CURSOR select_voiture IS SELECT ID,MODELE,KM FROM VEHICULE WHERE CATEGORIE='Voiture';
    	current_vehicule VEHICULE%ROWTYPE;
     
    BEGIN
            OPEN select_voiture;
            LOOP
                FETCH select_voiture INTO current_vehicule;
     
                -- appel de la procèdure pour appeler la séquence
                id_vehicule := call_sequence_voiture();
     
                -- appel de la procèdure pour créer un vehicule
                insert_voiture(id_vehicule,current_vehicule.MODELE,current_vehicule.KM);
     
                -- appel de la procèdure pour créer la relation vehicule - voiture
                insert_veh_voiture(current_vehicule.ID,id_vehicule);
     
                EXIT WHEN select_voiture%NOTFOUND;
            END LOOP;
    END;
    fonction pour récupérer la séquence :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE OR REPLACE FUNCTION call_sequence_voiture() Return VOITURE.ID%Type
     IS
       ID_SEQ VOITURE.ID%Type ;
      BEGIN
        select SEQ_VOITURE.nextVal Into ID_SEQ from DUAL ;
        Return( ID_SEQ ) ;
      END;
    procèdure pour insérer dans la table voiture :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE OR REPLACE PROCEDURE insert_voiture
    (	
    	id IN VOITURE.ID%Type,
    	modele IN VOITURE.MODELE%Type,
    	km IN VOITURE.KM%Type
    ) IS
     
      BEGIN
        INSERT INTO VOITURE (ID,MODELE,KM) VALUES (id,modele,km);
      END;
    procèdure pour insérer dans la table de liaison :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE OR REPLACE PROCEDURE insert_veh_voiture
    (
    	id_vehicule IN VEH_VOITURE.ID_VEHICULE%Type,
    	id_voiture IN VEH_VOITURE.ID_VOITURE%Type
    ) IS
      BEGIN
        INSERT INTO VEH_VOITURE (ID_VEHICULE,ID_VOITURE) VALUES (id_vehicule,id_voiture);
      END;

    Pouvez-vous me dire là où j'ai faux ?

    Merci de m'aider

    PoichOU

  4. #4
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Attention à la cohérence des données:
    Burgman et Tmax ne sont pas des motos mais des scooters!

  5. #5
    Membre éclairé Avatar de PoichOU
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2006
    Messages
    328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juillet 2006
    Messages : 328
    Par défaut
    LoL SheikYerbouti ! tu as raison, je veux bien changer partout moto pour scooter et même mettre les cylindrées qui correspondent si je reçoit un peu d'aide pour mon problème ...

  6. #6
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Pouvez-vous me dire là où j'ai faux ?
    Qu'est-ce qui vous fait dire que votre code n'est pas bon ?

  7. #7
    Membre confirmé
    Inscrit en
    Décembre 2006
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 37
    Par défaut
    bonjour,
    qu'est ce que tu as comme message d'erreur?

  8. #8
    Membre éclairé Avatar de PoichOU
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2006
    Messages
    328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juillet 2006
    Messages : 328
    Par défaut
    Les procèdures insert_veh_voiture et insert_voiture je pense qu'elles marchent.
    La fonction call_sequence_voiture() je ne sais pas trop (je ne sais pas comment la tester)

    Quand j'execute la procèdure ( call procedure_voiture() ; ) j'ai l'erreur suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [Error Code: 6575, SQL State: 65000]  ORA-06575: Fonction PROCEDURE_VOITURE est dans un état non valide
    Merci
    PoichOU

  9. #9
    Membre confirmé
    Inscrit en
    Décembre 2006
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 37
    Par défaut
    recompile tout

  10. #10
    Membre éclairé Avatar de PoichOU
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2006
    Messages
    328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juillet 2006
    Messages : 328
    Par défaut
    c'est-à-dire ?

  11. #11
    Membre confirmé
    Inscrit en
    Décembre 2006
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 37
    Par défaut
    compile la Fonction PROCEDURE_VOITURE et regarde les messages !

  12. #12
    Membre confirmé
    Inscrit en
    Décembre 2006
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 37
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ALTER FUNCTION "nom_foction" COMPILE;

  13. #13
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    If faut remplacer DECLARE par IS

    lorsque la compilation tombe en erreur il faut utiliser l'instruction SHOW_ERRORS ou interroger la vue USER_ERRORS pour afficher l'erreur ainsi que la ligne de code qui est erreur. Sans cela vous allez développer en aveugle.

  14. #14
    Membre éclairé Avatar de PoichOU
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2006
    Messages
    328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juillet 2006
    Messages : 328
    Par défaut
    Merci à vous 2 de bien vouloir m'aider !

    @SheikYerbouti : j'ai remplacé DECLARE par IS
    @LDRISS69 : j'ai tout compilé

    lorsque j'execute call procedure_voiture() ; je trouve ça dans USER_ERRORS :
    Sequence 1 Ligne 1 position 29 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PLS-00103: Symbole ")" rencontré à la place d'un des symboles suivants :  <an identifier> <a double-quoted delimited-identifier>   current

  15. #15
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Revenez dans votre éditeur à la ligne/colonne indiquée et corrigez l'erreur.
    Vous comprenez bien que le but de ce forum n'est pas de décortiquer votre code erreur après erreur jusqu'à ce que la procédure finisse par compiler...

  16. #16
    Membre éclairé Avatar de PoichOU
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2006
    Messages
    328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juillet 2006
    Messages : 328
    Par défaut
    Je comprends bien que vous ne pouvez pas décortiquer le code de tout le monde, mais comme beaucoup de personne qui viennent sur ce forum j'essaye d'apprendre "tout seul" via des tutoriaux ou le forum, mais des fois je bloque et j'ai besoin d'aide...

    La ligne 1 position 29 correspond à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE OR REPLACE PROCEDURE procedure_voiture()
    alors je ne vois pas trop quoi corriger ?

    Je crois qu'il y a une erreur sur la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE OR REPLACE FUNCTION call_sequence_voiture() Return VOITURE.ID%Type 
    IS
    ID_SEQ VOITURE.ID%Type ;
    BEGIN
    select SEQ_VOITURE.nextVal Into ID_SEQ from DUAL ;
    Return(ID_SEQ);
    END;

    J'ai des erreurs dessus dans USER_ERRORS :
    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
    PLS-00103: Symbole ")" rencontré à la place d'un des symboles suivants :
       <an identifier> <a double-quoted delimited-identifier>   current
    
    
    PLS-00103: Symbole "IS" rencontré à la place d'un des symboles suivants :
       . ( , * @ % & - + / at mod rem <an identifier>
       <a double-quoted delimited-identifier> <an exponent (**)> as into || bulk
    
    PLS-00103: Symbole "BEGIN" rencontré à la place d'un des symboles suivants :
       end function package pragma private procedure subtype type
       use <an identifier> <a double-quoted delimited-identifier>
       form current cursor
    
    PLS-00103: Symbole "end-of-file" rencontré à la place d'un des symboles suivants :
       end not pragma final instantiable order overriding static
       member constructor map
    Y a t-il un moyen de tester juste cette fonction ?

  17. #17
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Je crois que les parenthèses ne doivent pas être indiquées ma_proc() si la fonction/procédure n'en accepte aucune.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    create or replace function ma_proc return ...

  18. #18
    Membre éclairé Avatar de PoichOU
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2006
    Messages
    328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juillet 2006
    Messages : 328
    Par défaut
    ça marche !!

    voici les problèmes :
    - il fallait faire un SELECT * si je voulais affecter le résultat dans current_vehicule VEHICULE%ROWTYPE;
    - il fallait mettre le EXIT WHEN select_voiture%NOTFOUND; avant les appels aux procedures
    - il fallait declarer id_vehicule VOITURE.ID%Type ;

    voici le code :
    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
    --
    -- procédure qui permet d'insérer un élément dans la table VOITURE
    --
    CREATE OR REPLACE PROCEDURE insert_voiture
    (	
    	id IN VOITURE.ID%Type,
    	modele IN VOITURE.MODELE%Type,
    	km IN VOITURE.KM%Type
    ) IS
     
      BEGIN
        INSERT INTO VOITURE (ID,MODELE,KM) VALUES (id,modele,km);
      END;
     
     
     
    --
    -- procédure qui permet d'insérer un élément dans la table VEH_VOITURE
    --
    CREATE OR REPLACE PROCEDURE insert_veh_voiture
    (
    	id_vehicule IN VEH_VOITURE.ID_VEHICULE%Type,
    	id_voiture IN VEH_VOITURE.ID_VOITURE%Type
    ) IS
      BEGIN
        INSERT INTO VEH_VOITURE (ID_VEHICULE,ID_VOITURE) VALUES (id_vehicule,id_voiture);
      END;
     
     
     
    -- 
    -- fonction qui renvoi la sequence
    --
    CREATE OR REPLACE FUNCTION call_sequence_voiture Return VOITURE.ID%Type 
    IS
    ID_SEQ VOITURE.ID%Type ;
    BEGIN
    select SEQ_VOITURE.nextVal Into ID_SEQ from DUAL ;
    Return(ID_SEQ);
    END;
     
     
     
    --
    -- procédure générale : 
    --
    CREATE OR REPLACE PROCEDURE procedure_voiture
     
    IS
    	CURSOR select_voiture IS SELECT * FROM VEHICULE WHERE CATEGORIE='Voiture';
    	current_vehicule VEHICULE%ROWTYPE;
    	id_vehicule VOITURE.ID%Type ;
    BEGIN
            OPEN select_voiture;
            LOOP
                FETCH select_voiture INTO current_vehicule;
     
                EXIT WHEN select_voiture%NOTFOUND;
     
                -- appel de la procèdure pour appeler la séquence
                id_vehicule := call_sequence_voiture();
     
                -- appel de la procèdure pour créer un vehicule
                insert_voiture(id_vehicule,current_vehicule.MODELE,current_vehicule.KM);
     
                -- appel de la procèdure pour créer la relation vehicule - voiture
                insert_veh_voiture(current_vehicule.ID,id_vehicule);
     
     
            END LOOP;
    END;

    Merci beaucoup à tous et spécialement à SheikYerbouti


    PoichOU

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Besoin d'aide pour faire une procédure
    Par Romish dans le forum Maple
    Réponses: 0
    Dernier message: 29/05/2013, 19h15
  2. Réponses: 22
    Dernier message: 20/05/2008, 10h25
  3. Besoin d'aide pour faire une string formatée
    Par fab032 dans le forum Langage
    Réponses: 2
    Dernier message: 24/04/2008, 14h37
  4. [MySQL] Besoin d'aide pour faire une boucle
    Par plex dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 15/04/2008, 13h47
  5. [VBA-E]besoin d'aide pour faire une boucle
    Par mikazounette dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 10/04/2006, 14h04

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