Précédent   Forum des professionnels en informatique > Bases de données > Oracle
Oracle Forum Oracle : le serveur, les outils, ... Voir F.A.Q Oracle Tutoriels 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 26/11/2010, 17h40   #1
Invité de passage
 
Inscription : novembre 2010
Messages : 4
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 4
Points : 1
Points : 1
Par défaut procédure ne fonctionne pas

Bonjour,
J'ai réalisé une procédure, elle insert une ligne dans une table(projet), et elle reprend le code de la nouvelle ligne pour en insert une autre dans une autre table(activite), Sans le rollback la premiére est bien inseré, mais pas la deuxieme. Si vous avez une idée de mon erreur... merci d'avance.

Code :
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
CREATE OR REPLACE 
PROCEDURE COPIE8PROJ (code IN projet.projcode%type) AS 
 
codep projet.projcode%type;
codea activite.actiidlot%type;
p projet%rowtype;
acti activite%rowtype;
 
BEGIN
 
      SELECT code_proj INTO codep FROM dual;
      SELECT * INTO p FROM projet WHERE projcode = code;
      INSERT INTO projet VALUES (codep, p.clino, p.typprojid, p.sectactiid, p.colabmatri, p.projchaglobesti, p.projcyclvi, p.projdtdbuprev,
        p.projdtfnprev, p.projdtreeldbu, NULL, p.projlibcour, p.projliblon, p.projnbcolab, 'copie'); 
 
      SELECT id_lot(codep) INTO codea FROM dual ;
      SELECT * INTO acti FROM activite WHERE projcode = code AND actiidlot = to_number(concat(code, to_char('01')));
      INSERT INTO activite VALUES (codea, acti.typactiid, codep, 0, 0, 0);
 
    commit;
 
  exception
  when others then
  dbms_output.put_line('erreur');
  rollback;
 
END COPIE8PROJ;
oracle 11g, win xp
gorbac est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2010, 19h03   #2
Membre actif
 
Inscription : février 2007
Messages : 167
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 167
Points : 161
Points : 161
Par défaut Hu ?

Bonjour,

Ca compile ça ?

C'est la ligne
Code :
1
2
 
  SELECT code_proj INTO codep FROM dual;
Qui me fait tiquer.

Pozzo
Pozzo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2010, 19h27   #3
Invité de passage
 
Inscription : novembre 2010
Messages : 4
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 4
Points : 1
Points : 1
Tout d’abord merci de t'être penché sur mon problème

Code :
SELECT code_proj INTO codep FROM dual;
.
en faite code_proj est une fonction que me renvoi un numéro séquentiel associé a un autre nombre.
Sinon la compilation est bonne.
gorbac est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2010, 20h44   #4
Membre actif
 
Inscription : février 2007
Messages : 167
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 167
Points : 161
Points : 161
Ah.

Deux idées :
1 Il n'y a pas un trigger sur la table active qui pourait perturber ?
2 Si tu fais un dbms_output.put_line('Fini') avant la clause exception ça s'affiche bien ?

Pozzo
Pozzo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2010, 21h45   #5
Invité de passage
 
Inscription : novembre 2010
Messages : 4
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 4
Points : 1
Points : 1
résultat de l’exécution de la procédure :
Citation:
Connexion à la base de données active.
Le projet 1006 n'existe pas
erreur
Processus fermé.
Déconnexion de la base de données active.
"Le projet 1006 n’exite pas" c'est le resultat de ma fonction id_lot

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
CREATE OR REPLACE
FUNCTION ID_LOT (codepro projet.projcode%type)
RETURN number AS 
annee number;
code number;
recup char :='0';
BEGIN
  SELECT max(actiidlot) INTO code FROM activite WHERE projcode = codepro;
  code := (substr(code, -2,2))+1;
 
  IF code<10 then
      code := concat(codepro, (concat(recup, to_char(code))));
  else
      code := concat((to_char(annee)), to_char(code));
  end IF;
  code := to_number(code);
  IF code IS NULL then 
       dbms_output.put_line('Le projet '||codepro||' n''existe pas');
  else
     RETURN code;
  end IF;
END ID_LOT;
Elle fonctionne bien.
gorbac est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2010, 22h21   #6
Invité de passage
 
Inscription : novembre 2010
Messages : 4
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 4
Points : 1
Points : 1
Problème resolu, cela venais de ma fonction, que j'avais créé pour les updates et non les insert, tout bête
Code :
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
CREATE OR REPLACE 
PROCEDURE COPIE8PROJ (code IN projet.projcode%type) AS 
 
codep projet.projcode%type;
codea activite.actiidlot%type;
p projet%rowtype;
acti activite%rowtype;
 
BEGIN
 
      SELECT * INTO p FROM projet WHERE projcode = code;
      SELECT code_proj INTO codep FROM dual;
      INSERT INTO projet VALUES (codep, p.clino, p.typprojid, p.sectactiid, p.colabmatri, p.projchaglobesti, p.projcyclvi, p.projdtdbuprev,
        p.projdtfnprev, p.projdtreeldbu, NULL, p.projlibcour, p.projliblon, p.projnbcolab, 'copie'); 
      codea := 1;
      codea := concat(codep, (concat('0', to_char(codea))));    
      codea := to_number(codea); 
 
      SELECT * INTO acti FROM activite WHERE projcode = code AND actiidlot = to_number(concat(code, to_char('01'))); 
      INSERT INTO activite VALUES (codea, acti.typactiid, codep, 0, 0, 0);
 
commit;  
 
  exception
  when others then
  dbms_output.put_line('erreur');
  rollback;
 
END COPIE8PROJ;
Voili, voilou mon code qui marche, merci pour l'aide et le temps passé.
gorbac est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h26.


 
 
 
 
Partenaires

Hébergement Web