2016-10-05 7 views
0

サイクルで「即時実行」を使用できますか? 私はpl/sqlに値の組み合わせを生成する必要があります。 これについて私はサイクルのために一連のネストされたダイナミクスを呼び出すことを考えています。即時ループPL/SQLを実行

例: 列1は、この値を有する:C、D、E

私はこの組み合わせを生成したい: AC/AD/AE/BC/BD、B 列2は、この値Aを有します

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; 

私はすぐに実行 は、私が使用でき、列(変数)の数を知らないによる:/私はこのようなを取得するために思っています

BE?

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; 

しかし、エラーORA-06512があります。 どうすればいいですか? :)

ご協力ありがとうございました!

+0

簡単にはありません。 'execute immediate'プロセスは、完全なSQL文とPL/SQLブロックを処理しますが、これらは呼び出し側プロシージャと変数スコープを共有しません。 'declare ... begin ... end;'ブロック全体を生成し、バインド変数を渡し、結果を配列または参照カーソルとして渡す必要があります。また、このような文をバッチで生成すると、Oracleのカーソル・キャッシュを細断処理す​​る傾向があります。 –

答えて

2

ネストしたループを使用してPL/SQLで実際にこの処理をゆっくり実行したい場合は、動的である必要はありません。あなただけの大多数のケースでは

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; 

をしたいと思います、しかし、あなたは私はあなたが簡単にこのSELECT文を使用して組み合わせを得ることができると思い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

でこれをやったほうが良いと思います。

SELECT DISTINCT t1.col1, t2.col2 
    FROM table_name t1, table_name t2; 
関連する問題