Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Jak zadeklarować zmienną liczbową, w której mogę zapisać liczbę tabel w mojej pętli?

Z dynamicznym SQL są trzy rzeczy.

  1. EXECUTE IMMEDIATE nie jest funkcją:prawidłowa składnia to execute immediate '<<query>>' into <<variable>> .
  2. Instrukcja INSERT przyjmuje klauzulę VALUES lub SELECT, ale nie obie. W tym przypadku SELECT byłby bardzo błędny. Pamiętaj też, że to VALUES, a nie VALUE.
  3. COLUMN_NAME to literał ciągu w dynamicznym SQL, więc musi być ujęty w cudzysłów. Ale ponieważ instrukcja SQL jest sama w sobie łańcuchem, cudzysłowy w dynamicznych łańcuchach muszą być zmienione, więc powinno to być `'''||nazwa_kolumny||'''.

Tak więc poprawiona wersja będzie wyglądać mniej więcej tak

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

Dynamiczny SQL jest trudny, ponieważ zamienia błędy kompilacji w błędy czasu wykonywania. Dobrą praktyką jest pisanie instrukcji najpierw jako statycznego SQL. Gdy już opanujesz podstawową składnię, możesz przekonwertować ją na dynamiczny 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. tabela przestawna Oracle - jak zamienić pozycje wierszy na kolumny

  2. Wyrażenie tabeli Oracle na odbiór i zamówienie

  3. Nieprawidłowy identyfikator SQL

  4. Liczba SQL dla kolumny daty

  5. Jak uzyskać wiek w latach, miesiącach i dniach za pomocą Oracle?