简单理解: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;