如果存在,删除表格。
如果存在,删除表格。
我有以下的PL/SQL代码:
declare i_cnt number; begin select count(1) into i_cnt from dba_tables where table_name = upper('foo') and owner = upper('bar'); if i_cnt > 0 then drop table foo; -- <--- error this line end if; end;
我得到了以下错误信息。
ORA-06550: 第6行,第5列: PLS-00103: 遇到符号"DROP"时,期望的是以下之一: ( begin case declare exit for goto if loop mod null pragma raise return select update while with<< continue close current delete fetch lock insert open rollback savepoint set sql execute commit forall merge pipe purge
如何在一个过程中删除一个表?
在上述内容中,问题的出现原因是无法直接在PL/SQL块中执行DDL语句,需要使用EXECUTE IMMEDIATE代替。为了解决这个问题,可以将SELECT语句和IF语句合并成一行。如果需要对多个表执行相同的操作,可以通过编写针对DBA_TABLES的查询,并指定适当的WHERE子句来列出所有要删除的表。然后可以编写一个游标循环,在循环中使用EXECUTE IMMEDIATE DROP语句,指定绑定变量,并循环执行删除所有要删除的表。
下面是整理后的文章:
在PL/SQL块中无法直接执行DDL语句,需要使用EXECUTE IMMEDIATE代替。以下是一个示例:
declare i_cnt number; begin select count(1) into i_cnt from dba_tables where table_name=upper('foo') and owner=upper('bar'); if i_cnt > 0 then execute immediate 'drop table foo'; end if; end;
如果需要对多个表执行相同的操作,并且可以根据DBA_TABLES进行查询,可以通过编写一个游标循环来解决这个问题。在循环中,使用EXECUTE IMMEDIATE DROP语句,并指定绑定变量,循环执行删除所有要删除的表。以下是一个示例:
declare cursor c_tables is select table_name from dba_tables where; -- 根据需要指定适当的WHERE子句 begin for r_table in c_tables loop execute immediate 'drop table ' || r_table.table_name; end loop; end;
通过以上方法,可以简化对多个表执行删除操作的代码。