如果存在,删除表格。

20 浏览
0 Comments

如果存在,删除表格。

我有以下的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

如何在一个过程中删除一个表?

0
0 Comments

在上述内容中,问题的出现原因是无法直接在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;

通过以上方法,可以简化对多个表执行删除操作的代码。

0