2016-10-05 1 views
0

Puis-je utiliser "exécuter immédiat" avec pour cycle? J'ai besoin de générer une combinaison de valeurs en pl/sql. À propos de cela, je pense à appeler une série de dynamiques imbriquées pour le cycle.Exécuter une boucle immédiate PL/SQL

Exemple: colonne 1 ont ces valeurs: A, B colonne 2 ont cette valeur: C, D, E

Je souhaite générer cette combinaison: AC/AD/AE/BC/BD/BE

Je pense obtenir cela comme:

for i in 1..count.column1 
    for j in 1..count.column2 
     dbms_output.put_line(column1.value(i)||'-'||column1.value(j)); 
end loop; 
end loop; 

en raison de je ne sais pas le nombre de colonne (variable), puis-je utiliser un execute immédiat?

declare 
sql_stmt varchar2(200); 
begin 

sql_stmt := 'for i in 1..count.column1 for j in 1..count.column2 dbms_output.put_line(column1.value(i)||'-'||column1.value(j)); end loop; end loop'; 
execute immediate sql_stmt; 

end; 

Mais j'ai l'erreur ORA-06512. Comment puis-je faire cela? :)

Merci d'avance pour votre suggestion!

+0

Pas facilement. Les processus 'execute immediate' complètent les instructions SQL et les blocs PL/SQL, et ceux-ci ne partagent pas la portée variable avec la procédure appelante. Vous devez générer tout le bloc 'declare ... begin ... end;', passer vos variables de liaison et transmettre le résultat sous la forme d'un tableau ou d'un curseur ref. De plus, la génération de requêtes en batch a tendance à détruire le cache du curseur d'Oracle. –

Répondre

2

Si vous voulez vraiment faire cela lentement en PL/SQL en utilisant des boucles imbriquées, vous n'avez rien besoin d'être dynamique. Vous voulez juste voulez

for i in (select distinct column1 
      from your_table) 
loop 
    for j in (select distinct column2 
       from your_table) 
    loop 
    dbms_output.put_line(i.column1 || j.column2); 
    end loop; 
end loop; 

Dans la grande majorité des cas, cependant, vous seriez mieux de faire cela dans SQL

with col1 as (
    select distinct col1 val 
    from your_table 
), 
col2 as (
    select distinct col2 val 
    from your_table 
) 
select col1.val || col2.val 
    from col1 
     cross join col2 
0

Je pense que vous pouvez facilement obtenir les combinaisons utilisant cette instruction select .

SELECT DISTINCT t1.col1, t2.col2 
    FROM table_name t1, table_name t2;