Hay tres cosas mal con su SQL dinámico.
- EXECUTE IMMEDIATE no es una función:la sintaxis adecuada es
execute immediate '<<query>>' into <<variable>>
. - Una declaración INSERT toma una cláusula VALUES o SELECT pero no ambas. SELECCIONAR estaría muy mal en este caso. También tenga en cuenta que son VALORES, no VALOR.
- COLUMN_NAME es un literal de cadena en SQL dinámico, por lo que debe estar entre comillas. Pero debido a que la instrucción SQL es en sí misma una cadena, las comillas en cadenas dinámicas deben escaparse, por lo que debe ser `'''||column_name||''''.
Entonces, la versión corregida se verá así
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;
/
El SQL dinámico es difícil porque convierte los errores de compilación en errores de tiempo de ejecución. Es una buena práctica escribir las sentencias primero como SQL estático. Una vez que tenga la sintaxis básica correcta, puede convertirla en SQL dinámico.