mysql和达梦数据库中创建临时表的不同方法

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......

成功

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值