【达梦数据库】临时表的使用&测试

背景

用户在使用临时表的过程中,执行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.没有找到事务性临时表直接更改成会话型临时表的方法)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值