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