2016-10-05 5 views
0

주기에 "즉시 실행"을 사용할 수 있습니까? pl/sql에 값 조합을 생성해야합니다. 이것에 대해서 순환을 위해 일련의 중첩 된 다이내믹을 호출 할 생각입니다.즉시 실행 PL/SQL

예 : 1 열이 값이 : C, D, E

I이 결합 생성하고자

: AC/AD/AE가/BC를/BD를 B 컬럼 2는이 값을 가질/

나는이 같은 얻기 위해 생각하고 BE :

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; 

을 내가 열 (변수)의 번호를 모르는 때문에, 가 나는 즉시 실행 사용할 수 있습니까?

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; 

을 싶어하지만, 당신은 당신이 쉽게 선택 문을 사용하여 조합을 얻을 수 있다고 생각 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;