Oracle存储过程中临时表的使用技巧(三)
NAME.AREACODE=QU.AREACODE ';--册所属区域(产生单据的公司所在区域)
v_sql := v_sql || 'LEFT OUTER JOIN PUB_CABINETS GUI ON CE.CABINETCODE=GUI.CABINETCODE ';--册所在档案柜(保存的位置)
v_sql := v_sql || 'LEFT OUTER JOIN PUB_ARCHIVESROOMS SHI ON GUI.ROOMCODE = SHI.ROOMID ';--册(柜)所在档案室(保存的位置)
v_sql := v_sql || 'WHERE (GUI.ISMAIL = 0 OR GUI.ISSIGN = 1) ';--尚未邮寄的或者已签收的
v_sql := v_sql || 'AND CE.ISBORROW = ''0'' ';--尚未借出去的
IF (p_AREA_CODES IS NOT NULL AND LENGTH(p_AREA_CODES) >0) THEN --如果需要限制册的所属区域
BEGIN
v_sql := v_sql || 'AND QU.AREACODE IN ('|| p_AREA_CODES || ') ';
END;
END IF;
p_QUERY_SQL := p_QUERY_SQL || ' SQL4RESULT: ' || v_sql;--返回
OPEN p_OutCursor FOR v_sql;
SELECT COUNT(1) INTO V_CNT FROM TEMP_VOLUMES_QUERY;
dbms_output.put_line(v_sql || ',V_CNT=' || V_CNT);
dbms_output.put_line(V_CNT);
delete from TEMP_VOLUMES_QUERY;
COMMIT;
end SPLIT_VOLUMES;
end;
/
三、结论
1、ON COMMIT DELETE ROWS 说明临时表是事务指定,每次提交后ORACLE将截断表(删除全部行)
2、ON COMMIT PRESERVE ROWS 说明临时表是会话指定,当中断会话时ORACLE将截断表。
3、临时表(无论会话级还是事务级)中的数据都是会话隔离的,不同session之间不会共享数据。
4、在存储中使用事务级临时表时,注意commit前删除掉本事务的数据,否则可能会出现数据不断增加的情况(原因尚未搞明白)。
5、 两种临时表的语法:
create global temporary table 临时表名 on commit preserve|delete rows;
用preserve时就是SESSION级的临时表,
用delete就是TRANSACTION级的临时表。
6、特性和性能(与普通表和视图的比较)
临时表只在当前连接内有效;
临时表不建立索引,所以如果数据量比较大或进行多次查询时,不推荐使用;
数据处理比较复杂的时候时表快,反之视图快点;
在仅仅查询数据的时候建议用游标: open cursor for 'sql clause';