Oracle
 sql >> база данни >  >> RDS >> Oracle

Как да декларирам числова променлива, където мога да запазя броя на таблицата в моя цикъл

Има три неща, които не са наред с вашия динамичен SQL.

  1. EXECUTE IMMEDIATE не е функция:правилният синтаксис е execute immediate '<<query>>' into <<variable>> .
  2. Инструкция INSERT приема клауза VALUES или SELECT, но не и двете. SELECT би било много грешно в този случай. Също така имайте предвид, че това е VALUES, а не VALUE.
  3. COLUMN_NAME е низов литерал в динамичния SQL, така че трябва да бъде в кавички. Но тъй като самият SQL оператор е низ, кавичките в динамичните низове трябва да бъдат екранирани, така че трябва да бъде `''''||column_name||''''.

Така че коригираната версия ще изглежда така

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

Динамичният SQL е труден, защото превръща грешките при компилиране в грешки по време на изпълнение. Добра практика е първо да напишете операторите като статичен SQL. След като разберете правилно основния синтаксис, можете да го конвертирате в динамичен SQL.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да разберете дали дадена стойност съществува в рамките на VARRAY

  2. Декларативен подход за ограничаване на диапазони от данни в табл

  3. Колона нееднозначно дефинирана

  4. Oracle SQL:Колона не е разрешена

  5. Защо получавам отворена транзакция, когато просто избирам от изглед на база данни?