--CREATE TABLE
MENNAN.TABLE_EXAMPLE AS SELECT * FROM DUAL;
---SIMPLE WAY, if execute
immediate fails, because table not exists, transaction will be committed
BEGIN
 
EXECUTE IMMEDIATE 'DROP TABLE
MENNAN.TABLE_EXAMPLE';
EXCEPTION
 
WHEN OTHERS THEN
   
IF SQLCODE <> -942 THEN
      RAISE;
   
END IF;
END;
/
---- NAMED EXCEPTION, the same as
SIMPLE WAY
DECLARE
 
ve_TableNotExists EXCEPTION;
 
PRAGMA EXCEPTION_INIT(ve_TableNotExists,
-942);
 
vs_DynamicDropTableSQL VARCHAR2(1024);
 
vs_TableName           VARCHAR2(64);
BEGIN
 
vs_TableName           := 'MENNAN.TABLE_EXAMPLE';
 
vs_DynamicDropTableSQL := 'DROP TABLE ' || vs_TableName;
 
EXECUTE IMMEDIATE
vs_DynamicDropTableSQL;
EXCEPTION
 
WHEN
ve_TableNotExists THEN
   
dbms_output.put_line(vs_TableName || ' not exist, skipping....');
 
WHEN OTHERS THEN
   
dbms_output.put_line(SQLERRM);
   
RAISE;
END;
/
---- NAMED EXCEPTION, the same as
SIMPLE WAY but more general one
DECLARE
 
ve_TableNotExists EXCEPTION;
 
PRAGMA EXCEPTION_INIT(ve_TableNotExists,
-942);
 
PROCEDURE
DropTable(pis_TableName IN VARCHAR2) IS
   
vs_DynamicDropTableSQL VARCHAR2(1024);
 
BEGIN
   
vs_DynamicDropTableSQL := 'DROP TABLE ' || pis_TableName;  
   
EXECUTE IMMEDIATE
vs_DynamicDropTableSQL;
 
EXCEPTION
   
WHEN
ve_TableNotExists THEN
      dbms_output.put_line(pis_TableName || ' not exist,
skipping....');
   
WHEN OTHERS THEN
      dbms_output.put_line(SQLERRM);
      RAISE;
 
END DropTable;
BEGIN
 
DropTable('MENNAN.TABLE_EXAMPLE');
END;
/
---Yet another way, first check
from dictionary, if exists drop the table. Checking from dictionary may take
time but avoids unnecessary transactions
DECLARE
 
vs_TableName VARCHAR2(64);
 
vn_Count     PLS_INTEGER;
BEGIN
 
vs_TableName := 'MENNAN.TABLE_EXAMPLE';
 
SELECT COUNT(*)
   
INTO vn_Count
   
FROM ALL_TABLES
  
WHERE OWNER || '.' || TABLE_NAME =
vs_TableName;
 
IF vn_Count > 0 THEN
   
EXECUTE IMMEDIATE 'DROP TABLE ' || vs_TableName;
 
END IF;
END;
/
 
 
1 comment:
thank you, it was very useful
Post a Comment