Има три неща, които не са наред с вашия динамичен SQL.
- EXECUTE IMMEDIATE не е функция:правилният синтаксис е
execute immediate '<<query>>' into <<variable>>
. - Инструкция INSERT приема клауза VALUES или SELECT, но не и двете. SELECT би било много грешно в този случай. Също така имайте предвид, че това е VALUES, а не VALUE.
- COLUMN_NAME е низов литерал в динамичния SQL, така че трябва да бъде в кавички. Но тъй като самият SQL оператор е низ, кавичките в динамичните низове трябва да бъдат екранирани, така че трябва да бъде `''''||column_name||''''.
Така че коригираната версия ще изглежда така
declare
Cursor C_TABLE is
select trim(table_name) as table_name
from all_tables
where table_name in ('T1', 'T2', 'T3');
V_ROWNUM number;
begin
for m in C_TABLE
loop
for i in ( select column_name
from (
select c.column_name
from all_tab_columns c
where c.table_name = m.table_name
and c.owner = 'owner1'
)
)
loop
execute immediate 'select count(*) from ' || m.table_name into V_ROWNUM;
execute immediate 'insert into MY_table values ( ''' || i.column_name || ''', ' || V_ROWNUM || ')';
end loop;
end loop;
end;
/
Динамичният SQL е труден, защото превръща грешките при компилиране в грешки по време на изпълнение. Добра практика е първо да напишете операторите като статичен SQL. След като разберете правилно основния синтаксис, можете да го конвертирате в динамичен SQL.