Давайте сделаем это по одному шагу за раз. Во-первых, статический код, который работает:
SQL> declare
2 foo1 number:=111;
3 foo2 number:=222;
4 begin
5 dbms_output.put_line(foo1);
6 end;
7 /
111
Теперь, если вы хотите ВЫПОЛНИТЬ НЕМЕДЛЕННЫЙ текст, вы должны поместить весь код в текст:
SQL> declare
2 l_code_block varchar2(4000) := '
3 declare
4 foo1 number:=111;
5 foo2 number:=222;
6 begin
7 dbms_output.put_line(foo2);
8 end;
9 ';
10 begin
11 execute immediate l_code_block;
12 end;
13 /
222
Следующий шаг: если мы хотим динамически изменить значение , мы можем и должны использовать «переменную связывания».
SQL> declare
2 l_code_block varchar2(4000) := '
3 declare
4 foo1 number:=111;
5 foo2 number:=222;
6 begin
7 dbms_output.put_line(:n);
8 end;
9 ';
10 begin
11 execute immediate l_code_block using 1;
12 end;
13 /
1
Но если мы попытаемся использовать переменную связываниячтобы изменить код , он не работает.
SQL> declare
2 l_code_block varchar2(4000) := '
3 declare
4 foo1 number:=111;
5 foo2 number:=222;
6 begin
7 dbms_output.put_line(foo:n);
8 end;
9 ';
10 begin
11 execute immediate l_code_block using 1;
12 end;
13 /
...
Error report -
ORA-06550: line 6, column 25:
PLS-00103: Encountered the symbol "" when expecting one of the following
...
Поэтому, если мы хотим динамически изменить код , мы должны выполнить ЗАМЕНУ натекст.
SQL> declare
2 l_code_block varchar2(4000) := '
3 declare
4 foo1 number:=111;
5 foo2 number:=222;
6 begin
7 dbms_output.put_line(foo#N#);
8 end;
9 ';
10 begin
11 execute immediate replace(l_code_block,'#N#',1);
12 end;
13 /
111
Наконец, вот ваш цикл:
SQL> declare
2 l_code_block varchar2(4000) := '
3 declare
4 foo1 number:=111;
5 foo2 number:=222;
6 begin
7 dbms_output.put_line(foo#N#);
8 end;
9 ';
10 begin
11 for i in 1..2 loop
12 execute immediate replace(l_code_block,'#N#',i);
13 end loop;
14 end;
15 /
111
222
Пожалуйста, поймите, я пытаюсь ответить на ваш вопрос в том виде, в котором он был задан. Этого «динамического» подхода следует избегать всякий раз, когда это возможно, и это почти всегда возможно. Мы должны были бы вернуться к бизнес-требованиям, чтобы рекомендовать наиболее подходящую технику.
С уважением, Стью Эштон