如何在oracle sql脚本中创建一个过程并在脚本中使用它?

vic*_*rio 2 sql oracle procedure function sql-scripts

我想为我的oracle DB创建一个脚本,它会丢弃表.如果表不存在,脚本将不会退出失败,只需打印文本:" 不存在 ".

该脚本如下:

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;
Run Code Online (Sandbox Code Playgroud)

我想在一个脚本中删除很多表,我不想多次写这些行.

有没有办法,把它写入获取参数(表名)的过程或函数,并在该脚本中调用此过程?

也许是这样的:

drop_table_procedure('mytableA');
drop_table_procedure('mytableB');
Run Code Online (Sandbox Code Playgroud)

或者可能是一个过程,它获取一个未定义的大小列表(如在java:String ...表名中):

drop_tables_procedure('mytableA','mytableB');
Run Code Online (Sandbox Code Playgroud)

请举个例子.谢谢!

a_h*_*ame 10

是的,您可以在匿名PL/SQL块中声明"临时"过程:

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;
/
Run Code Online (Sandbox Code Playgroud)