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 :

Procédure stockée PL/SQL ajout automatique sur table


Sujet :

PL/SQL Oracle

  1. #1
    Candidat au Club
    Homme Profil pro
    Université
    Inscrit en
    Février 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Université

    Informations forums :
    Inscription : Février 2015
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Procédure stockée PL/SQL ajout automatique sur table
    Je débute en PL/SQL , donc un peu d'aide sera la bienvenue

    j'ai les relations suivantes :

    THEATRES (IDTHEATRE, NOMTHEATRE, ADRESSE, TEL, NBREPLACES)
    AUTEURS (IDAUTEUR, PRENOMAUTEUR, NOMAUTEUR, NAISSANCE, DECES,NATIONALITE)
    ACTEURS (IDACTEUR, PRENOMACTEUR, NOMACTEUR, #IDTHEATRE)
    PIECES (IDPIECE, TITRE, TYPE, #IDTHEATRE, #IDAUTEUR)
    REPRESENTATIONS (IDREPRESENTATION, #IDPIECE, DATE_A, PLACESRESTANTES)
    JOUE (#IDACTEUR, #IDPIECE)

    J'essaie de répondre aux questions suivantes :

    1 . De créer un bloc PL/SQL pour ajouter automatiquement une pièce dans la base.

    J'essaie avec :
    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
     
     
    set serveroutput on;
     
     
    CREATE OR REPLACE PROCEDURE Ajout ( 
    		n_PIECES_lu  IN PIECES.IDPIECE%TYPE,
    		TITRE_PIECES_lu IN PIECES.TITRE%TYPE ,
    		TYPE_PIECES_lu IN PIECES.TYPE%TYPE,
    		IDTHEATRE_PIECES_lu IN PIECES.IDTHEATRE%TYPE,
    		IDAUTEUR_PIECE_lu IN PIECES.IDAUTEUR%TYPE ) 
    IS 
     
    BEGIN 
    	-- Insertion automatique d'une nouvelle pièce dans la table PIECES  : 
     
    	insert into PIECES(IDPIECE,TITRE,TYPE,IDTHEATRE,IDAUTEUR) 
    	values(n_PIECES_lu, TITRE_PIECES_lu, TYPE_PIECES_lu,IDTHEATRE_PIECES_lu,IDAUTEUR_PIECE_lu);
     
    	-- Insertion automatique dans la table JOUE1 tous les acteurs pensionnaires du THEATRE où la pièce a été jouée : 
     
    	For line in ( SELECT IDTHEATHRE FROM ACTEURS WHERE  ACTEURS.IDTHEATRE=IDTHEATRE_PIECES_lu) 
    	LOOP 	
    		insert into JOUE1 values (ligne.IDACTEUR,IDTHEATRE_PIECE_lu);
    	endloop 
     
    COMMIT; 
     
    END;
    /
    show errors ;
    ET insérer automatiquement dans la table JOUE tous les acteurs pensionnaires du théâtre comme acteurs de la pièce ( paramètres passés : ts les champs de PIECES ) . ===> Je ne vois pas trop cmt faire !! :p

    2. Ajouter les traitements d'erreurs possibles :

    - n° pièce déjà présent
    - identifiant théâtre inconnu
    - identifiant auteur inconnu
    - le ‘Grenier théâtre’ ne présente jamais de pièces de type ‘Tragédie’,
    - si la pièce est déjà donnée dans un autre théâtre (titre équivalent), le type de la pièce
    doit être le même.

    help !

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

    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
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    Merci d'éditer ton post et d'encadrer ton code par les balises Code (le # dans les icônes), ce sera plus lisible.

    Je vais te donner quelques directions (sans faire le devoir à ta place )

    1/ La procédure me parait bonne, sauf le commit qui doit être en dehors de la partie exception.
    Le partie exception n'est pas renseignée (exception when ... then ... end; ), donc soit tu mets une exception, soit tu vire le EXCEPTION

    ET insérer automatiquement dans la table JOUE tous les acteurs pensionnaires du théâtre comme acteurs de la pièce ( paramètres passés : ts les champs de PIECES ) . ===> Je ne vois pas trop cmt faire !! :p
    Dans tes paramètres, tu as le n° du théâtre, donc par un SELECT tu peux ramener tous les acteurs de ce théâtre.
    En SQL, tu peux faire un INSERT INTO table(cols) VALUES (...) ou INSERT INTO table(cols) SELECT ...


    2. Ajouter les traitements d'erreurs possibles :

    - n° pièce déjà présent
    - identifiant théâtre inconnu
    - identifiant auteur inconnu
    - le ‘Grenier théâtre’ ne présente jamais de pièces de type ‘Tragédie’,
    - si la pièce est déjà donnée dans un autre théâtre (titre équivalent), le type de la pièce doit être le même.
    Le plus simple est de faire des SELECT (avant l'insert) et en cas de NO_DATA_FOUND, te sortir en erreur par un RAISE_APPLICATION_ERROR(-2000X, Texteerreur)
    Pour le premier cas, tu peux bien sur utiliser le mécanisme automatique Oracle d'exception sur l'INSERT (EXCEPTION WHEN DUP_VAL_ON_INDEX)
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  3. #3
    Candidat au Club
    Homme Profil pro
    Université
    Inscrit en
    Février 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Université

    Informations forums :
    Inscription : Février 2015
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Merci pour votre aide , j'ai modifié mon post et mis à jour le code

  4. #4
    Expert éminent sénior 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
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par McM Voir le message
    ...
    Le plus simple est de faire des SELECT (avant l'insert) et en cas de NO_DATA_FOUND, te sortir en erreur par un RAISE_APPLICATION_ERROR(-2000X, Texteerreur)
    Non, le plus simple est d'utiliser les contraintes de type clé étrangère. Ces select dans une procédure n'ont pas vraiment de sens: la valeur concernant l'auteur doit être vérifie lors de la saisie, dans l'interface utilisateur, et non pas dans la procédure. De plus si elle est trouvée, vous devez la verrouiller pour être sur que son existence perdure jusqu'à la fin de la transaction.

  5. #5
    McM
    McM est déconnecté
    Expert éminent

    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
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Non, le plus simple est d'utiliser les contraintes de type clé étrangère
    Tout à fait d'accord avec toi, mais à ce que j'ai cru comprendre, la demande est d'afficher un message, non ?
    Donc différencier théâtre inconnu et auteur inconnu, va revenir à lire le sqlerrm pour trouver le nom de la Foreign Key et en déduire le texte.

    Et puis c'est scolaire.

    De plus si elle est trouvée, vous devez la verrouiller pour être sur que son existence perdure jusqu'à la fin de la transaction
    T'es un psychopathe !
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  6. #6
    Candidat au Club
    Homme Profil pro
    Université
    Inscrit en
    Février 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Université

    Informations forums :
    Inscription : Février 2015
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Erreur !!!!!
    J'arrive à ça :

    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
     
    set serveroutput on;
     
    CREATE OR REPLACE PROCEDURE Ajout ( 
    					n_PIECES_lu  IN PIECES.IDPIECE%TYPE,
    					TITRE_PIECES_lu IN PIECES.TITRE%TYPE ,
    					TYPE_PIECES_lu IN PIECES.TYPE%TYPE,
    					IDTHEATRE_PIECES_lu IN PIECES.IDTHEATRE%TYPE,
    					IDAUTEUR_PIECE_lu IN PIECES.IDAUTEUR%TYPE ) 
    IS 
     
    BEGIN 
    				-- Insertion automatique d'une nouvelle pièce dans la table PIECES  : 
     
    		insert into PIECES (IDPIECE,TITRE,TYPE,IDTHEATRE,IDAUTEUR) 
    		values(n_PIECES_lu, TITRE_PIECES_lu, TYPE_PIECES_lu,IDTHEATRE_PIECES_lu,IDAUTEUR_PIECE_lu);
     
    		-- Insertion automatique dans la table JOUE1 tous les acteurs pensionnaires du THEATRE où la pièce a été jouée : 
     
                    For line in ( SELECT IDACTEUR FROM ACTEURS  WHERE  ACTEURS.IDTHEATRE=IDTHEATRE_PIECES_lu ) LOOP 	
    		insert into JOUE1( values (ligne.IDACTEUR,IDTHEATRE_PIECE_lu);
     
    		end loop;
     
     
    	END;
    	/
    		show errors;


    LE show errors me lance un : 19/25 PL/SQL: ORA-00928: mot-clé SELECT absent !!!
    Je ne vois pas ce qu'il n'aime pas , dois-je faire un select après le insert .... ?
    Comment ajouter les exceptions ?
    Merci à vs

  7. #7
    McM
    McM est déconnecté
    Expert éminent

    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
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    La programmation ce n'est pas de l'approximatif, il faut être rigoureux et se relire.

    Line <> Ligne
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  8. #8
    Candidat au Club
    Homme Profil pro
    Université
    Inscrit en
    Février 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Université

    Informations forums :
    Inscription : Février 2015
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par McM Voir le message
    La programmation ce n'est pas de l'approximatif, il faut être rigoureux et se relire.

    Line <> Ligne

    Merci :p

    Je corrige le code est j'ai une autre erreur ORA-00984: un nom de colonne n'est pas autorisé ici

  9. #9
    Expert éminent sénior 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
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par McM Voir le message
    ...
    T'es un psychopathe !
    Certainement. Mais il suffit de se payer un billet à un spectacle qui se tiens dans un théâtre fermé pour changer d'avis

  10. #10
    Candidat au Club
    Homme Profil pro
    Université
    Inscrit en
    Février 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Université

    Informations forums :
    Inscription : Février 2015
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    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
     
    set serveroutput on;
     
    CREATE OR REPLACE PROCEDURE Ajout ( 
    									n_PIECES_lu  IN PIECES.IDPIECE%TYPE,
    									TITRE_PIECES_lu IN PIECES.TITRE%TYPE ,
    									TYPE_PIECES_lu IN PIECES.TYPE%TYPE,
    									IDTHEATRE_PIECES_lu IN PIECES.IDTHEATRE%TYPE,
    									IDAUTEUR_PIECE_lu IN PIECES.IDAUTEUR%TYPE ) 
    	IS 
     
    	BEGIN 
    		-- Insertion automatique d'une nouvelle pièce dans la table PIECES  : 
     
    		insert into PIECES (IDPIECE,TITRE,TYPE,IDTHEATRE,IDAUTEUR) 
    		values(n_PIECES_lu, TITRE_PIECES_lu, TYPE_PIECES_lu,IDTHEATRE_PIECES_lu,IDAUTEUR_PIECE_lu);
     
    		-- Insertion automatique dans la table JOUE1 tous les acteurs pensionnaires du THEATRE où la pièce a été jouée : 
     
     
    		     For line in ( SELECT IDACTEUR FROM ACTEURS  WHERE  ACTEURS.IDTHEATRE=IDTHEATRE_PIECES_lu ) LOOP 	
    					insert into JOUE1 values (line.IDACTEUR,n_PIECES_lu);
     
    	             end loop;
     
     
    END;
    /
    		show errors;
    No errors ! yeaah

  11. #11
    McM
    McM est déconnecté
    Expert éminent

    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
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Ahh. tu vois quand tu veux

    2 choses : La première est importante en sql : TOUJOURS mettre le nom des colonnes utilisées dans un INSERT
    Si jamais tu rajoutes une colonne à ta table, la procédure plantera.
    Si jamais entre 2 bases de données (prod/dev/valid/formation, etc..) l'ordre des colonnes est différents, tu peux avoir des gros soucis.

    Ensuite ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     For line in ( SELECT IDACTEUR FROM ACTEURS  WHERE  ACTEURS.IDTHEATRE=IDTHEATRE_PIECES_lu ) LOOP 	
    					insert into JOUE1 values (line.IDACTEUR,n_PIECES_lu);
     end loop;
    peux être remplacé (et c'est mieux niveau base de données) en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    insert into JOUE1 
    SELECT IDACTEUR,n_PIECES_lu
    FROM ACTEURS  WHERE  ACTEURS.IDTHEATRE=IDTHEATRE_PIECES_lu;
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

Discussions similaires

  1. [AC-2000] [QRY SQL]Requete ajout imbriquées sur Tables Relationnelle
    Par Barbaboulle dans le forum Requêtes et SQL.
    Réponses: 0
    Dernier message: 12/10/2009, 12h00
  2. Procédure stockée, transact SQL et param de type INT
    Par Samish dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 20/04/2006, 11h01
  3. Réponses: 2
    Dernier message: 05/12/2005, 17h39
  4. Procédure stockée - Retourner plusieurs ligne d'une table
    Par ronando dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 02/11/2005, 14h19
  5. Procédures stockées imbriquées SQL Server
    Par Mike69 dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 01/10/2003, 11h31

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