sql >> Base de Datos >  >> RDS >> Oracle

Cómo declarar una variable numérica donde puedo guardar el conteo de la tabla en mi bucle

Hay tres cosas mal con su SQL dinámico.

  1. EXECUTE IMMEDIATE no es una función:la sintaxis adecuada es execute immediate '<<query>>' into <<variable>> .
  2. 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.
  3. 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.