2016-10-05 6 views
0

Могу ли я использовать «выполнить немедленный» для цикла? Мне нужно создать комбинации значений в pl/sql. Об этом я собираюсь назвать серию вложенной динамики для цикла.Выполнять немедленную петлю PL/SQL

Пример: колонка 1 имеют эти значения: A, B столбец 2 имеют эти значения: C, D, E

Я хотел бы генерировать эту комбинацию: AC/AD/AE/BC/BD/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 instant' обрабатывает полные операторы SQL и PL/SQL-блоки, и они не обмениваются областью переменных с вызывающей процедурой. Вам нужно будет сгенерировать целое 'declare ... begin ... end;' block, передать в свои переменные связывания и передать результат в виде массива или курсора ref. Кроме того, генерация операторов в такой партии, как правило, сокращает кеш-память 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; 

 Смежные вопросы

  • Нет связанных вопросов^_^