临时表

MySQL基础篇(04):存储过程和视图,用法和特性详解

天大地大妈咪最大 提交于 2020-01-06 08:01:18
本文源码: GitHub·点这里 || GitEE·点这里 一、存储过程 1、概念简介 存储程序是被存储在服务器中的组合SQL语句,经编译创建并保存在数据库中,用户可通过存储过程的名字调用执行。存储过程核心思想就是数据库SQL语言层面的封装与重用性。使用存储过程可以较少应用系统的业务复杂性,但是会增加数据库服务器系统的负荷,所以在使用时需要综合业务考虑。 2、基本语法格式 CREATE PROCEDURE sp_name ([proc_parameter[,...]]) [characteristic ...] routine_body 案例一:计算消费折扣 -- 创建存储过程 DROP PROCEDURE IF EXISTS p01_discount ; CREATE PROCEDURE p01_discount(IN consume NUMERIC(5,2),OUT payfee NUMERIC(5,2)) BEGIN -- 判断收费方式 IF(consume>100.00 AND consume<=300.00) THEN SET payfee=consume*0.8; ELSEIF (consume>300.00) THEN SET payfee=consume*0.6; ELSE SET payfee = consume; END IF; SELECT payfee AS

Oracle触发器学习记录

末鹿安然 提交于 2020-01-05 00:28:37
1、这是oracle的规定,不能对执行触发器的表进行操作。 可以对new.xxx进行操作啊,对于oracle行级触发器(for each row),不能对本表做任何操作,包括读取 原则: 在before insert触发器中,可以实现对本表的访问; 在after insert触发器中,不能实现对本表的访问; 在before/after update/delete触发器中,都不能实现对本表的访问 其实原因很简单,就是为了防止脏读 2、写oracle行级触发器时,不能操作本表,报表 *** 发生了变化,触发器/函数不能读"的错误的解决办法 原因已经很明显了就是行级的触发器代码中不能操作该表,包括select,是挺郁闷的 当然解决方法就是要根据原因了,正因为限定了行级触发器的操作,只能选择表级的触发器了,但是在表级的触发器又不能获得:new和:old的值,那就只能采取两种触发器并用的方法了,并且还要包或者临时表加以辅助. 首先在行级触发器中将所需的,:new或者:old的值,写到包或者临时表中 然后在表级触发器中处理包或者临时表中已经写入的数据,操作成功后可以按照需求再删除临时表的数据. 3、 ORACLE 触发器 ORACLE产生数据库触发器的语法为: create [or replace] trigger 触发器名 触发时间 触发事件 on 表名 [for each row] pl

存储过程中的死循环导致数据库磁盘占满而连不上

本秂侑毒 提交于 2020-01-02 16:28:12
在使用sybase写存储过程,当时是写了一个通过游标插入临时表数据的内容,由于while 下代码忘写了begin end,因此while语句只会控制下面一行代码,也就是会始终插入,从而导致数据库磁盘满。 代码如下 declare tmp_train_dir_20191227_list cursor for select distinct train_code,字段 from 表名,where 条件 open tmp_train_dir_20191227_list cursor fetch tmp_train_dir_20191227_list into 全局变量 while @@sqlstatus !=2 --begin insert into 临时表 values (全局变量等) fetch tmp_train_dir_20191227_list into 全局变量 --end 问题出在没写如上的begin end 导致while只控制一行代码,死循环插入,在做测试时只要执行了该过程就会有问题。 连不上库的解决方式,由于是临时表的问题,需要终止存储过程,之后临时表自动删除就好了。重启一下数据库就好了。 存储过程临时表生命周期: 全局的临时表以“##”符号开头,它将一直存在于数据库中,直到数据库重新启动 在存储过程中,普通临时表都以“#”开头,一旦存储过程关闭,临时表就会被丢弃

ORA-14452的出现原因解析及解决方法

