临时表的合理运用

oracle 可以创建两种临时表

1. 会话持有的临时表

CREATE GLOBAL TEMPORARY <TABLE_NAME> ( <column specification> )

  ON COMMIT PRESERVE ROWS;

2. 事务持有的临时表

CREATE GLOBAL TEMPORARY <TABLE_NAME> ( <column specification> )

  ON COMMIT DELETE ROWS;

临时表只是保存当前会话(session)用到的数据,数据只在事务或会话期间存在。 

通过CREATE GLOBAL TEMPORARY TABLE命令创建一个临时表,对于事务类型的临时表, 

数据只是在事务期间存在,对于会话类型的临时表,数据在会话期间存在,会话的数据对于当前会话私有。每个会话只能看到并修改自己的数据。DML锁不会加到 临时表的数据上。下面的语句控制行的存在性。 

● ON COMMIT DELETE ROWS 表名行只是在事务期间可见 

● ON COMMIT PRESERVE ROWS 表名行在整个会话期间可见 

通俗的讲,就是事务持有的临时表当commit 事务结束,就自动清除数据,但对于会话持有的临时表,commit并不影响查询临时表,唯有当前会话结束,才清除临时表数据,其他会话中也查询不到当前会话临时表数据

3. Oracle sql 用with 临时表 as (子查询)建立临时表进行操作

insert into HW_RATE

    (ID,

    SUB_TYPE,

    DISTRICT_CODE,

    REGION_CODE,

    SUB_AREA_CODE,

    CREATE_DATE,

    CREATE_USER)

    with areaInfo as  //这里直接with 临时表别名.子句查询结果别名,即可

    (select o.district_code bu, o.region_code re

      from eis_user.org_office o

      where o.sub_area_code = '60487'

        and o.status = 1

        and o.year = extract(year from sysdate)

        and o.sub_type = 2)

    select sys_guid(),

          2,

          areaInfo.bu,

          areaInfo.re,

          '60487',

          sysdate,

          'ww00068'

      from areaInfo

猜你喜欢

转载自blog.csdn.net/weixin_34242658/article/details/87221012