S vaším dynamickým SQL nejsou v pořádku tři věci.
- EXECUTE IMMEDIATE není funkce:správná syntaxe je
execute immediate '<<query>>' into <<variable>>
. - Příkaz INSERT přebírá klauzuli VALUES nebo SELECT, ale ne obojí. SELECT by byl v tomto případě velmi špatný. Všimněte si také, že jde o HODNOTY, nikoli HODNOTY.
- COLUMN_NAME je řetězcový literál v dynamickém SQL, takže musí být v uvozovkách. Ale protože příkaz SQL je sám o sobě řetězec, uvozovky v dynamických řetězcích musí být escapovány, takže by měl být `'''||název_sloupce||'''.
Takže opravená verze bude vypadat nějak takto
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;
/
Dynamické SQL je obtížné, protože mění chyby kompilace na chyby za běhu. Je dobrým zvykem psát příkazy nejprve jako statické SQL. Jakmile budete mít správnou základní syntaxi, můžete ji převést na dynamické SQL.