谁说胖子不能爱 提交于 2020-01-01 22:49:14
在删除临时表时遇到了ORA-14452错误:ORA-14452: attempt to create , alert or drop an index on temporary table already in use。第一次碰到这种情况,问题解决过后,为了加深理解,特意参考网上资料,做了下面实验重现错误出现的场景,以及应该如何解决. 会话级临时表 由于实验需要两个或多个会话配合,所以使用SET SQLPROMPT来标识会话,如下所示,SESSION 1与SESSION 2: Step 1: 在会话1中创建了会话级的临时表TMP_TEST 1 SQL> SET SQLPROMPT "SESSION 1 >" 2 SESSION 1 >CREATE GLOBAL TEMPORARY TABLE TMP_TEST 3 2 ( NAME VARCHAR2(12) ) ON COMMIT PRESERVE ROWS; 4 5 Table created. 6 7 SESSION 1 >INSERT INTO TMP_TEST VALUES('Kerry'); 8 9 1 row created. 10 11 SESSION 1 >COMMIT; 12 13 Commit complete. 14 15 SESSION 1 >SELECT * FROM TMP_TEST; 16 17

distinct的用法

巧了我就是萌 提交于 2020-01-01 21:19:38
distinct的用法: select distinct expression[,expression...] from tables [where conditions]; 在使用distinct的过程中主要注意一下几点: 在对字段进行去重的时候,要保证distinct在所有字段的最前面 如果distinct关键字后面有多个字段时,则会对多个字段进行组合去重,只有多个字段组合起来的值是相等的才会被去重 distinct的原理: distinct进行去重的主要原理是通过先对要进行去重的数据进行分组操作,然后从分组后的每组数据中去一条返回给客户端,在这个分组的过程可能会出现两种不同的情况: distinct 依赖的字段全部包含索引: 该情况mysql直接通过操作索引对满足条件的数据进行分组,然后从分组后的每组数据中去一条数据。 distinct 依赖的字段未全部包含索引: 该情况由于索引不能满足整个去重分组的过程,所以需要用到临时表,mysql首先需要将满足条件的数据放到临时表中,然后在临时表中对该部分数据进行分组,然后从临时表中每个分组的数据中去一条数据,在临时表中进行分组的过程中不会对数据进行排序。 来源: https://www.cnblogs.com/Mr-Echo/p/12129919.html

mysql 视图

谁说我不能喝 提交于 2020-01-01 05:04:09
视图 view 在查询中,我们常把查询结果当成临时表来看 view可以看作一张虚拟表,是表通过某种运算得到的一个投影 因此,表的变化会影响视图(继承了表中的数据) 创建视图 create view 视图名 as select 语句 创建成功后可当作表来使用 视图用处: 1.简化查询 比如:复杂的统计时,先用视图生成一个中间结果,在查询视图 2.更精细的权限控制 比如某张表,用户表为例 现在呢,两个网站搞合作,可以查询对方网站的用户,需要向对方开放用户表的权限,不开放用户表中的密码字段 create view vuser as select user_id,username,emial from user 开放这个视图的权限给对方 3.数据多,分表时可以用到。 比如小说站,article表,1000多万篇 分成article 1,art2,art3,art4,art5 这5张表每张表放200万篇 查询小说时不知道在那张表 create view article as select title from article1 union select title from article2... 视图时表的一个影子 表与视图,数据变化时的相互影响问题 1.表的变化影响到视图的变化 2.视图一般情况下无法修改, 当视图中的数据和表的数据一一对应时, 表-->推出视图对应的数据,视图--

sql优化的几种方式

吃可爱长大的小学妹 提交于 2020-01-01 04:30:05
一、为什么要对SQL进行优化 我们开发项目上线初期,由于业务数据量相对较少,一些SQL的执行效率对程序运行效率的影响不太明显,而开发和运维人员也无法判断SQL对程序的运行效率有多大,故很少针对SQL进行专门的优化,而随着时间的积累,业务数据量的增多,SQL的执行效率对程序的运行效率的影响逐渐增大,此时对SQL的优化就很有必要。 二、SQL优化的一些方法 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null 可以在num上设置默认值0,确保表中num列没有null值,然后这样查询: select id from t where num=0 3.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。 4.应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num=10 or num=20 可以这样查询: select id from t where num=10 union all select id from t

