如何在PLSQL存储过程中删除并重新创建索引

时间:2017-03-31 10:09:02

标签: oracle plsql

在PLSQL存储过程中,我想删除索引并截断表 在将数据插入表之前。然后我想在之后重新创建索引。实现这一目标的最佳方式是什么?

我需要类似这样的东西

Begin:

Truncate Table
Drop index1
Drop  index2

loop
--- other code
Insert data
commit;
end loop;

Create index1
Create index2

End;

2 个答案:

答案 0 :(得分:3)

我们无法直接在PL / SQL中运行DDL。

最好的方法是使用Oracle内置的DBMS_UTILITY.EXEC_DDL_STATEMENT()。它包含在文档Find out more中。但基本上是:

begin
    DBMS_UTILITY.EXEC_DDL_STATEMENT('drop index index1')
    DBMS_UTILITY.EXEC_DDL_STATEMENT('drop index index2')
    DBMS_UTILITY.EXEC_DDL_STATEMENT('truncate table your_table')
    ....

请注意,命令是 strings 而不是SQL。

如果您要插入足够的数据以使其值得删除并重新创建索引,那么您可能需要设置操作而不是循环执行。设置操作适用于数据块而不是单个行。相应的方法取决于您拥有多少数据。

  

"我想从登台表插入数据,然后加入其他表"

所以最有效的路线可能是

 insert into your_table
 select /*+ append */  ....
 from staging_table
      join other_table
      on ...

但是,根据您对"巨大"的定义您可能需要使用FORALL插入的PL / SQL批量操作。这需要从块中读取临时表,因此需要循环。 Find out more

答案 1 :(得分:1)

您可以根据自己的要求使用dynamic SQL,特别是execute immediate

Begin:

execute immediate 'truncate table statement';
execute immediate 'DROP index statement';

loop
--- other code
Insert data
commit;
end loop;

execute immediate 'Create index1 statement';
execute immediate 'Create index2 statement';

End;