Er zijn drie dingen mis met je dynamische SQL.
- IMMEDIATE UITVOEREN is geen functie:de juiste syntaxis is
execute immediate '<<query>>' into <<variable>>
. - Een INSERT-instructie heeft een VALUES-clausule of een SELECT nodig, maar niet beide. SELECT zou in dit geval erg fout zijn. Houd er ook rekening mee dat het VALUES is en niet VALUE.
- COLUMN_NAME is een letterlijke tekenreeks in de dynamische SQL, dus het moet tussen aanhalingstekens staan. Maar omdat de SQL-instructie zelf een tekenreeks is, moeten aanhalingstekens in dynamische tekenreeksen worden ontsnapt, dus het zou `'''||column_name||''' moeten zijn.
Dus de gecorrigeerde versie ziet er ongeveer zo uit
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;
/
Dynamische SQL is moeilijk omdat het compilatiefouten in runtime-fouten verandert. Het is een goede gewoonte om de instructies eerst als statische SQL te schrijven. Zodra u de basissyntaxis goed heeft, kunt u deze omzetten in dynamische SQL.