存储过程

MySQL存储过程

試著忘記壹切 提交于 2019-12-06 13:12:42
SQL存储过程? 定义: 为了以后的使用更加简单方便, 从而编写的一条或者多条SQL语句的集合. 是SQL语言的封装和重用. 优劣分析: 优点(简单安全高性能): 1.简化操作 2.防止错误, 保证一致性 3.简化对变动的管理. 4.提高性能 5.灵活 6.加快开发时间 劣势: 1.编写较为复杂 2.需要获得授权.(一般使用的时候都是使用存储过程,而没有创建存储过程的权限) 来源: https://www.cnblogs.com/jrri/p/11986649.html

带参数的存储过程

百般思念 提交于 2019-12-06 13:03:25
带参数的存储过程 创建带参数的sql存储过程:创建带参数的存储过程首先要在存储过程中声明该参数,每个存储过程参数都必须用惟一的名称进行定义。与标准的Transact-SQL变量相同,参数名必须以@为前缀, 创建带参数的存储过程 创建带参数的存储过程首先要在存储过程中声明该参数,每个存储过程参数都必须用惟一的名称进行定义。与标准的Transact-SQL变量相同,参数名必须以@为前缀,并且遵从对象标识符规则。当用户不提供该参数的值时可以使用一个默认值来代替。 在执行带参数的存储过程时,既可以通过显式指定参数名称并赋予适当的值,也可以通过提供在CREATE PROCEDURE语句中给定的参数值(不指定参数名称)来向存储过程传递值。 在存储过程PRO_Student_IN中命名4个参数,其定义顺序为@Chinese、@English、@maths和@class。 例如,将值传递给存储过程指定的参数名称。 EXEC PRO_Student_IN @class="三年一班",@Chinese=85,@maths=85,@English=85 例如,按照参数的位置传递,而不命名参数名称。 EXEC PRO_Student_IN 85,85,85,"三年一班" 1.不带默认值的参数 创建一个参数不带默认值的存储过程,在调用该存储过程时,必须对存储过程中的所有参数进行赋值,如果有一个参数没有赋值

SQL if exists用法

