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

Динамично създаване и изпълнение на sql команди в Oracle

VARCHAR2 на Oracle третира празните низове като NULL .
И така

if tname != '' then

е същото като

if tname != NULL then

което ще върне NULL вместо TRUE тъй като не е дефиниран.

Можете да проверите за NULL от tname IS NOT NULL .

table_name е задължително в user_tables въпреки това, така че няма нужда от тази проверка.

Още две неща:

  1. Проверете за %NOTFOUND веднага след извличане
  2. Използвайте препратки към колони за декларации на променливи, ако е възможно ( user_tables.table_name%TYPE )

Така че вашият код може да изглежда така:

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;

Можете също така да използвате скрит курсор за по-добра четливост:

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. NetBeans IDE под Oracle

  2. ORA-1114 Работещ Datapatch

  3. Присъединяване към колони с разделени низове в Oracle

  4. Нуждаят ли се процедурите от отделни права за достъп върху таблиците?

  5. Съобщение за грешка в sqldeveloper:Мрежовият адаптер не можа да установи грешката при връзката