Det är tre saker som är fel med din dynamiska SQL.
- EXECUTE IMMEDIATE är inte en funktion:den korrekta syntaxen är
execute immediate '<<query>>' into <<variable>>
. - En INSERT-sats tar en VALUES-sats eller en SELECT men inte båda. SELECT skulle vara väldigt fel i det här fallet. Observera också att det är VALUES inte VALUE.
- COLUMN_NAME är en bokstavlig sträng i dynamisk SQL så den måste stå inom citattecken. Men eftersom SQL-satsen i sig är en sträng måste citattecken i dynamiska strängar escapes så det bör vara `'''||kolumnnamn||'''.
Så den korrigerade versionen kommer att se ut ungefär så här
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;
/
Dynamisk SQL är svårt eftersom det förvandlar kompileringsfel till runtime-fel. Det är bra att först skriva satserna som statisk SQL. När du har fått den grundläggande syntaxen rätt kan du konvertera den till dynamisk SQL.