Oracle
 sql >> Datenbank >  >> RDS >> Oracle

So deklarieren Sie eine Zahlenvariable, in der ich die Anzahl der Tabellen in meiner Schleife speichern kann

Es gibt drei Dinge, die mit Ihrem dynamischen SQL nicht stimmen.

  1. EXECUTE IMMEDIATE ist keine Funktion:Die richtige Syntax ist execute immediate '<<query>>' into <<variable>> .
  2. Eine INSERT-Anweisung akzeptiert eine VALUES-Klausel oder eine SELECT-Klausel, aber nicht beides. SELECT wäre in diesem Fall sehr falsch. Beachten Sie auch, dass es sich um WERTE und nicht um WERT handelt.
  3. COLUMN_NAME ist ein Zeichenfolgenliteral im dynamischen SQL, daher muss es in Anführungszeichen gesetzt werden. Aber da die SQL-Anweisung selbst ein String ist, müssen Anführungszeichen in dynamischen Strings maskiert werden, also sollte es `'''||column_name||'''.
  4. lauten

Die korrigierte Version sieht also etwa so aus

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

Dynamisches SQL ist schwierig, weil es Kompilierungsfehler in Laufzeitfehler umwandelt. Es empfiehlt sich, die Anweisungen zuerst als statisches SQL zu schreiben. Sobald Sie die grundlegende Syntax richtig verstanden haben, können Sie sie in dynamisches SQL umwandeln.