Une Procedure stockée sour Oracle en PL/SQL

Fermé
Aragorn - 20 nov. 2003 à 10:20
 sphinxvallience - 7 juil. 2010 à 11:10
Bonjour,

alors voila, j'ai une petite procedure a réaliser (notre première) en PL/SQL sous oracle.

le principe est assez simple : il y a 2 tables sous oracle : 1 table TYPEMEDICAMENT avec en clé primaire TypeMedicament, et un champ LibelleMedicament ; une autre table MEDICAMENT avec en clé primaire NumMedicament, 1 champ NomMedicament, et une clé etrangere vers la clé primaire de la table TYPEMEDICAMENT : Typemedicament.

le but du probleme est de créer une procedure stockée en SQL permettant de changer des codes types des medicaments dans la BD : exemple :
ancien code (=TypeMedicament) : HIV2B, nouveau : MIVH ; ancien SYN-B, nouveau : GIVHA, ....

plusieurs niveaux sont envisagables : ou bien les anciens et nouveaux codes sont placés en parametres, ou bien ils sont saisis, ou bien encore on cré un table où l'on ira chercher les modofication

merci bcp par avance pour votre aide, et au plaisir de pouvoir vous aidez aussi dans d'autres langages de prog ;)

6 réponses

jcvlad Messages postés 7 Date d'inscription mercredi 12 septembre 2007 Statut Membre Dernière intervention 17 septembre 2007 14
12 sept. 2007 à 17:46
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
11
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
2
sphinxvallience
7 juil. 2010 à 11:10
Cool Frangin ta soluce - cela m'a permis de venir à bout d'un soucis ; le fait de pouvoir intégrer des LDD (create, alter, drop) dans des procédures pl
0
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.
2
Personne ?
1

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
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.
1
Ce ne serait pas plus simple:
* d'insérer un nouveau record dans typemedicament, avec le nouveau code
* mettre à jour les records dans la table medicament
* supprimer l'ancien record dans la table typemedicament
?
Cela évite de dropper la contrainte référentielle...
Mais ce n'est qu'un avis...
0
dedi > exar
18 mars 2009 à 16:16
Bonjour!
j'ai créé une procédure sur forms et je récupère le nom de la procédure dans une variable et j'aimerai exécuter ma procédure via la variable?
NB la procédure n'est stockée dans la base mais elle est coté forms
Est ce que qlq'1 peut m'aider?
0
Bonjour,
jaime pas le plsql
-5