此生再无相见时 提交于 2019-12-06 12:25:21
判断数据库是否存在 if exists (select * from sys.databases where name = ’数据库名’) drop database [数据库名] 判断表是否存在 if exists (select * from sysobjects where id = object_id(N’[表名]’) and OBJECTPROPERTY(id, N’IsUserTable’) = 1) drop table [表名] 判断存储过程是否存在 if exists (select * from sysobjects where id = object_id(N’[存储过程名]’) and OBJECTPROPERTY(id, N’IsProcedure’) = 1) drop procedure [存储过程名] 判断临时表是否存在 if object_id(’tempdb..#临时表名’) is not null drop table #临时表名 判断视图是否存在 --SQL Server 2000 IF EXISTS (SELECT * FROM sysviews WHERE object_id = ’[dbo].[视图名]’ --SQL Server 2005 IF EXISTS (SELECT * FROM sys.views WHERE object

mybatis调用存储过程(@Select方式)

ぐ巨炮叔叔 提交于 2019-12-06 12:16:53
存储过程还不会写的同学可以参考我另一篇文章: https://www.cnblogs.com/liuboyuan/p/9375882.html 网上已经有很多用mybatis调用的教程了,但是大部分是xml方式调用,最近项目中用mybatis plus,没有xml配置文件。本次分享下用@Select注解方式调用。 测试存储过程(语法oracle) create or replace procedure test(name in varchar,gender out varchar) as begin if name = 'xiaoming' then gender := 'man'; else gender := 'woman'; end if; end; 有些程序中使用的用户还需要授权才能执行 grant execute on 库名.TEST to 用户; --别忘了给用户授权 准备测试pojo import lombok.*; @Data @NoArgsConstructor @ToString public class People { private String name; private String gender; } mapper的写法 import org.apache.ibatis.annotations.*; import org.apache.ibatis

性能调优5:执行计划

[亡魂溺海] 提交于 2019-12-06 11:41:20
原文: 性能调优5:执行计划 查询优化器基于当前的统计信息和参数,衡量开销之后,选择“最优”的执行计划,需要注意的是,“最优”是相对的,优化器不可能穷举所有的执行计划来评估其开销,这个“最优”的标准是对当前参数和当前的统计信息来说的,优化器从生成的备选执行计划中选择开销最小的。由于执行计划的编译和生成是很耗费资源和时间的,因此,SQL Server会把生成的任一执行计划缓存起来,以便重用。 由于关系表的数据和结构可能发生改变,数据更新会导致统计信息过时,而之前的参数可能不具有代表性,使得已生成的执行计划不能代表其他参数值,导致查询性能低下。因此,应当监控执行计划的性能,当发现参数嗅探问题时,应该及时修改代码以重编译;当发现统计信息过期时,应及时更新统计信息等。 一,缓存机制 SQL Server使用特定的缓存机制,以重用第一次执行查询时生成的执行计划,总的来说,SQL Server内部有以下四种执行计划缓存机制: Ad hoc 查询缓存 参数化Ad Hoc查询缓存 sys.sp_executesql 执行的查询,是一种参数化的查询语句 存储过程 对于Adhoc查询的缓存,是SQL Server自动进行的,用户不能干预,而后两种是用户可以干预的,用户可以通过优化代码来复用“模板化”的查询。所谓模板化语句,是指除了个别的常量发生变化之外,语句主体不变,可以把变化的常量作为一个参数

存储过程

霸气de小男生 提交于 2019-12-06 09:53:16
存储过程 概念 存储过程 Procedure 是一组为了完成特定功能的 SQL 语句集合,经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数来执行。 程中可以包含逻辑控制语句和数据操纵语句,它可以接受参数、输出参数、返回单个或多个结果集以及返回值。 由于存储过程在创建时即在数据库服务器上进行了编译并存储在数据库中,所以存储过程运行要比单个的 SQL 语句块要快。同时由于在调用时只需用提供存储过程名和必要的参数信息,所以在一定程度上也可以减少网络流量、简单网络负担。 存储过程的优点 A 、 存储过程允许标准组件式编程 存储过程创建后可以在程序中被多次调用执行,而不必重新编写该存储过程的 SQL 语句。而且数据库专业人员可以随时对存储过程进行修改,但对应用程序源代码却毫无影响,从而极大的提高了程序的可移植性。 B 、 存储过程能够实现较快的执行速度 如果某一操作包含大量的 T-SQL 语句代码,分别被多次执行,那么存储过程要比批处理的执行速度快得多。因为存储过程是预编译的,在首次运行一个存储过程时,查询优化器对其进行分析、优化,并给出最终被存在系统表中的存储计划。而批处理的 T-SQL 语句每次运行都需要预编译和优化,所以速度就要慢一些。 C 、 存储过程减轻网络流量 对于同一个针对数据库对象的操作,如果这一操作所涉及到的 T-SQL 语句被组织成一存储过程

触发器

匆匆过客 提交于 2019-12-06 09:52:50
触发器 概念 触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程。触发器主要是通过事件进行触发被自动调用执行的。而存储过程可以通过存储过程的名称被调用。 触发器对表进行插入、更新、删除的时候会自动执行的特殊存储过程。触发器一般用在 check 约束更加复杂的约束上面。触发器和普通的存储过程的区别是:触发器是当对某一个表进行操作。诸如: update 、 insert 、 delete 这些操作的时候,系统会自动调用执行该表上对应的触发器。 SQL Server 2005 中触发器可以分为两类: DML 触发器和 DDL 触发器,其中 DDL 触发器它们会影响多种数据定义语言语句而激发,这些语句有 create 、 alter 、 drop 语句。 DML 触发器分为: 1 after 触发器(之后触发) A insert 触发器 B update 触发器 C delete 触发器 2 instead of 触发器 (之前触发) 其中 after 触发器要求只有执行某一操作 insert 、 update 、 delete 之后触发器才被触发,且只能定义在表上。而 instead of 触发器表示并不执行其定义的操作( insert 、 update 、 delete )而仅是执行触发器本身。既可以在表上定义 instead of 触发器,也可以在视图上定义。

MySQL存储过程事务

余生长醉 提交于 2019-12-06 09:23:12
day61 保存在MySQL上的一个别名 > 一坨SQL语句 -- delimiter // -- create procedure p1() -- BEGIN -- select * from student; -- INSERT into teacher(tname) values("ct"); -- END// -- delimiter; call p1(); #把sql语句封装进p1中 注释内容(创建存储过程)执行完,可以通过call调用(执行存储过程)。 在函数中: 也可通过pymysql调用存储过程 1 import pymysql 2 3 #打开 4 conn = pymysql.connect(host= "localhost", user = 'root', password='112358', database = 'db3') 5 #拿 6 cursor = conn.cursor() 7 cursor.callproc('p1')#p1存储过程 8 result = cursor.fetchall() #拿 9 10 print(result) 11 #关闭数据库 12 cursor.close() 13 conn.close() cursor.callproc('p1') 执行结果: ((1, '男', 1, '理解'), (2, '女', 1, '钢蛋'

存储过程定期删除冗余数据

[亡魂溺海] 提交于 2019-12-06 08:33:13
需求业务端写入数据时会存在不同批次号的重复数据,领导需要说用存储过程+数据库事件来定时清理mysql表冗余数据,那就这么整了 配置定时事件event,一天清理一次 检查数据库是否开启event调度 Ok 来源: https://www.cnblogs.com/shaozhiqi/p/11972636.html

SQL存储过程相关信息查看

北城余情 提交于 2019-12-06 08:28:22
--1、查看所有存储过程与函数 exec sp_stored_procedures 或者 select * from dbo.sysobjects where OBJECTPROPERTY(id, N'IsProcedure') = 1 order by name --2、查看存储过程的内容 select text from syscomments where id=object_id('存储过程名称') -- 或者用 sp_helptext 存储过程名称 --3、查看存储过程的参数情况 select '参数名称' = name, '类型' = type_name(xusertype), '长度' = length, '参数顺序' = colid, '排序方式' = collation from syscolumns where id=object_id('存储过程名称') --或者 --查看存储过程参数信息: --如果返回值>1,则有参数。否则无 CREATE PROC sp_PROC_Params @procedure_name sysname , --存储过程或者用户定义函数名 @group_number int=1 , --存储过程的组号,必须在0到32767之间,0表示显示该存储过程组的所有参数 @operator nchar(2)=N'=' --查找对象的运算符 AS