存储过程

SQL Server 存储过程

↘锁芯ラ 提交于 2020-01-09 13:59:53
Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用。当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句。这样就可以提高存储过程的性能。 Ø 存储过程的概念 存储过程Procedure是一组为了完成特定功能的SQL语句集合,经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数来执行。 存储过程中可以包含逻辑控制语句和数据操纵语句,它可以接受参数、输出参数、返回单个或多个结果集以及返回值。 由于存储过程在创建时即在数据库服务器上进行了编译并存储在数据库中,所以存储过程运行要比单个的SQL语句块要快。同时由于在调用时只需用提供存储过程名和必要的参数信息,所以在一定程度上也可以减少网络流量、简单网络负担。 1、 存储过程的优点 A、 存储过程允许标准组件式编程 存储过程创建后可以在程序中被多次调用执行,而不必重新编写该存储过程的SQL语句。而且数据库专业人员可以随时对存储过程进行修改,但对应用程序源代码却毫无影响,从而极大的提高了程序的可移植性。 B、 存储过程能够实现较快的执行速度 如果某一操作包含大量的T-SQL语句代码,分别被多次执行,那么存储过程要比批处理的执行速度快得多。因为存储过程是预编译的,在首次运行一个存储过程时,查询优化器对其进行分析、优化,并给出最终被存在系统表中的存储计划。而批处理的T

oracle编译 失效对象方式

落爺英雄遲暮 提交于 2020-01-09 02:36:18
如果procedure 所使用的表结构发生了改变等其它情况,在相应的xxx_objects表的status字段会变为invalid状态,但是如果在调用时procedure会自动编译,grant失效对象权限给别人时也会自动编译,也是在dba_objects表可以查到最后一次编译的时间last_ddl_time,但并不是说调用就会重编译, 高并发的oltp , 多个session 同时编译 就会出现 library cache lock/pin,最好还是更新完,手动编译. 对于已失效的存储过程,只要不是语法上的问题,编译一下又可以重新使用了,手动编译而不等到用时也要做到自动化,方法如下 1. Oracle SQL *Plus 中 —— 用 spool 生成脚本文件,然后 @ 调入执行,代码如下: spool comProc.sql select ‘alter procedure ‘||object_name||’ compile;’ from all_objects where status = ‘INVALID’ and object_type = ‘PROCEDURE’ AND owner=’xxx'; spool off @comProc.sql; 2. 写成一个存储过程 —— 让这个存储过程在某个时机执行,比如 Job 中,代码如下: create or replace

存储过程中临时表删除报错“ORA-00942表或视图不存在”异常处理

橙三吉。 提交于 2020-01-08 21:15:22
Oracle存储过程中涉及到临时表先删后建操作时难免发生“ORA-00942表或视图不存在”这样的错误,个人做法是删除的时候加入异常处理,不抛出表不存在的异常,具体如下: BEGIN BEGIN EXECUTE IMMEDIATE 'DROP TABLE <<Your Table Name>>' ; EXCEPTION WHEN OTHERS THEN IF SQLCODE != - 942 THEN RAISE ; END IF ; END ; EXECUTE IMMEDIATE '<<Your table creation Statement>>' ; END ; 参考地址 来源: CSDN 作者: 且看风去风留 链接: https://blog.csdn.net/github_37764221/article/details/103891487

mysql存储过程总结

