Der er tre ting galt med din dynamiske SQL.
- EXECUTE IMMEDIATE er ikke en funktion:den korrekte syntaks er
execute immediate '<<query>>' into <<variable>>
. - En INSERT-sætning tager en VALUES-sætning eller en SELECT, men ikke begge. SELECT ville være meget forkert i dette tilfælde. Bemærk også, at det er VALUES ikke VALUE.
- COLUMN_NAME er en streng bogstavelig i den dynamiske SQL, så den skal stå i anførselstegn. Men fordi SQL-sætningen i sig selv er en streng, skal anførselstegn i dynamiske strenge escapes, så det skal være `'''||kolonne_navn||'''.
Så den korrigerede version vil se nogenlunde sådan her ud
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 er svært, fordi det gør kompileringsfejl til runtime-fejl. Det er god praksis at skrive sætningerne først som statisk SQL. Når du har fået den grundlæggende syntaks rigtig, kan du konvertere den til dynamisk SQL.