Select dynamique avec execute immediate
Bonjour à tous,
Je souhaitait faire une procédure générique en pls-sql qui mes en majuscule toute les valeurs d'un champ d'une table. Je ne maîtrise pas bien les select dynamique.
Je écrit cette procédure sur isql *sql, mais c'est un peu difficile pour débogguer car je ne peux pas contrôler ce qu'il y a dans mes variable
dbms_outpu.put_line('.........') et print ne fonctionne pas....
La procédure arrive à se compiler, mais à l'exécution de cette procédure j'ai une erreur de type de boucle. Apparament ça boucle trop, Portant je récupère le nombre de d'enregistrement de la table. avec un count * de la table mais avec execute immediate je ne c'est pas ce qui me récupère dans mon into, j'avais mis un alias sur le count *, mais j'ai l'impression qui me recupère mal nbFila.
Voici ma procédure
Citation:
create or replace procedure campoMajusculo(tabla in varchar2, campo in varchar2)
is
reqContador varchar2(50);
reqSelect varchar2(50);
reqUpdate varchar2(50);
nbFila integer;
campoTabla varchar2(50);
Begin
reqContador := 'select count(*) as nbFila from ' || tabla ;
EXECUTE IMMEDIATE reqContador into nbFila;
// j'ai essayer aussi en commençant à 0, mais ça change rien,
//même message d'erreur à l'exécution
For fila in 1..nbFila
LOOP
reqSelect := 'select ' || campo || ' from ' || tabla;
EXECUTE IMMEDIATE reqSelect into campoTabla;
campoTabla := upper(campoTabla);
reqUpdate := 'update ' || tabla || 'set ' || campo || '=' || campoTabla;
EXECUTE IMMEDIATE reqUpdate;
END LOOP;
End;
ça compile bien mais quand j'exécute ça bug
Citation:
begin
campoMajusculo('Prueba','proyecto');
end;
begin
*
ERROR en línea 1:
ORA-01422: la recuperación exacta devuelve un número mayor de filas que el solicitado
ORA-06512: en "DAV79.CAMPOMAJUSCULO", línea 23
ORA-06512: en línea 2
Je voudrais savoir si quelqu'un aurait une solution à mon problème, comment je peux vérifier ce qu'il y a dans le into.
Il y a t'il possibilité de construire un curseur de la même manière q'un select dynamique.
Citation:
ex : reqCur = 'curDyn CURSOR IS select ' || campo || ' from ' || tabla;
execute immediate into curDyn;
for fila in curDyn
loop
campo = fila.campo;
..........................;
end loop
Mon problème est assez urgent, car je doit rendre un projet de base de donnée en ajoutant cette fonctionnalité.
Merci d'avance pour votre aide.
dav79