注册
达梦数据库临时表介绍
专栏/龙山溪笔谈/ 文章详情 /

达梦数据库临时表介绍

myth8860 2020/11/23 6847 11 12
摘要 本文介绍了达梦数据库中两种临时表——事物级临时表和会话级临时表,以及在存储过程中创建临时表时的常见报错

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

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

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

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

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

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

CREATE GLOBAL TEMPORARY TABLE TMP_TRAN (     ID INT ,     NAME VARCHAR2(32) ) ON COMMIT DELETE ROWS;

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

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

CREATE GLOBAL TEMPORARY TABLE TMP_SESSION (     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;

补充一下:如果一定要再存储过程中创建并使用可以变通一下,创建和使用都采用动态sql也可以:

create or REPLACE PROCEDURE test_p
as
begin
  execute IMMEDIATE 'create GLOBAL TEMPORARY TABLE TMP_TEST1(c1 int) ON COMMIT PRESERVE ROWS';
  execute IMMEDIATE 'insert into TMP_TEST1 select id from SYSOBJECTS';
  execute IMMEDIATE 'select * from TMP_TEST1';
end;
评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服