首页 > 代码库 > Oracle、SqlServer——临时表

Oracle、SqlServer——临时表

一、概述:

oracle数据库的临时表的特点:

  • 临时表默认保存在TEMP中;
  • 表结构一直存在,直到删除;即创建一次,永久使用;
  • 不支持主外键。
  • 可以索引临时表和在临时表基础上建立视图。建立在临时表上的索引也是临时的,也是只对当前会话或者事务有效. 临时表可以拥有触发器.

临时表分为事务型和会话型

  • 会话型:基于会话的临时表,数据从会话开始到会话结束之间是有效的,当会话结束时,表中的数据会自动清空。不同会话之间的数据是隔离的,互不影响。
  • 事务型:基于事务的临时表,其比会话型的临时表更灵活,可以认为是从会话型临时表的优化,因为表中的数据的保存时间与会话型相同,有效期从会话开始,在会话结束时,数据库自动清空临时表中的数据。与会话型临时表不同的是 事务提交或者事务回滚 时将清空临时表中的数据。当然,会话型临时表在会话期间可以采用 delete 临时表名;的方式清空临时表数据。

语法:

create global temporary table 临时表名
(
……
)
on commit [preserve|delete] rows; 

  • preserve时就是会话(SESSION)型的临时表
  • delete就是事务(TRANSACTION)型的临时表 

 

而TRANSACTION级的临时表数据在TRANACTION结束后消失,即COMMIT/ROLLBACK或结束SESSION都会清除TRANACTION临时表数据。 

二、示例:

1、创建临时表

declare tempisexist integer:=0;
begin
  select count(*) into tempisexist from all_tables where table_name=‘NK_SLTJ‘;
  if tempisexist=0 then--不存在临时表就创建一个
    execute immediate(‘
      CREATE GLOBAL TEMPORARY TABLE NK_SLTJ
      (
        LCK_FJNM varchar(36),
        LCMC varchar(70),
        GFX integer,
        ZFX integer,
        DFX integer,
        KZDSL integer
      )
      on commit preserve rows‘  --preserve表示回话级。
    );
  end if;
end;

二、使用临时表

  declare
    FXZ NUMBER;
    FJNM varchar(36);
    ZZNM varchar(36):=‘77c48880-a2be-4d3c-97b7-26f8de0bee63‘;
    CURSOR NKFXZcur is select NKFXJZ_FXZ,NKLCK_FJNM from NKFXJZ INNER JOIN NKLCK ON NKLCK_NM=NKFXJZ_LCNM where NKLCK_ZZNM=ZZNM;
  begin
    delete NK_SLTJ; --防止在统一会话中多次执行导致数据重复,因此程序一开始就应清空临时表数据 
    insert into NK_SLTJ SELECT NKLCK_FJNM, NKLCK_MC,0,0,0,KZD FROM  --向临时表插入数据。
      ( select KZDSL.NKLCK_FJNM,KZDSL.KZD,LCJZ.NKLCK_MC from
      (select substr(NKLCK_FJNM,1,4) as NKLCK_FJNM, count(NKNKJZ_KZD) AS KZD from NKLCK LEFT join NKNKJZ ON NKNKJZ_LCNM =NKLCK_NM WHERE NKLCK_ZZNM=ZZNM group by substr(NKLCK_FJNM,1,4)) KZDSL
    INNER JOIN
      (select NKLCK_FJNM, NKLCK_MC from NKLCK WHERE NKLCK_JC=1 and NKLCK_ZZNM=ZZNM) LCJZ ON LCJZ.NKLCK_FJNM=KZDSL.NKLCK_FJNM) ccc;

    open NKFXZcur; --打开游标
    fetch NKFXZcur INTO FXZ,FJNM; --提取游标数据
    while NKFXZcur%FOUND loop --循环
      if FXZ>=3.5 and FXZ<=5 then --高风险
        update NK_SLTJ set GFX=GFX+1 where LCK_FJNM=substr(FJNM,0,4);
      elsif FXZ>2 and FXZ<3.5 then --中风险
        update NK_SLTJ set ZFX=ZFX+1 where LCK_FJNM=substr(FJNM,0,4);
      else
        if FXZ>=0 and FXZ<=2 then --低风险
          update NK_SLTJ set DFX=DFX+1 where LCK_FJNM=substr(FJNM,0,4);
        end if;
      end if;
      fetch NKFXZcur INTO FXZ,FJNM ;
    end loop;--结束循环
  close NKFXZcur; --关闭游标
end;

三、与SqlServer 临时表的区别

oracle:

  • 有事务表和会话表两种;
  • 临时表永远保留表结构,数据保存在磁盘上。与永久表唯一不同的是在用户会话结束或者事务提交、回滚后删除数据,但是保留表结构;

SqlServer则是本地和全局临时表。

  • 本地表:表名以 # 开头;在会话结束时彻底删除表结构,不同用户之间彼此隔绝;
  • 全局表:表名以 ## 开头,对所有用户均可见,当一个用户创建全局表后,其他用户可以访问全局表,但创建的用户结束回话时,全局表虽然接受现有连接全局表的用户访问,但不再接受新用户的访问,当已连接的用户断开连接后将彻底删除表结构。
  • SqlServer:在需要临时表时手动创建,数据保存在内存中,会话结束时直接删除表结构。

 

 

Oracle、SqlServer——临时表