日期:2014-05-16  浏览次数:20683 次

简单理解:global temporary table
简单动机:出于对运行速度的无法忍受,我将嵌套sql语句中关于group by的内容放入临时表,作为中间变量。
简单做法:第一次使用临时表,查看有事务级别和会话级别2种,我选会话级别的即可。
简单理解:一次DB连接就是一次会话,如果有N个用户连接DB,大家都可以来用这个临时表,即为“全局”;但是需要隔离各自的内容,互不干扰,所以是会话级别的;所谓“临时”,即会话结束后,系统帮助清空,很方便。表内内容应该是存在内存里面的。

CREATE OR REPLACE PROCEDURE P_WY_NE_ZTE_LAC_CI AS

BEGIN
  /*ZTE 后台以 BSC,BTS,CELL 唯一标识小区,而LAC,CI是要配置数据关联过来的*/
  --ON COMMIT DELETE ROWS 说明临时表是事务指定,每次提交后ORACLE将截断表(删除全部行)
  --ON COMMIT PRESERVE ROWS 说明临时表是会话指定,当中断会话时ORACLE将截断表。
  DELETE IBTS_BTS_NOW WHERE RECDATE = TRUNC(SYSDATE);
  COMMIT;
  INSERT INTO IBTS_BTS_BSCCONFSETID_TEMP    SELECT BSC, MIN(CONFSETID) CONFSETID
      FROM IBTS_BTS
     WHERE RECDATE = TRUNC(SYSDATE)
     GROUP BY BSC;
  COMMIT;
  INSERT /*APPEND*/
  INTO IBTS_BTS_NOW
    SELECT *
      FROM IBTS_BTS
     WHERE RECDATE = TRUNC(SYSDATE)
       AND (BSC, CONFSETID) IN (SELECT * FROM IBTS_BTS_BSCCONFSETID_TEMP);
  COMMIT;
  DELETE IBTS_BTS_NOW WHERE RECDATE <= TRUNC(SYSDATE) - 30;
  COMMIT;
END;

-- Create table
create global temporary table IBTS_BTS_BSCCONFSETID_TEMP(
  bsc       NUMBER(10) not null,
  confsetid NUMBER
)
on commit preserve rows;