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)