【达梦数据库】临时表的使用测试
目录
- 背景
- 问题复现
- 问题原因
- 解决方法
背景
用户在使用临时表的过程中,执行commit
提交命令之后,临时表的数据被清空,无法被接下来的存储过程复用。
问题复现
-----------------------------提交删除行-----------------------------
--创建临时表
CREATE GLOBAL TEMPORARY TABLE "SYSDBA"."temp_table"
(
"id" VARCHAR(50),
"name" CHAR(10))
ON COMMIT DELETE ROWS STORAGE(ON TEMP);--插入数据
INSERT INTO "SYSDBA"."temp_table"
VALUES(1,'Tom');--查看数据
SELECT * FROM "SYSDBA"."temp_table";
--id name
--'1' 'Tom '--提交
COMMIT;--查看数据:表中数据被清空
SELECT * FROM "SYSDBA"."temp_table";
--id name-----------------------------提交保留行-----------------------------
--创建临时表
create global temporary table "SYSDBA"."temp_table1"
("id" VARCHAR(50),"name" CHAR(10)
)on commit preserve rows
storage(initial 1, next 1, minextents 1, fillfactor 0)
;--插入数据
INSERT INTO "SYSDBA"."temp_table1"
VALUES(1,'Tom');--查看数据
SELECT * FROM "SYSDBA"."temp_table1";
--id name
--'1' 'Tom --提交
COMMIT;--查看数据:表中数据被清空
SELECT * FROM "SYSDBA"."temp_table1";
--id name
--'1' 'Tom '-----------新打开会话窗口
--查看数据:表中数据被清空
SELECT * FROM "SYSDBA"."temp_table1";
--id name
问题原因
达梦临时表有两种类型:会话级的临时表和事务级的临时表。
ON COMMIT DELETE ROWS --事务级临时表
它是临时表的默认参数,表示临时表中的数据仅在事务过程(Transaction)中有效,当事务提交(COMMIT)后,临时表的暂时段将被自动截断(TRUNCATE)
。
但是临时表的结构以及元数据还存储在用户的数据字典中。如果临时表完成它的使命后,最好删除临时表,否则数据库会残留很多临时表的表结构和元数据。
ON COMMIT PRESERVE ROWS --会话级临时表
它表示临时表的内容可以跨事务而存在
,不过,当该会话结束时,临时表的暂时段将随着会话的结束而被丢弃,临时表中的数据自然也就随之丢弃。
但是临时表的结构以及元数据还存储在用户的数据字典中。如果临时表完成它的使命后,最好删除临时表,否则数据库会残留很多临时表的表结构和元数据。
参考链接: 达梦数据库临时表介绍
解决方法
重建临时表为会话级临时表ON COMMIT PRESERVE ROWS
。(p.s.没有找到事务性临时表直接更改成会话型临时表的方法)