Ci sono tre cose che non vanno nel tuo SQL dinamico.
- EXECUTE IMMEDIATE non è una funzione:la sintassi corretta è
execute immediate '<<query>>' into <<variable>>
. - Un'istruzione INSERT accetta una clausola VALUES o una SELECT ma non entrambe. SELECT sarebbe molto sbagliato in questo caso. Tieni inoltre presente che è VALUES non VALUE.
- COLUMN_NAME è una stringa letterale nell'SQL dinamico, quindi deve essere tra virgolette. Ma poiché l'istruzione SQL è essa stessa una stringa, le virgolette nelle stringhe dinamiche devono essere messe in escape, quindi dovrebbe essere `'''||column_name||'''.
Quindi la versione corretta sarà simile a questa
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;
/
Dynamic SQL è difficile perché trasforma gli errori di compilazione in errori di runtime. È buona norma scrivere prima le istruzioni come SQL statico. Una volta ottenuta la sintassi di base corretta, puoi convertirla in SQL dinamico.