霸气de小男生 提交于 2020-01-08 16:42:17
N年没写过存储过程了,突然要写存储一下都忘记完了,现在回顾总结。 先废话的说下mysql中的变量有1.系统变量 和 2.自定义变量 系统变量:变量由系统提供,不是用户定义,属于服务器层面 a.查看所有的系统变量: show global | session variables; b.查看满足条件的部分系统变量: show global | 【session】 variables like '%char%'; c.查看指定的某哥系统变量的值: select @@global | 【session】.系统变量名; d.为某个系统变量赋值 方法一: set global | 【session】 系统变量名 = 值; 方法二: set @@global | 【session】.系统变量名 = 值; e.全局变量 1.查看所有的全局变量: SHOW GLOBAL VARIABLES; 查看部分的全局变量: SHOW GLOBAL VARIABLES LIKE '%char%'; 3.查看指定的全局变量的值: SELECT @@global.autocommit; SELECT @@tx_isolation; 4.为某个指定的全局变量赋值: SET @@global.autocommit=0; f.会话变量 1.查看所有的会话变量 SHOW VARIABLES; SHOW SESSION

mysql 行级锁问题

巧了我就是萌 提交于 2020-01-08 11:52:25
线上碰到存储过程死锁问题了,开始以为非主键查询 for update 会导致表锁,后来经过测试 innodb下for update索引生效的情况下 根据索引字段查询是行级锁, 会将整个结果集进行上锁,直到事务结束。 错误地方进行一些修正,一般情况的确是将索引的结果集进行上锁,但是由于表过大的情况,mysql为了性能自动优化将索引附近的结果集全部进行上锁。 具体实验过程可以看 https://blog.csdn.net/qq_31975227/article/details/103710018 ,自己做一遍也能实验出来。 但是存储过程死锁的问题还是没有解决,不过该存储过程只是进行内存统计数据的落库,所以不应该上锁。虽然程序是node调用,但是也不会出现执行顺序问题,如果出现了执行顺序问题加了行级锁也是没有用的,又不是在源数据进行加减等计算操作,计算操作都在内存完成了,最后只进行了落库操作。( 来至个人的吐槽,我没办法说法领导, 后来和领导沟通说明白了问题) 死锁的问题通过分析死锁日志文件解决了,由于上面一块错误的认识。一直认为两个非唯一索引可以命中单条记录,其实mysql为了性能命中了多条。 一个简单的update语句,update ? where id1=1 and id2=2 id1和id2 都是非唯一索引,这时有的语句会对因为优化导致上锁其他索引周边的数据条目

sql增删改查存储过程

◇◆丶佛笑我妖孽 提交于 2020-01-08 09:52:29
---------------------------------添加存储过程------------------------------ if OBJECT_ID('P_add') is not null drop proc P_add go create proc P_add --参数 @UserName varchar(100), @UserPwd varchar(100), @UserSex int, @UserDate datetime, @msg varchar(max) out as --变量 declare @bcount int,@acount int --赋值 set @bcount=(select COUNT(1) from UserInfo)--添加之前条数 insert into UserInfo values(@UserName,@UserPwd,@UserSex,@UserDate) set @acount=(select COUNT(1) from UserInfo)--添加之后的条数 if @acount>@bcount set @msg='添加成功' -----------------------------------删除存储过程------------------------------ if OBJECT_ID('P_Delete') is

sql多条件分页存储过程

徘徊边缘 提交于 2020-01-08 09:48:48
-----分页存储过程 --判断存储过程是否存在 if OBJECT_ID('proc_Page') is not null --删除存储过程 drop proc proc_Page go --创建存储过程 create proc proc_Page --参数 @ClaId int=0, --班级Id @Sage datetime=null, --出生日期 @Sname nvarchar(10)=null, --学生名称 @SmallScore int=0, --小成绩 @BigScore int=0, --大成绩 @CID int=0, --课程Id @Tname nvarchar(10)=null, --讲师名字 @PageIndex int, --当前页 @PageSize int, --每页条数 @TotalCount int out, --总条数 @order int=1 --1升序 0降序 as --变量 declare @sql varchar(max), --总sql @sqlWhere varchar(max), --条件 @rid int, --分页条件 @countSql nvarchar(max) --个数sql set @sql=''; set @sqlWhere=' where 1=1'; set @rid=(@PageIndex-1)*

MySQL索引、视图、存储过程

