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

Dynamiczne tworzenie i wykonywanie poleceń sql w Oracle

VARCHAR2 Oracle traktuje puste ciągi jako NULL .
Więc

if tname != '' then

jest taki sam jak

if tname != NULL then

co zwróci NULL zamiast TRUE ponieważ nie jest zdefiniowany.

Możesz sprawdzić NULL przez tname IS NOT NULL .

table_name jest obowiązkowe w user_tables jednak, więc nie ma potrzeby tego sprawdzania.

Jeszcze dwie rzeczy:

  1. Sprawdź %NOTFOUND natychmiast po pobraniu
  2. Użyj referencji do kolumn dla deklaracji zmiennych, jeśli to możliwe ( user_tables.table_name%TYPE )

Twój kod może wyglądać tak:

DECLARE
  tname user_tables.table_name%TYPE;
  CURSOR ctable IS SELECT table_name FROM user_tables;
BEGIN
  OPEN ctable;
  LOOP
    FETCH ctable INTO tname;
    EXIT WHEN ctable%NOTFOUND;
    EXECUTE IMMEDIATE 'drop table ' || tname;
  END LOOP;
  CLOSE ctable;
END;

Możesz także użyć ukrytego kursora dla lepszej czytelności:

BEGIN
  FOR cur IN ( SELECT table_name FROM user_tables ) LOOP
    EXECUTE IMMEDIATE 'drop table ' || cur.table_name;
  END LOOP;
END;



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Czy antysprzężenie jest bardziej wydajne niż lewe sprzężenie zewnętrzne?

  2. ORA-30926:nie można uzyskać stabilnego zestawu wierszy w tabelach źródłowych

  3. Kombinacja Oracle SQL MIN i MAX z tej samej tabeli

  4. Jak usunąć duplikaty z listy rozdzielanej przecinkami według wyrażenia regularnego w Oracle, ale nie chcę duplikatów wartości?

  5. Kalkulacja średnich kosztów zapasów w SQL