测试目标:
分别在SQL过程和SQL语句中创建临时表,并插入数据,看执行结果有什么异同。
测试环境:
DB2 UDB V9.1
执行附件里面的SQL语句,得到一个表。
测试代码和运行结果:
一、临时表在SQL语句中
-- 定义一个全局临时表SESSION.RESULT
DECLARE GLOBAL TEMPORARY TABLE SESSION.RESULT
(
TMP_HYDM VARCHAR(10), -- 行业代码
TMP_HYMC VARCHAR(300) -- 行业名称
)
WITH REPLACE
NOT LOGGED;
-- 插入数据到临时表
INSERT INTO SESSION.RESULT
SELECT MLDM,MLMC FROM DM_HY_CY;
-- 查询临时表数据
SELECT * FROM SESSION.RESULT;
测试结果:以上SQL代码正常执行,但是没有查询到任何数据。
二、临时表在SQL存储过程中
CREATE PROCEDURE SP_TEST_TMEP ( )
DYNAMIC RESULT SETS 1
------------------------------------------------------------------------
-- 语言:DB2 SQL 存储过程
-- 说明:用来测试通过查询插入临时表数据
-- 作者:熔 岩
-- 日期:2008-08-31
------------------------------------------------------------------------
P1: BEGIN
-- 定义一个全局临时表SESSION.RESULT
DECLARE GLOBAL TEMPORARY TABLE SESSION.RESULT
(
TMP_HYDM VARCHAR(10), -- 行业代码
TMP_HYMC VARCHAR(300) -- 行业名称
)
WITH REPLACE -- 如果存在此临时表,则替换
NOT LOGGED; -- 不在日志里纪录
-- 插入数据到临时表
INSERT INTO SESSION.RESULT
SELECT MLDM,MLMC FROM DM_HY_CY;
P2: BEGIN
-- 游标对客户机应用程序保持打开
DECLARE CUR_RES CURSOR WITH RETURN FOR
SELECT * FROM SESSION.RESULT;
OPEN CUR_RES;
END P2;
END P1
测试结果:存储过程执行成功,并返回了插入的目标数据。
测试总结:
1、在SQL语句中,构建临时表是没有意义的,因为当SQL语句执行处于自动提交模式下时,执行后就COMMIT了,而一旦执行了COMMIT语句,临时表将从内存中清除。
2、在SQL过程中,临时表定义后,如果没有显式执行到COMMIT语句,则临时表一直存在。并且临时表支持INSERT INTO ... SELECT ... 的语句。
3、在DB2下,临时表的模式必须为SESSION,SESSION模式下表是一个内存表,这个SESSION是DB2特有的SCHEMA,SESSION对象的声明周期仅仅限于一次数据连接“会话”,一旦会话结束,SESSION对象就被从内存中清除了,这和JSP中的内置对象SESSION类似。
本文转自 leizhimin 51CTO博客,原文链接:http://blog.51cto.com/lavasoft/40486,如需转载请自行联系原作者