sql >> Databasteknik >  >> RDS >> Oracle

Hur man deklarerar en talvariabel där jag kan spara tabellens antal i min loop

Det är tre saker som är fel med din dynamiska SQL.

  1. EXECUTE IMMEDIATE är inte en funktion:den korrekta syntaxen är execute immediate '<<query>>' into <<variable>> .
  2. En INSERT-sats tar en VALUES-sats eller en SELECT men inte båda. SELECT skulle vara väldigt fel i det här fallet. Observera också att det är VALUES inte VALUE.
  3. COLUMN_NAME är en bokstavlig sträng i dynamisk SQL så den måste stå inom citattecken. Men eftersom SQL-satsen i sig är en sträng måste citattecken i dynamiska strängar escapes så det bör vara `'''||kolumnnamn||'''.

Så den korrigerade versionen kommer att se ut ungefär så här

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

Dynamisk SQL är svårt eftersom det förvandlar kompileringsfel till runtime-fel. Det är bra att först skriva satserna som statisk SQL. När du har fått den grundläggande syntaxen rätt kan du konvertera den till dynamisk SQL.



  1. Deklarera variabel MySQL-utlösare

  2. UNION ALL vs OR-villkor i SQL-serverfrågan

  3. Är raderna låsta i ordning i en SELECT ... ORDER BY ... FOR UPDATE-sats?

  4. Jquery datepicker med Ajax fungerar inte