[Oracle] SQL Plus me fait des blagues, ca me fait pas rire

SQL Plus me fait des blagues, ca me fait pas rire [Oracle] - SQL/NoSQL - Programmation

Marsh Posté le 16-04-2003 à 16:26:47    

Je suis encore en train de bosser sur cette base. Voici un peu le topo :
 
_creationTables.sql : crée les tables et les contraintes
_creationTriggers.sql : crée les triggers de ma base
_creationProc.sql : crée les procédure de ma base
_purgeBase.sql : vire les tables, triggers et procedures
 
je lance _creationTables.sql, tout va bien.
 
je lance ensuite _creationTriggers.sql, les triggers se creent parfaitement, mais j'ai une erreur en debut d execution qui me dit "create table W_MACHINCHOSE impossible, table existante". Alors je regarde la fin de mon fichier de creation de tables. Comme par hazard la derniere tache est "create table W_MACHINCHOSE".
 
Je rappelle qu a la fin de mon creationTables.sql, la derniere table W_MACHINCHOSE est bien cree. Je rapelle aussi que je n ai aucun create table dans mon _creationTriggers.sql.
 
SQLPlus m execute donc la derniere commande de mon .sql en double...  [:darkmavis ] je suis tres content.
 
Ma curiosité me pousse a executer un _creationProc.sql puis un _creationTriggers.sql. Ce dernier m execute un create procedure en debut de script.
 
Par contre si j execute _creationTriggers.sql puis _creationProc.sql, ce dernier ne m execute une premiere creation de trigger.
 
conclusion : quand j execute _creationTriggers.sql, il s execute bien mais m execute en plus (c'est cadeau) la derniere commande du script precedant  [:yaisse2].
 
ma question : pourquoi  :??:
 
 
 
Annexes :
 
debut du fichier "_creationTriggers.sql"

Code :
  1. /*                          Triggers                        */
  2. /************************************************************/
  3. /* Cree les configurations de liens quand une association entre*/
  4. /*UTILISATEUR et GROUPE est cree */
  5. create or replace trigger T_A_I_UTILISATEUR_GROUPE
  6. after insert on W_UTILISATEUR_GROUPE
  7. for each row
  8. declare
  9. /* Liste des liens concernant le nouveau groupe utilisateur */
  10. cursor C_LIENS_GROUPE is select LIEN from W_GROUPE_LIEN
  11.  where :new.GROUPE = W_GROUPE_LIEN.GROUPE ;
  12. /* Variable recevant le fetch pour les codes des liens */
  13. V_LIEN_COURANT W_LIEN.CODE%type ;
  14. V_NB_RESULTS integer ;
  15. begin
  16. open C_LIENS_GROUPE ;
  17. loop
  18.  fetch C_LIENS_GROUPE into V_LIEN_COURANT ;
  19.  exit when C_LIENS_GROUPE%notfound ;
  20.  select count(*) into V_NB_RESULTS from W_CONFIG_LIEN_UTILISATEUR
  21.   where UTILISATEUR = :new.UTILISATEUR
  22.   and LIEN = V_LIEN_COURANT ;
  23.  if V_NB_RESULTS = 0 then
  24.   insert into W_CONFIG_LIEN_UTILISATEUR (LIEN, UTILISATEUR)
  25.    values (V_LIEN_COURANT, :new.UTILISATEUR) ;
  26.  end if ;
  27. end loop;
  28. end T_A_I_UTILISATEUR_GROUPE ;
  29. /


 
Si vous voyez qqpart que je rappelle le scipt precedant faite moi signe :)
 
Bonus : fin du fichier  _creationProc.sql
 

