一 TRUNCATE和Delete区别及TRUNCATE使用说明
1. TRUNCATE在各种表上无论是大的还是小的都非常快。如果有ROLLBACK命令Delete将被撤销,而TRUNCATE则不会被ce撤销。
2.TRUNCATE是一个DDL语言,像其他所有的DLL语言一样,他将被隐式提交,不能对TRUNCATE使用ROLLBACK命令。
3.TRUNCATE将重新设置高水平线和所有的索引。在对整个表和索引进行完全浏览时,经常TRUNCATE操作后的表比Delete操作后的表要快得多。
4.TRUNCATE不能触发任何Delete触发器。
5.不能授予任何人清空他人的表的权限。
6.当表被清空后表和表的索引将重新设置成初始大小,而delete则不能。
7.不能清空父表。
TRUNCATE TABLE (schema)table_name Drop(REUSE)
在默认是 Drop STORAGE 当使用Drop STORAGE时将缩短表和表索引,将表收缩到最小范围,并重新设置NEXT参数。REUSE STORAGE不会缩短表或者调整NEXT参数ITPUB个人空间;
在特殊情况下使用 REUSE STORAGE
一个实际应用的典型例子:你用sqlldr加载一个1000万记录的数据表,但是加载了多一半的时候你发现有问题,这个时候你想清空表重新加载。那么最好 reuse storage ,这样再次加载就不需要再次寻找空闲空间了。
数据库操作的sql语句: 使用方法: truncate table table_name; 操作特性: truncate 只删除表中的所有数据,不删除表的结构; truncate 是ddl操作立即生效,原数据不放到rollback segment中,不能回滚.,操作不触发trigger.; truncate 语句缺省情况下将空间释放到 minextents个 extent,除非使用reuse storage; truncate 会将高水线复位(回到最开始)。 -------------------------------------------------------------------------------------- 二 解锁 select t2.username, t2.sid, t2.serial#, t2.logon_time from v$locked_object t1, v$session t2 where t1.session_id = t2.sid order by t2.logon_time; alter system kill session '132,304'; --------------------------------------------------------------------------------------- 三 不同实例间链接 create database link test connect to perf0804 identified by perf0804 using '(DESCRIPTION =(ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = orcl) ))'; ----------------------------------------------------------------------------------------- 四 execute immediate用法 Oracle 动态SQL有两种写法:用 DBMS_SQL 或 execute immediate,建议使用后者。试验步骤如下: 1. DDL 和 DML /*** DDL ***/ begin EXECUTE IMMEDIATE 'drop table temp_1'; EXECUTE IMMEDIATE 'create table temp_1(name varchar2(8))'; end; /*** DML ***/ declare v_1 varchar2(8); v_2 varchar2(10); str varchar2(50); begin v_1:='测试人员'; v_2:='北京'; str := 'INSERT INTO test (name ,address) VALUES (:1, :2)'; EXECUTE IMMEDIATE str USING v_1, v_2; commit; end; 2. 返回单条结果 declare str varchar2(500); c_1 varchar2(10); r_1 test%rowtype; begin c_1:='测试人员'; str:='select * from test where name=:c WHERE ROWNUM=1'; execute immediate str into r_1 using c_1; DBMS_OUTPUT.PUT_LINE(R_1.NAME||R_1.ADDRESS); end ; 3. 返回结果集 CREATE OR REPLACE package pkg_test as /* 定义ref cursor类型 不加return类型,为弱类型,允许动态sql查询, 否则为强类型,无法使用动态sql查询; */ type myrctype is ref cursor; --函数申明 function get(intID number) return myrctype; end pkg_test; / CREATE OR REPLACE package body pkg_test as --函数体 function get(intID number) return myrctype is rc myrctype; --定义ref cursor变量 sqlstr varchar2(500); begin if intID=0 then --静态测试,直接用select语句直接返回结果 open rc for select id,name,sex,address,postcode,birthday from student; else --动态sql赋值,用:w_id来申明该变量从外部获得 sqlstr := 'select id,name,sex,address,postcode,birthday from student where id=:w_id'; --动态测试,用sqlstr字符串返回结果,用using关键词传递参数 open rc for sqlstr using intid; end if; return rc; end get; end pkg_test; / ------------------------------------------------------------------------------------- 存储过程事务控制 存储过程里的事务操作:create or replace procedure pr_mypro2(p_a in varchar2,p_b in varchar2,p_count out number)temp varchar2(1000); /**//*定义临时变量*/isbeginselect code into p_count from table1 where a=p_a; /**//*查询并返回值*/temp := p_count; /**//*将返回值赋给临时变量*/savepoint point1; /**//*保存点*/insert into table2(a,b)values(temp,p_b); /**//*将临时变量值添加到新表的字段*/savepoint point2;insert into exception when others then rollback to savepoint point1; /**//*异常处理,保存点下面的操作都不会被执行*/ return;end; 保存点(SAVEPOINT)是事务处理过程中的一个标志,与回滚命令(ROLLBACK)结合使用,主要的用途是允许用户将某一段处理回滚而不必回滚整个事务。 如果定义了多个savepoint,当指定回滚到某个savepoint时,那么回滚操作将回滚这个savepoint后面的所有操作(即使后面可能标记了N个savepoint)。例如,在一段处理中定义了五个savepoint,从第三个savepoint回滚,后面的第四、第五个标记的操作都将被回滚,如果不使用ROLLBACK TO savepoint_name而使用ROLLBACK,将会滚整个事务处理。