Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Criando e executando comandos sql dinamicamente no oracle


VARCHAR2 da Oracle trata strings vazias como NULL .
Então
if tname != '' then

é o mesmo que
if tname != NULL then

que retornará NULL em vez de TRUE pois não está definido.

Você pode verificar se há NULL por tname IS NOT NULL .

table_name é obrigatório em user_tables embora, portanto, não há necessidade dessa verificação.

Mais duas coisas:
  1. Verifique se há %NOTFOUND imediatamente após a busca
  2. Use referências de coluna para declarações de variáveis, se possível ( user_tables.table_name%TYPE )

Então seu código pode ficar assim:
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;

Você também pode usar um cursor implícito para melhor legibilidade:
BEGIN
  FOR cur IN ( SELECT table_name FROM user_tables ) LOOP
    EXECUTE IMMEDIATE 'drop table ' || cur.table_name;
  END LOOP;
END;