mysql视图和临时表的区别

百般思念 提交于 2020-01-01 03:09:54
视图 视图是由从数据库的基本表中选出来的数据组成的逻辑窗口,它与基本表不同的是,视图是一个虚表。数据库中只存放视图的定义,而不存放视图包含的数据,这些数据仍存放在原来的基表中。所以基表中的数据如果发生改变,从视图中查询出的数据也随之改变。 视图是一个虚表,他是通过执行SQL查询所产生的。视图以select命名存储于数据字典当中。每当SQL查询包含有视图名称的时候,数据库管理系统会执行在视图定义当中所包含的查询,以建立其虚拟结果表。该结果表可以当做查询其余部分的源表使用。 视图可以是建立在一个或多个表上,也可以建立在视图上,但是不管怎么样对视图数据的操作最终都会转换为对基本表的操作,因为视图是一个虚表,数据实际上保存在基本表中 临时表 临时表与永久表相似,但临时表存储在 tempdb 中,当不再使用时会自动删除。 临时表有两种类型:本地和全局。它们在名称、可见性以及可用性上有区别。本地临时表的名称以单个数字符号 (#) 打头;它们仅对当前的用户连接是可见的;当用户从 SQL Server 实例断开连接时被删除。全局临时表的名称以两个数字符号 (##) 打头,创建后对任何用户都是可见的,当所有引用该表的用户从 SQL Server 断开连接时被删除。 临时表是建立在系统临时文件夹中的表,如果使用得当,完全可以像普通表一样进行各种操作,在VFP退出时自动被释放。

临时表空间

北城以北 提交于 2019-12-30 13:49:11
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 表空间: 此空间是用来进行数据存储的(表、function、存储过程等),所以是实际物理存储区域 ,就是存储在磁盘上的。 临时表空间:用来管理数据库排序操作以及用于存储临时表、中间排序结果等临时对象。 临时表空间也是表空间,因此它也是存储在磁盘上的。 像数据库中一些操作: CREATE INDEX、 ANALYZE、SELECT DISTINCT、ORDER BY、GROUP BY、 UNION ALL、 INTERSECT、MINUS、SORT-MERGE JOINS、HASH JOIN等都可能会用到临时表空间。 当数据量比较小的时候,内存就能操作排序等功能时,也就直接在内存中进行,当内存不够时就需要临时表空间了,因此当SQL中需要使用临时表空间时,效率会下降。 临时表空间不会存储永久类型的对象,所以不需要备份,对临时表空间的操作不产生redo日志,会生成undo日志。 来源: oschina 链接: https://my.oschina.net/u/1269959/blog/517657

SQL 临时表

人走茶凉 提交于 2019-12-27 08:42:10
表名前使用一个#号( # ),临时表是局部的,只允许当前会话使用;使用两个#号( ## ),临时表是全局的,当前在线的会话都可以使用,在断开连接后sql会自动删除临时表。 1 create table #a 2 ( 3 id int, 4 name varchar(50) 5 ) 6 insert into #a(id,name) values(1,'123') 7 select * from #a 8 drop table #a 临时表除了名称前多了#号外,其他操作与普通表完全一样。 tb_Student是已建立好的表,我们通过临时表temp把tb_Student表中的内容复制到tb_lizi表中,可以使用如下的代码实现: 1 use mcf 2 SELECT * INTO #temp FROM tb_Student 3 SELECT * INTO tb_lizi FROM #temp 执行后断开sql连接并重新连接(也可以退出sq再l重新启动sql),发现tb_lizi表中的内容tb_Student表中的内容完全一致,实现了复制,同时我们没有用代码删除temp表,但mcf数据库中却没有temp表了,这是因为断开连接时sql自动删除了temp表。 来源: https://www.cnblogs.com/Jinnchu/archive/2012/09/18/2690341.html