自闭症网瘾萝莉.ら 提交于 2020-01-08 06:02:42
一、索引的概念 数据库中的索引与书籍中的目录类似 在一本书中,无需阅读整本书,利用目录就可以快速查找所需信息 书中的目录是一个词语列表,其中表明了包含各个词的页码 数据库索引 在数据库中,索引使数据库程序无须对整个表进行扫描,就可以在其中找到所需数据 数据库中的索引是某个表中一列或者若干列值得集合,以及物理标识这些值得数据页的逻辑指针清单 索引优点:可以快速找到数据 缺点:占用硬盘资源 二、索引的作用 设置了合适的索引之后,数据库利用各种快速的定位技术,能够大大加快查询速率 特别是当表很大时,或者查询涉及到多个表时,使用索引可使查询加快成千倍 可以降低数据库的IO读写成本,并且索引还可以降低数据库的排序成本 通过创建唯一性索引保证数据表数据的唯一性 可以加快表与表之间的连接 在使用分组和排序时,可大大减少分组和排序时间 三、索引的分类 普通索引 这是最基本的索引类型,而且它没有唯一性之类的限制 唯一性索引 这种索引和前面的“普通索引”基本相同,但有一个区别:索引列的所有值都只能出现一次,即必须唯一 唯一性索引允许为空,但是只能有一次为空 主键 主键是一种唯一性索引,但它必须指定为“PRIMARY KEY” 全文索引 MySQL从3.23.23版开始支持全文索引和全文检索。在MySQL中,全文索引的索引类型为FULLTEXT,全文索引可以在VARCHAR或者TEXT类型的列上创建

用SQL语句查找包含有某个关键字的存储过程、触发器、函数等等

£可爱£侵袭症+ 提交于 2020-01-08 03:11:45
用SQL语句查找包含有某个关键字的存储过程、触发器、函数等等,SQL语句如下: select OBJECT_NAME(id) as 存储过程,id from syscomments where id in ( select object_id(name) from dbo.sysobjects where xtype='P' --存储过程为P ) and text like '%FieldName%' --关键字 group by id 或 select name from sysobjects o, syscomments s where o.id = s.id and text like '%Extent1%' --and o.xtype = 'P' xtype:对象类型。可以是下列对象类型中的一种: C = CHECK 约束 D = 默认值或 DEFAULT 约束 F = FOREIGN KEY 约束 L = 日志 FN = 标量函数 IF = 内嵌表函数 P = 存储过程 PK = PRIMARY KEY 约束(类型是 K) RF = 复制筛选存储过程 S = 系统表 TF = 表函数 TR = 触发器 U = 用户表 UQ = UNIQUE 约束(类型是 K) V = 视图 X = 扩展存储过程 来源: https://www.cnblogs.com/Fooo/p

pl/sql编程/存储过程/存储函数/触发器

回眸只為那壹抹淺笑 提交于 2020-01-08 02:16:36
pl/sql编程语言 pl/sql编程语言是对sql语言的扩展,使得sql语言具有过程化编程的特性。 pl/sql编程语言比一般的过程化编程语言,更加灵活高效。 pl/sql编程语言主要用来编写存储过程和存储函数等。 结构: declare --变量声明区域 begin --逻辑操作区域 end ; --可以把整个结构理解为java中的main方法 实例 ---声明方法 ---赋值操作可以使用:=也可以使用into查询语句赋值 declare --变量声明区域 i number ( 2 ) : = 10 ; s varchar2 ( 10 ) : = '小明' ; ena emp . ename % type ; ---引用型变量 emprow emp % rowtype ; ---记录型变量 begin dbms_output . put_line ( i ) ; --类似与控制台输出 dbms_output . put_line ( s ) ; select ename into ena from emp where empno = 7788 ; --将查询到的数据通过into赋值到ena dbms_output . put_line ( ena ) ; select * into emprow from emp where empno = 7788 ; dbms_output