How to create a procedure in an oracle sql script and use it inside the script?

victorio picture victorio · Nov 18, 2015 · Viewed 7.7k times · Source

I want to create a script for my oracle DB, which drops tables. If the table does not exist, the script won't exit as fail, just print a text: "does not exists".

The script is the following:

BEGIN
    EXECUTE IMMEDIATE 'DROP TABLE mytable';
    DBMS_Output.Put_Line(' table dropped');
EXCEPTION WHEN OTHERS THEN
    IF SQLCODE = -942 THEN
        DBMS_Output.Put_Line(' table not exists');
    ELSE
        DBMS_Output.Put_Line(' Unknown exception while dropping table');
        RAISE;
    END IF;
END;

I want to drop a lot of table in one script, and I don't want to write these lines more than once.

Is there any way, to write it to a procedure or function which gets a parameter (the name of the table), and call this procedure in that script?

Maybe something like this:

drop_table_procedure('mytableA');
drop_table_procedure('mytableB');

Or maybe a procedure, which gets an undefined size list (like in java: String ... table names):

drop_tables_procedure('mytableA','mytableB');

Please give me some examples. Thanks!

Answer

a_horse_with_no_name picture a_horse_with_no_name · Nov 18, 2015

Yes, you can declare a "temporary" procedure in an anonymous PL/SQL block:

DECLARE 

  PROCEDURE drop_if_exists(p_tablename VARCHAR)
  IS
  BEGIN
      EXECUTE IMMEDIATE 'DROP TABLE '||p_tablename;
      DBMS_Output.Put_Line(' table dropped');
  EXCEPTION WHEN OTHERS THEN
      IF SQLCODE = -942 THEN
          DBMS_Output.Put_Line(' table not exists');
      ELSE
          DBMS_Output.Put_Line(' Unknown exception while dropping table');
          RAISE;
      END IF;
  END;

BEGIN
  drop_if_exists('TABLE_1');
  drop_if_exists('TABLE_2');
END;
/