Oracle杂谈

一 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);   /**//*定义临时变量*/
is
begin
select 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,将会滚整个事务处理。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值