Bonjour,
En SQL, que faut-il mettre dans la définition d’une procédure stockée pour pouvoir l’appeler, par un CALL, indifféremment par son nom de routine ou son nom système ?
Edit :
Ma connexion sur ACS est en NAMING SYSTEM et non pas SQL. Ceci afin d’utiliser *LIBL.
Quand je tente d’appeler, j’ai une erreur système.
Drop type arrayChar2;
create type arrayChar2 as varchar(2) array[100];
create or replace procedure NQFC004S (
in p_uuidPeriod char(32),
in p_coduex decimal(8, 0),
in p_nbatim arrayChar2,
in p_nescal arrayChar2,
in p_etiquette arrayChar2)
specific NQFC004S
language sql
modifies sql data
set option dbgview = *source , output=*print
P1: Begin
declare v_compteur smallint default 1;
declare v_nbElement smallint;
declare v_uuidEntrance char(32);
declare v_uuidProperty char(32);
declare v_testExiste smallint;
declare exit handler for sqlstate '75000'
resignal sqlstate '75000' set message_text='Property not found.';
declare exit handler for sqlstate '75001'
resignal sqlstate '75001' set message_text='Entrance not found.';
-- On récupère le nombre d'éléments reçus
set v_nbElement = cardinality(p_nescal);
-- On vérifie que l'UE reçue est valide
if not exists (select uidsap
from BNUCOP where coduex=p_coduex) then
signal sqlstate '75000';
end if;
-- On vérifie que les entrées reçues sont valides
set v_compteur = 1;
while (v_compteur <= v_nbElement) do
-- On vérifie que l'UUID existe
if not exists (select uuid from MIRUUID
where (typuuid, coduex, nbatim, nescal) =
('E', p_coduex, p_nbatim[v_compteur],
p_nescal[v_compteur])) then
signal sqlstate '75001';
end if;
set v_compteur = v_compteur + 1;
end while;
-- On récupère l'uuid de l'UE
select uidsap into v_uuidProperty from BNUCOP where coduex=p_coduex;
-- On marque toutes les lignes de cette UE pour identifier à la fin celles
-- qui doivent être supprimées
update NQFCBEEP set tprgup = 'TO_DELETE'
where (biluid, ptyuid) = (p_uuidPeriod, v_uuidProperty);
set v_compteur = 1;
-- On boucle sur les éléments reçus pour les ajouter à NQFCBEEP
while (v_compteur <= v_nbElement) do
-- On récupère l'uuid de l'entrée
select uuid into v_uuidEntrance from MIRUUID
where (typuuid, coduex, nbatim, nescal) =
('E', p_coduex, p_nbatim[v_compteur], p_nescal[v_compteur]);
set v_testExiste = 0;
--On regarde si l'enregistrement existe déjà
select 1 into v_testExiste from NQFCBEEP
where (biluid, ptyuid, entuid) =
(p_uuidPeriod, v_uuidProperty, v_uuidEntrance);
if v_testExiste = 0 then
-- On ajoute l'enregistrement dans NQFCBEEP
insert into NQFCBEEP (biluid, ptyuid, entuid, cenerj, tprgcr)
values (p_uuidPeriod, v_uuidProperty, v_uuidEntrance,
p_etiquette[v_compteur], 'QFC004S');
else
-- Mise à jour de NQFCBEEP si l'enregistrement existe
update NQFCBEEP
set cenerj = p_etiquette[v_compteur], tprfup = user,
tprgup = 'QFC004S'
where (biluid, ptyuid, entuid) =
(p_uuidPeriod, v_uuidProperty, v_uuidEntrance);
end if;
set v_compteur = v_compteur + 1;
end while;
-- On supprime les enregistrements qui n'ont pas été modifiés/créés
delete NQFCBEEP where (biluid, ptyuid, tprgup) =
(p_uuidPeriod, v_uuidProperty, 'TO_DELETE');
end P1;
https://question.ibmiiste.info/?qa=blob&qa_blobid=6844304600138213234
Cordialement,
Olivier.