存储过程中要删除一个500W数据的表,怎么来优化?
truncate为什么不能用?
谢谢!
truncate为什么不能用?
谢谢!
解决方案 »
- GC 客户端问题
- 在sqlplus里使用触发器之后无法继续输入指令
- 一个比较复杂的查询,求助!!
- 请教一个SQL
- 怎么在存储过程中传入大于32k的ftBlob参数?
- 各位我想實現如下功能,即在一個表的TRIGGER中改動自己的記錄,SQL SERVER是可以的,可是ORACLE不行,報ORA-04091的錯,請問該如何解決???
- ORACLE中写过程,过程变量如何将NUMBER类型转变成CHAR
- 高分请教快速学ORACLE的方法。有sql基础
- 两个表t1,t2,如果t1中的f2为空,则用t2中的f3来代替,
- proc中游标使用疑惑?
- oracle怎样用JOB将结果集生成一个.xls文件?
- 十万火急!!Sqlserver2005存储过程转换成Oracles存储过程的问题。
如果不能用可能是你没权限
2 as
3 begin
4 execute immediate 'truncate table ttt';
5 end;
6 /过程已创建。SQL> select * from ttt; ID NAME
---------- ----------
1 zxfSQL> exec p_truncatetable;PL/SQL 过程已成功完成。SQL> select * from ttt;未选定行SQL>
ORA-06550: 第 1 行, 第 7 列:
PLS-00905: 对象 SRAPP_HZSQ.TT_PRO 无效
ORA-06550: 第 1 行, 第 7 列:
PL/SQL: Statement ignored
如果是先删表,后建表的方法,在效率上是否比其他(truncate、delete)要好?
如果你的表关联的对象太多,就用truncate
create or replace procedure tt_pro
as
begin
truncate table t1;
end;
必须使用
execute immediate 'truncate table t1';
这个用户有DBA权限。
只有dba权限是不行的,还需要delete any table,insert any table,update any table, select any table权限才可以在包、过程中使用其他用户的表否则只能在sql*plus中用。
也可以连接到表所在的用户单独将表的delete、update、insert、select的权限授权给其他用户。
如果用truncate也存在潜在的问题。如果你在truncate之后插入数据,这是数据库荡了·那么你用户就看不见数据了,
而你用delete 则会回滚···
表中数据有500W,用delete的话是不是慢了点?有没有其他更好的办法呢?