sql >> Databasteknik >  >> RDS >> Oracle

Skapa och köra sql-kommandon dynamiskt i Oracle

Oracles VARCHAR2 behandlar tomma strängar som NULL .

if tname != '' then

är samma som

if tname != NULL then

som returnerar NULL istället för TRUE eftersom det inte är definierat.

Du kan kontrollera efter NULL av tname IS NOT NULL .

table_name är obligatoriskt i user_tables dock, så det finns inget behov av denna kontroll.

Två saker till:

  1. Kontrollera efter %NOTFOUND direkt efter hämtning
  2. Använd kolumnreferenser för variabeldeklarationer om möjligt ( user_tables.table_name%TYPE )

Så din kod kan se ut så här:

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;

Du kan också använda en implicit markör för bättre läsbarhet:

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



  1. INSERT INTO @TABLE EXEC @query med SQL Server 2000

  2. Alternativ till hashat SSN som nyckel i MySQL

  3. SQL-ändringstabell

  4. Hur kan vi återanvända det borttagna ID:t från någon MySQL-DB-tabell?