Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 14/01/2008, 15h44   #1
Membre habitué
 
Inscription : mars 2002
Messages : 560
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 560
Points : 107
Points : 107
Par défaut Création d'une procédure stockée

Bonjour,

Je souhaite faire une procédure stockée qui fasse les actions suivantes :

- Supprimer tout le contenu d'une table
- Insérer des données selon un critère particulier
- Faire un update

Ma question donc, doit-on mettre toutes ces instructions dans la même procédure ?
Doit-on créer une TRANSACTION ? Si oui, avez-vous des exemples de procédure utilisant des TRANSACTION ?

Ma dernière problématique est de remplir la clé primaire lors de l'INSERT.
Via un client TOAD, je procède un créant une séquence mais peut-on mettre toutes ces instructions dans une même procédure ?

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
CREATE SEQUENCE maSequence1 START WITH 1 INCREMENT BY 1;
 
INSERT INTO AGREGATION_PNB (
C_ID_AGREGATION, 
D_ANNEE, D_MOIS, N_MONTANT_MVT, N_MONTANT_PROV, N_MONTANT_CORT, N_MONTANT_EURO, 
N_MONTANT_EMPRUNT,
N_MONTANT_AJUSTEMENT,
C_USER_CREATION, 
C_USER_MODIFICATION, D_DATE_CREATION, D_DATE_MODIFICATION, C_CLIENT, C_NUM_COMPTE)
 
SELECT
maSequence1.NEXTVAL, 
....
DROP maSequence1;
Merci d'avance pour toutes remarques.
david71 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/01/2008, 16h40   #2
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
c'est pas un problème SQL mais d'utilisation de TOAD... mets tout ça dans un fichier .sql et utilise SQL*Plus ce sera plus simple
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/01/2008, 16h49   #3
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 319
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
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 : 3 319
Points : 5 837
Points : 5 837
Créer la séquence au début pour la supprimer à la fin ça devrait faire un malheur.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/01/2008, 17h12   #4
Membre Expert
 
Homme
Expert Datawarehouses + BO (sur BDD Oracle et SQL Server)
Inscription : mars 2003
Messages : 645
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 41
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Expert Datawarehouses + BO (sur BDD Oracle et SQL Server)

Informations forums :
Inscription : mars 2003
Messages : 645
Points : 1 165
Points : 1 165
david71, tu peux utiliser TOAD mais tu confonds livraison, développement et exécution.

Si tu te sers des assistants de TOAD il faut d'abord créer ta séquence, puis créer ta procédure etc... Si tu veux les lancer dans un script, comme ton exemple, il faut utiliser un interpreteur de script SQL comme SQL*Plus ou un simili-SQL*Plus qui est integré à TOAD et qui interprète 90% des instructions SQL*Plus. Tu n'as pas à supprimer ta séquence ni à la recréer à chaque fois, ça serait même une erreur de faire cela car le principe même d'une séquence c'est aussi de garder la dernière valeur pour une prochaine insertion.

Effectivement utiliser des transactions est une bonne idée ça permet de garder la cohérence des données mais quand tu fais une requête tu ouvres par défaut une transaction.

exemple de code avec gestion du résultat de la transaction:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 
v_seq             NUMBER(10);
BEGIN
   SELECT maSequence1.NEXTVAL
   INTO   v_seq
   FROM dual;
 
   INSERT INTO AGREGATION_PNB (
   C_ID_AGREGATION, 
   ...)
   SELECT
   maSequence1.NEXTVAL, 
   ....
  FROM   ..;
  COMMIT;   -- commit la transaction
 
EXCEPTION
   WHEN OTHERS THEN -- en cas d'erreur
        ROLLBACK;  -- rollback la transaction
        raise;  -- renvoit l'erreur
 
END;
phili_b est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2008, 17h30   #5
Membre habitué
 
Inscription : mars 2002
Messages : 560
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 560
Points : 107
Points : 107
OK merci ce que je souhaite faire c'est donc mettre tout ce code dans une procédure stockée.

Sachant que je souhaite intégrer mes données via un INSERT avec un index auto-incrémenté.

Merci pour toute information.
david71 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2008, 17h45   #6
Membre habitué
 
Inscription : mars 2002
Messages : 560
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 560
Points : 107
Points : 107
OK bon j'ai essayé de faire l'action suivante mais j'ai une erreur.

Ce que j'ai fait :

* Fait la déclaration de "CREATE SEQUENCE maSequence1 START WITH 1 INCREMENT BY 1;" dans TOAD.

* Dans la procédure stockée, j'ai le problème suivant quand je compile : ORA-00933 à l'instruction :

Code :
1
2
3
4
5
6
 
v_seq NUMBER(10);
...
SELECT maSequence1.NEXTVAL
INTO v_seq
FROM dual;
Ce que je cherche simplement à faire c'est appeler la séquence depuis la procédure stockée. Est-ce tout bonnement possible ?
david71 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 12h14.


 
 
 
 
Partenaires

Hébergement Web