最近很多同学问到达梦数据库中如何在存储过程中创建临时表,这里给大家介绍一下:
达梦中临时表和 Oracle 一样是全局的,需要先创建后使用,并且用完表结构不会被删除,可以反复使用
SQL SERVER 中临时表用完表结构是自动删除的,这点有根本性的区别
达梦临时表有两种类型:会话级的临时表和事务级的临时表。
它是临时表的默认参数,表示临时表中的数据仅在事务过程(Transaction)中有效,当事务提交(COMMIT)后,临时表的暂时段将被自动截断(TRUNCATE),但是临时表的结构以及元数据还存储在用户的数据字典中。如果临时表完成它的使命后,最好删除临时表,否则数据库会残留很多临时表的表结构和元数据。
CREATE GLOBAL TEMPORARY TABLE TMP_TRAN
(
ID INT ,
NAME VARCHAR2(32)
) ON COMMIT DELETE ROWS;
它表示临时表的内容可以跨事务而存在,不过,当该会话结束时,临时表的暂时段将随着会话的结束而被丢弃,临时表中的数据自然也就随之丢弃。但是临时表的结构以及元数据还存储在用户的数据字典中。如果临时表完成它的使命后,最好删除临时表,否则数据库会残留很多临时表的表结构和元数据。
CREATE GLOBAL TEMPORARY TABLE TMP_SESSION
(
ID INT,
NAME VARCHAR2(32)
) ON COMMIT PRESERVE ROWS;
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;
文章
阅读量
获赞