Es gibt drei Dinge, die mit Ihrem dynamischen SQL nicht stimmen.
- EXECUTE IMMEDIATE ist keine Funktion:Die richtige Syntax ist
execute immediate '<<query>>' into <<variable>>
. - Eine INSERT-Anweisung akzeptiert eine VALUES-Klausel oder eine SELECT-Klausel, aber nicht beides. SELECT wäre in diesem Fall sehr falsch. Beachten Sie auch, dass es sich um WERTE und nicht um WERT handelt.
- COLUMN_NAME ist ein Zeichenfolgenliteral im dynamischen SQL, daher muss es in Anführungszeichen gesetzt werden. Aber da die SQL-Anweisung selbst ein String ist, müssen Anführungszeichen in dynamischen Strings maskiert werden, also sollte es `'''||column_name||'''. lauten
Die korrigierte Version sieht also etwa so aus
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;
/
Dynamisches SQL ist schwierig, weil es Kompilierungsfehler in Laufzeitfehler umwandelt. Es empfiehlt sich, die Anweisungen zuerst als statisches SQL zu schreiben. Sobald Sie die grundlegende Syntax richtig verstanden haben, können Sie sie in dynamisches SQL umwandeln.