在PLSQL存储过程中,我想删除索引并截断表 在将数据插入表之前。然后我想在之后重新创建索引。实现这一目标的最佳方式是什么?
我需要类似这样的东西
Begin:
Truncate Table
Drop index1
Drop index2
loop
--- other code
Insert data
commit;
end loop;
Create index1
Create index2
End;
答案 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;