1.达梦数据库临时表的两种类型:
1.1 ON COMMIT DELETE ROWS --事务级临时表
它是临时表的默认参数,表示临时表中的数据仅在事务过程(Transaction)中有效,当事务提交(COMMIT)后,临时表的暂时段将被自动截断(TRUNCATE),但是临时表的结构以及元数据还存储在用户的数据字典中。如果临时表完成它的使命后,最好删除临时表,否则数据库会残留很多临时表的表结构和元数据。
1.2 ON COMMIT PRESERVE ROWS --会话级临时表
它表示临时表的内容可以跨事务而存在,不过,当该会话结束时,临时表的暂时段将随着会话的结束而被丢弃,临时表中的数据自然也就随之丢弃。但是临时表的结构以及元数据还存储在用户的数据字典中。如果临时表完成它的使命后,最好删除临时表,否则数据库会残留很多临时表的表结构和元数据。
2.Oracle中begin ... end
我理解就是用begin end界定一个代码块。
例如:
1)未使用begin as
2)使用begin as
3.with as用法
语法:with 临时表空间名 as (select ……)
Oracle查询中的with as子句相当于创建一个临时表,将一个语句中的某些中间结果放在临时表空间。将查询中的子查询命名,放到select语句的最前面。
说明:
(1)使用with as子句创建的临时表在检索查询完成以后就被消除。
(2)创建多个临时表时,后者可以访问前面已经建好的临时表。
(3)当一个查询有多个相同的子查询时,一般使用with as子句,因为子查询结果存在内存临时表中,执行效率较高。
4.DDL语句
DDL一般指数据定义语言。
数据库模式定义语言DDL(Data Definition Language),是用于描述数据库中要存储的现实世界实体的语言。
常见的DDL语句:
创建数据库CREATE DATABASE、
创建数据库表格CREATE TABLE、
修改数据库表格ALTER TABLE、
删除数据库表格DROP TABLE、
创建查询命令CREATE VIEW、
修改查询命令ALTER VIEW、
删除查询命令DROP VIEW、
删除数据表内容TRUNCATE TABLE。
5.项目中相关问题:
5.1 mysql
使用mysql数据库,创建了多个临时表,再进行查询,比较好处理。大致的语句如下:
Create TEMPORARY table _PrintLogsEX (Select * from printlogs WHERE ResultCode = "SUCCESS" );
Create TEMPORARY table _CopyingLogsEX (Select * from copyinglogsWHERE ResultCode = "SUCCESS" );
Create TEMPORARY table _ScanLogsEX (Select * from scanlogs WHERE ResultCode = "SUCCESS" );
......(省略其他的创建临时表语句和查询语句)
DROP TABLE _PrintLogsEX;
DROP TABLE _CopyingLogsEX;
DROP TABLE _ScanLogsEX;
这种方式是同时执行了多条语句,包含建临时表,查询操作,删除临时表。mysql中配置允许多条语句执行,需要在数据库配置时加入allowMultiQueries=true,
5.2 达梦
1)使用on commit preserve rows 创建临时表:
Create global TEMPORARY table _PrintLogsEX on commit preserve rows as (Select * from printlogs WHERE ResultCode = 'SUCCESS');
Create global TEMPORARY table _CopyingLogsEX on commit preserve rows as(Select * from copyinglogs WHERE ResultCode = 'SUCCESS');
2)但是上面这种方法存在的问题是,在达梦数据库工具中能够执行,可是在代码编译时,会因为无法执行多条语句而报错,在达梦技术社区看到了一种解决方法是这样的:
达梦的存储过程中执行DDL语句需要用动态SQL,使用execute immediate ,如下:
begin
execute immediate 'Create global TEMPORARY table _PrintLogsEX on commit preserve rows as (Select * from printlogs WHERE ResultCode = ''SUCCESS'')';
execute immediate 'Create global TEMPORARY table _CopyingLogsEX on commit preserve rows as(Select * from copyinglogs WHERE ResultCode = ''SUCCESS'')';
......(省略其他的创建临时表语句和查询语句)
execute immediate 'DROP TABLE _PrintLogsEX';
execute immediate 'DROP TABLE _CopyingLogsEX';
execute immediate 'DROP TABLE _ScanLogsEX';
end;
(这里遇到了一个小的问题,就是括号内select语句中where条件里面的ResultCode = ''SUCCESS'',这里由于oracle不支持双引号,需要使用单引号,可是在外层的execute IMMEDIATE语法后,又存在一层单引号,导致达梦工具无法识别两层单引号。所以这里,将where条件里的值success使用了两层单引号)
不过经过测试发现,这种方法还是不行...这样进行的建表操作都不会生效:
3)使用with...as
with _PrintLogsEX as (Select * from printlogs WHERE ResultCode = 'SUCCESS') , _CopyingLogsEX as(Select * from copyinglogs WHERE ResultCode = 'SUCCESS') , _ScanLogsEX as(Select * from scanlogs WHERE ResultCode = 'SUCCESS')
Select......
成功