|
|
|
|
Personne ? |
salue ! ça doit faire un sacré bye que t'attends ta réponse toi looooool eh bien j'ai quelques idées pour t'aider.
d'abord, le pb est un des pbs classiques d'oracle : on n'y respecte pas encore certains termes de SQL2 comme des références du genre ON UPDATE qui permettraient de modifier toutes les clés (primaires ou étrangères) dans les tables "filles" ou elles existent dès qu'on touche à la table mère... ç'aurait résolu ton pb en quelques lignes, du genre depuis la création des tables médoc là : create table typemedicament(typemedoc char(10) not null,libellemedoc char(10), primary key(typemedoc)); create table medicament(nummedoc number(3) not null, typemedoc char(10), primary key(nummedoc), foreign key(typemedoc) references typemedicament(typemedoc) ON UPDATE CASCADE); --- dommage, ça n'existe pas encore !!! l'autre truc embêtant, c'est qu'on peut pas introduire des CREATE, ALTER ou DROP dans les procédures et fonctions SQL. dommage, sinon on aurait fait un truc du genre : - supprimer la référence (clé étrangère), comme ceci alter table medicament drop constraint fk; - faire les modifs nécessaires update typemedicament set typemedoc='MIVH' where typemedoc='HIV2B'; update medicament set typemedoc='MIVH' where typemedoc='HIV2B'; - remettre la clé étrangère alter table medicament add constraint fk foreign key (typemedoc) references typemedicament(typemedoc); Aïaïaïaïe... ton pb est bien compliqué... Heureusement qu'ils ont inventé EXECUTRE IMMEDIATE qui permet de régler le pb de l'utilisation des CREATE, ALTER, etc... qui sont des requêtes SQL, dans des fonctions et procédures, qui relèvent du PL/SQL. Voici la solution finale que je propose, un peu tirée par les cheveux, mais bon... : ---- script de création et d'insertion des tables de test ---------- create table typemedicament(typemedoc char(10) not null,libellemedoc char(10), constraint pk primary key(typemedoc)); create table medicament(nummedoc number(3) not null, typemedoc char(10), primary key(nummedoc), constraint fk foreign key (typemedoc) references typemedicament(typemedoc)); insert into typemedicament values ('HIV2B','blabla'); insert into typemedicament values ('SYN-B','blabla'); insert into medicament values (1,'HIV2B'); insert into medicament values (2,'SYN-B'); ---- Procédure UPDATE_TABLES qui supprime d'abord les contraintes de clés, fais les modifs, et remet les contraintes ----- --------------------------------- eh oui, c'était ça mon idée !!! tirée par les cheveux comme je l'ai dit ----------------------------- accept oldtype prompt 'Veuillez entrer l ancien type a modifier : '; HIV2B accept newtype prompt 'Veuillez entrer le nouveau type a enregistrer : '; MIHVA create or replace procedure update_tables is begin execute immediate 'alter table medicament drop constraint fk'; execute immediate 'alter table typemedicament drop constraint pk'; execute immediate 'update typemedicament set typemedoc=''&newtype'' where typemedoc=''&oldtype'''; execute immediate 'update medicament set typemedoc=''&newtype'' where typemedoc=''&oldtype'''; execute immediate 'alter table typemedicament add constraint pk primary key (typemedoc)'; execute immediate 'alter table medicament add constraint fk foreign key (typemedoc) references typemedicament(typemedoc)'; end; / execute update_tables; Et le tour est joué ! bien-sûr les choses seront plus simples si les gars d'oracle tiennent compte de ON UPDATE [CASCADE] !!! looool |
|
salue ! ça doit faire un sacré bye que t'attends ta réponse toi looooool eh bien j'ai quelques idées pour t'aider.
d'abord, le pb est un des pbs classiques d'oracle : on n'y respecte pas encore certains termes de SQL2 comme des références du genre ON UPDATE qui permettraient de modifier toutes les clés (primaires ou étrangères) dans les tables "filles" ou elles existent dès qu'on touche à la table mère... ç'aurait résolu ton pb en quelques lignes, du genre depuis la création des tables médoc là : create table typemedicament(typemedoc char(10) not null,libellemedoc char(10), primary key(typemedoc)); create table medicament(nummedoc number(3) not null, typemedoc char(10), primary key(nummedoc), foreign key(typemedoc) references typemedicament(typemedoc) ON UPDATE CASCADE); --- dommage, ça n'existe pas encore !!! l'autre truc embêtant, c'est qu'on peut pas introduire des CREATE, ALTER ou DROP dans les procédures et fonctions SQL. dommage, sinon on aurait fait un truc du genre : - supprimer la référence (clé étrangère), comme ceci alter table medicament drop constraint fk; - faire les modifs nécessaires update typemedicament set typemedoc='MIVH' where typemedoc='HIV2B'; update medicament set typemedoc='MIVH' where typemedoc='HIV2B'; - remettre la clé étrangère alter table medicament add constraint fk foreign key (typemedoc) references typemedicament(typemedoc); Aïaïaïaïe... ton pb est bien compliqué... Heureusement qu'ils ont inventé EXECUTRE IMMEDIATE qui permet de régler le pb de l'utilisation des CREATE, ALTER, etc... qui sont des requêtes SQL, dans des fonctions et procédures, qui relèvent du PL/SQL. Voici la solution finale que je propose, un peu tirée par les cheveux, mais bon... : ---- script de création et d'insertion des tables de test ---------- create table typemedicament(typemedoc char(10) not null,libellemedoc char(10), constraint pk primary key(typemedoc)); create table medicament(nummedoc number(3) not null, typemedoc char(10), primary key(nummedoc), constraint fk foreign key (typemedoc) references typemedicament(typemedoc)); insert into typemedicament values ('HIV2B','blabla'); insert into typemedicament values ('SYN-B','blabla'); insert into medicament values (1,'HIV2B'); insert into medicament values (2,'SYN-B'); ---- Procédure UPDATE_TABLES qui supprime d'abord les contraintes de clés, fais les modifs, et remet les contraintes ----- --------------------------------- eh oui, c'était ça mon idée !!! tirée par les cheveux comme je l'ai dit ----------------------------- accept oldtype prompt 'Veuillez entrer l ancien type a modifier : '; HIV2B accept newtype prompt 'Veuillez entrer le nouveau type a enregistrer : '; MIHVA create or replace procedure update_tables is begin execute immediate 'alter table medicament drop constraint fk'; execute immediate 'alter table typemedicament drop constraint pk'; execute immediate 'update typemedicament set typemedoc=''&newtype'' where typemedoc=''&oldtype'''; execute immediate 'update medicament set typemedoc=''&newtype'' where typemedoc=''&oldtype'''; execute immediate 'alter table typemedicament add constraint pk primary key (typemedoc)'; execute immediate 'alter table medicament add constraint fk foreign key (typemedoc) references typemedicament(typemedoc)'; end; / execute update_tables; Et le tour est joué ! bien-sûr les choses seront plus simples si les gars d'oracle tiennent compte de ON UPDATE [CASCADE] !!! looool |
Bonjour,
jaime pas le plsql |
La réponse ne servira peut-être par à Aragorn, mais elle m'est utile à moi... Surtout que le PL_SQL moins on aime, plus on a besoin d'aide.
Alors merci beaucoup à toi d'avoir pris le temps de répondre. |
Bonjour;
Bonne année 2008. Merci à jcvlad ça ma permis de trouver la solution à une erreur de compilation d'une requêtte PL/SQL contenant un DROP Table. |
Résultats pour Une Procedure stockée sour Oracle en PL/SQL
Résultats pour Une Procedure stockée sour Oracle en PL/SQL
Résultats pour Une Procedure stockée sour Oracle en PL/SQL
Résultats pour Une Procedure stockée sour Oracle en PL/SQL
Résultats pour Une Procedure stockée sour Oracle en PL/SQL
Résultats pour Une Procedure stockée sour Oracle en PL/SQL
Résultats pour Une Procedure stockée sour Oracle en PL/SQL