Oracle
 sql >> Database >  >> RDS >> Oracle

Come dichiarare una variabile numerica in cui posso salvare il conteggio della tabella nel mio ciclo

Ci sono tre cose che non vanno nel tuo SQL dinamico.

  1. EXECUTE IMMEDIATE non è una funzione:la sintassi corretta è execute immediate '<<query>>' into <<variable>> .
  2. Un'istruzione INSERT accetta una clausola VALUES o una SELECT ma non entrambe. SELECT sarebbe molto sbagliato in questo caso. Tieni inoltre presente che è VALUES non VALUE.
  3. COLUMN_NAME è una stringa letterale nell'SQL dinamico, quindi deve essere tra virgolette. Ma poiché l'istruzione SQL è essa stessa una stringa, le virgolette nelle stringhe dinamiche devono essere messe in escape, quindi dovrebbe essere `'''||column_name||'''.

Quindi la versione corretta sarà simile a questa

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;
/

Dynamic SQL è difficile perché trasforma gli errori di compilazione in errori di runtime. È buona norma scrivere prima le istruzioni come SQL statico. Una volta ottenuta la sintassi di base corretta, puoi convertirla in SQL dinamico.