Code :
  1. /* Modifie la config d'un LIEN pour un UTILISATEUR */
  2. /***************************************************/
  3. create or replace procedure MODIF_CONFIG_LIEN_UTILISATEUR(
  4. P_LIEN in W_LIEN.CODE%type,
  5. P_UTILISATEUR in W_UTILISATEUR.CODE%type,
  6. P_COULEUR in W_CONFIG_LIEN_UTILISATEUR.COULEUR%type,
  7. P_RANG in W_CONFIG_LIEN_UTILISATEUR.RANG%type ,
  8. P_TAILLE in W_CONFIG_LIEN_UTILISATEUR.TAILLE%type  ,
  9. P_POLICE in W_CONFIG_LIEN_UTILISATEUR.POLICE%type
  10. ) as
  11. V_NB_RESULTS integer ;
  12. E_CONFIG_LIEN_UTILISATEUR exception ;
  13. begin
  14. /* Association inexistante */
  15. select count(*) into V_NB_RESULTS from W_CONFIG_LIEN_UTILISATEUR
  16.  where LIEN = P_LIEN
  17.  and UTILISATEUR = P_UTILISATEUR ;
  18. if V_NB_RESULTS = 0 then
  19.  raise E_CONFIG_LIEN_UTILISATEUR ;
  20. end if ;
  21. update W_CONFIG_LIEN_UTILISATEUR set
  22.  COULEUR = P_COULEUR,
  23.  RANG = P_RANG,
  24.  TAILLE = P_TAILLE,
  25.  POLICE = P_POLICE ;
  26. exception
  27. when E_CONFIG_LIEN_UTILISATEUR then raise_application_error (-20611,'Association entre LIEN'||P_LIEN||' et UTILISATEUR '||P_UTILISATEUR||' inexistante. Modif impossible.') ;
  28. end MODIF_CONFIG_LIEN_UTILISATEUR ;
  29. /


 

Reply

Marsh Posté le 16-04-2003 à 16:26:47   

Reply

Marsh Posté le 16-04-2003 à 16:36:43    

ca n'a surement rien a voir mais dans ton script de creation des tables fait un delete de toutes les tables que tu crees (avant de les creer bien sur)


Message édité par polo021 le 16-04-2003 à 16:37:07
Reply

Marsh Posté le 16-04-2003 à 16:41:46    

mon _purgeBase.sql fait ca, j'ai oublié de preciser que je l execute avant tout test :). De toute facon meme avec les tables en place si je cree (en ecrasant) les procedure puis les triggers, la creation des triggers me fait une petite procedure au debut comme je l ai expliqué...
 
je suis comme qui dirait "espenté"  :ouch:

Reply

Marsh Posté le 16-04-2003 à 16:42:47    

masure a écrit :

mon _purgeBase.sql fait ca, j'ai oublié de preciser que je l execute avant tout test :). De toute facon meme avec les tables en place si je cree (en ecrasant) les procedure puis les triggers, la creation des triggers me fait une petite procedure au debut comme je l ai expliqué...
 
je suis comme qui dirait "espenté"  :ouch:  


 
tu peux pas mettre le fichier _creationtables.sql stp ?

Reply

Marsh Posté le 16-04-2003 à 16:47:53    

