sql >> Databáze >  >> RDS >> Oracle

Jak deklarovat číselnou proměnnou, kde mohu uložit počet tabulky v mé smyčce

S vaším dynamickým SQL nejsou v pořádku tři věci.

  1. EXECUTE IMMEDIATE není funkce:správná syntaxe je execute immediate '<<query>>' into <<variable>> .
  2. Příkaz INSERT přebírá klauzuli VALUES nebo SELECT, ale ne obojí. SELECT by byl v tomto případě velmi špatný. Všimněte si také, že jde o HODNOTY, nikoli HODNOTY.
  3. COLUMN_NAME je řetězcový literál v dynamickém SQL, takže musí být v uvozovkách. Ale protože příkaz SQL je sám o sobě řetězec, uvozovky v dynamických řetězcích musí být escapovány, takže by měl být `'''||název_sloupce||'''.

Takže opravená verze bude vypadat nějak takto

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

Dynamické SQL je obtížné, protože mění chyby kompilace na chyby za běhu. Je dobrým zvykem psát příkazy nejprve jako statické SQL. Jakmile budete mít správnou základní syntaxi, můžete ji převést na dynamické SQL.



  1. Jak funguje LOAD_FILE() v MariaDB

  2. MySQL Visual Studio 2015 Již máte použitelné připojení

  3. Dotaz na uloženou proceduru pro její názvy parametrů a typy

  4. Java String - Načítání znaků jiných jazyků z mysql - Jsou data kompletní?