Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Como declarar uma variável numérica onde posso salvar a contagem da tabela no meu loop


Há três coisas erradas com seu SQL dinâmico.
  1. EXECUTE IMMEDIATE não é uma função:a sintaxe apropriada é execute immediate '<<query>>' into <<variable>> .
  2. Uma instrução INSERT usa uma cláusula VALUES ou um SELECT, mas não ambos. SELECT seria muito errado neste caso. Observe também que são VALUES e não VALUE.
  3. COLUMN_NAME é uma string literal no SQL dinâmico, portanto, precisa estar entre aspas. Mas como a instrução SQL é uma string, aspas em strings dinâmicas precisam ser escapadas, então deve ser `'''||column_name||'''.

Então a versão corrigida será algo assim
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;
/

O SQL dinâmico é difícil porque transforma erros de compilação em erros de tempo de execução. É uma boa prática escrever as instruções primeiro como SQL estático. Uma vez que você tenha a sintaxe básica correta, você pode convertê-la em SQL dinâmico.