达梦数据库临时表介绍

最近很多同学问到达梦数据库中如何在存储过程中创建临时表,这里给大家介绍一下:

达梦中临时表和oracle一样是全局的,需要先创建后使用,并且用完表结构不会被删除,可以反复使用

SQL SERVER中临时表用完表结构是自动删除的,这点有根本性的区别

达梦临时表有两种类型:会话级的临时表和事务级的临时表。

1)ON COMMIT DELETE ROWS  --事务级临时表

它是临时表的默认参数,表示临时表中的数据仅在事务过程(Transaction)中有效,当事务提交(COMMIT)后,临时表的暂时段将被自动截断(TRUNCATE),但是临时表的结构 以及元数据还存储在用户的数据字典中。如果临时表完成它的使命后,最好删除临时表,否则数据库会残留很多临时表的表结构和元数据。

CREATE GLOBAL TEMPORARY TABLE TMP_SESSION

(

    ID INT,

    NAME VARCHAR2(32)

) ON COMMIT DELETE ROWS;

2)ON COMMIT PRESERVE ROWS --会话级临时表

它表示临时表的内容可以跨事务而存在,不过,当该会话结束时,临时表的暂时段将随着会话的结束而被丢弃,临时表中的数据自然也就随之丢弃。但是临时表的结构以及元数据还存储在用户的数据字典中。如果临时表完成它的使命后,最好删除临时表,否则数据库会残留很多临时表的表结构和元数据。

CREATE GLOBAL TEMPORARY TABLE TMP_TRAN

(

    ID INT ,

    NAME VARCHAR2(32)

) ON COMMIT PRESERVE ROWS;

3)在存储过程中创建临时表

SQL SERVER的应用一般在存储过程中创建存储过程,用完了,临时表自动清除比较方便,但是在达梦中临时表需要提前创建成功才能使用,表结构会保留,需要注意

--达梦的存储过程中执行DDL语句需要用动态SQL

create or REPLACE PROCEDURE test_p
as
begin
  execute IMMEDIATE 'create GLOBAL TEMPORARY TABLE TMP_TEST1(c1 int) ON COMMIT PRESERVE ROWS';
  SELECT * FROM TMP_TEST1;
end;

--警告:创建的对象带有编译错误

ALTER PROCEDURE  test_p COMPILE;

[执行语句1]:
ALTER PROCEDURE  test_p COMPILE
执行失败(语句1)
第5 行附近出现错误[-2106]:
无效的表或视图名[TMP_TEST1]

--为什么会这样呢?因为是动态SQL创建的临时表,下面的查询语句从语义上无法判断临时表是否存在

------------------------------------------------------------------------------------------------------------------------------------

--正确的做法是先把临时表创建成功,然后再使用,不能在同一个存储过程中创建+使用
create or REPLACE PROCEDURE test_p
as
begin
  execute IMMEDIATE 'create GLOBAL TEMPORARY TABLE TMP_TEST1(c1 int) ON COMMIT PRESERVE ROWS';
end;

call test_p;

insert into TMP_TEST1 select id from SYSOBJECTS;

commit;

select * from tmp_test1;

 

更多资讯请上达梦技术社区了解: https://eco.dameng.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值