Code :
  1. /************************************************************/
  2. /*               Creation des tables                        */
  3. /************************************************************/
  4. /* Groupes d'utilisateurs */
  5. create table W_GROUPE(
  6. CODE number(5) not null,
  7. LIBELLE varchar2(32) not null ,
  8. ADMINISTRATION number(1) DEFAULT 0,
  9. primary key (CODE)
  10. );
  11. /* Utilisateurs */
  12. create table W_UTILISATEUR (
  13. CODE number(5) ,
  14. LOGIN varchar2(16) not null ,
  15. MDP varchar2(16) not null,
  16. NOM_RESEAU varchar2(32) not null,
  17. IP varchar2(16) ,
  18. NOM varchar2(32) ,
  19. PRENOM varchar2(32) ,
  20. TEL varchar2(32)  ,
  21. EMAIL varchar2(32) ,
  22. PUCE varchar2(32) ,
  23. primary key (CODE)
  24. );
  25. /* Liaison UTILISATEUR à un GROUPE */
  26. create table W_UTILISATEUR_GROUPE (
  27. UTILISATEUR number(5) ,
  28. GROUPE number(5) ,
  29. foreign key (UTILISATEUR) references W_UTILISATEUR,
  30. foreign key (GROUPE) references W_GROUPE,
  31. primary key (UTILISATEUR, GROUPE)
  32. );
  33. /* Pages disponibles */
  34. create table W_LIEN (
  35. CODE number(5) not null,
  36. URL varchar2(128) not null,
  37. LIBELLE varchar2(128) not null,
  38. LIEN_PERE number(4) ,
  39. primary key (CODE) ,
  40. /* definit cette page comme la page fille d'une autre page */
  41. foreign key (LIEN_PERE) references W_LIEN(CODE) 
  42. );
  43. /* Parametres de l'utilisateur pour un lien */
  44. create table W_CONFIG_LIEN_UTILISATEUR (
  45. LIEN number(5),
  46. UTILISATEUR number(5),
  47. COULEUR char(6) default '000000',
  48. RANG number(2) default 0,
  49. TAILLE number(2) default 14,
  50. POLICE varchar2(32) default 'Arial',
  51. foreign key (LIEN) references W_LIEN(CODE),
  52. foreign key (UTILISATEUR) references W_UTILISATEUR(CODE),
  53. primary key (LIEN, UTILISATEUR)
  54. );
  55. /* Droits d'un groupe sur un lien */
  56. create table W_GROUPE_LIEN (
  57. LIEN number(5),
  58. GROUPE number(5),
  59. foreign key (LIEN) references W_LIEN(CODE),
  60. foreign key (GROUPE) references W_GROUPE(CODE),
  61. primary key (LIEN, GROUPE)
  62. );


 
Je rapelle quand meme que (d'apres moi hein) c'est le creationTriggers qui me fait la misere. Mais c'est gentil de chercher toutes les pistes.


Message édité par Masure le 16-04-2003 à 16:49:04
Reply

Marsh Posté le 16-04-2003 à 18:06:29    

tu as pas un "/" tout seule qui trainne en haut de ton fichier de la creation des triggers???


---------------
Si tu regardes ce que le canard mange, tu ne mangeras pas de canard.
Reply

Marsh Posté le 16-04-2003 à 20:09:48    

d'après mes souvenirs, en fin de fichier, il ne faut pas mettre de ";" avant le "/", sinon la requête passe deux fois.

Reply

Marsh Posté le 16-04-2003 à 20:10:20    

Pour plus de simplicité, met comme dernière instruction un "commit", comme ça s'il est éxécuté 2 fois, tu t'en fout :D

Reply

Marsh Posté le 17-04-2003 à 09:02:32    

thecoin a écrit :

tu as pas un "/" tout seule qui trainne en haut de ton fichier de la creation des triggers???


 
nan :/

Reply

Marsh Posté le 17-04-2003 à 09:03:23    

MagicBuzz a écrit :

d'après mes souvenirs, en fin de fichier, il ne faut pas mettre de ";" avant le "/", sinon la requête passe deux fois.


 
a marche pas un / sans ;
 
il faut bien les deux pour une syntaxe correcte, dixit sqlplus

Reply

Marsh Posté le 17-04-2003 à 09:03:23   

Reply

Marsh Posté le 17-04-2003 à 21:26:17    

ok, j'ai rien dis. Ma version ct le contraire, ça merdait si y'avait les deux. (quand on utilisait "ed" pour éditer le code du moins)
 
Sinon, le coup du "commit" te convient pas ? Ca pas mal comme solution de contournement...


Message édité par MagicBuzz le 17-04-2003 à 21:26:44
Reply

Marsh Posté le 18-04-2003 à 08:44:44    

MagicBuzz a écrit :

ok, j'ai rien dis. Ma version ct le contraire, ça merdait si y'avait les deux. (quand on utilisait "ed" pour éditer le code du moins)
 
Sinon, le coup du "commit" te convient pas ? Ca pas mal comme solution de contournement...


 
Ben je vais faire ca en attendant pour pas voir le probleme mais d'ici la fin de ce taff j'aimerais bien avoir la solution histoire de pas mettre des commit inutiles toute ma vie :/
 
En attendant ca reste une bonne solution :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed