存储过程

一个MySQL视图的优化过程

人走茶凉 提交于 2019-12-25 13:04:58
1. 需要优化的sql 最近做一个基于.net mvc和MySQL的仓储系统的优化工作,遇到了一个执行特别慢的SQL语句,经过一番折腾,终于搞定啦,分享一下过程。问题就是下面这个家伙: create or replace view view_task_meter_info as select t1.TASK_ID,t1.task_no,t1.BINDBOX_BARCODE as box_barcode,t1.EQUIP_BAR_CODE,t1.METER_STATUS,t1.ENTITY_TYPE as RSLT_CODE, -- 设备类别 (SELECT name from data_dictionary_info t01 where t01.domain ='设备类别' and t01.code = t3.EQUIP_CATEG) as T_Equip_categ, -- 类别 (select name from data_dictionary_info t09 where t09.domain = '类型' and t09.code = t3.TYPE_CODE) as T_TYPE_CODE, -- 类型 (select name from data_dictionary_info t09 where t09.domain = '类别' and t09.code = t3

C#调用带返回值的存储过程

家住魔仙堡 提交于 2019-12-25 03:14:03
(1)在SQL Server中建立如下的存储过程: set ANSI_NULLS ON set QUOTED_IDENTIFIER ON GO CREATE PROCEDURE [dbo].[GetNameById] @studentid varchar(8), @studentname nvarchar(50) OUTPUT AS BEGIN SELECT @studentname =studentname FROM student WHERE studentid=@studentid if @@Error<>0 RETURN -1 else RETURN 0 END 该存储过程的作用是根据学号,获取姓名,并使用RETURN关键字来返回值。 如果要在SQL Server的查询分析器中执行该存储过程,对应的SQL语句如下: Declare @studentname nvarchar(50), exec GetNameById @studentname output , @id=2 select @studentname select @@Error (2)编写C#代码: using (SqlConnection conn = new SqlConnection(connStr)) { try { SqlCommand cmd = new SqlCommand(

MySql 和Server Sql的差异

雨燕双飞 提交于 2019-12-25 03:11:21
MySql 和 Server Sql 的差异 1 、自增长列的插入: SQLServer 中可以不为自动增长列插入值, MySQL 中需要为自动增长列插入值。 2 、获取当前时间函数 : SQLServer 写法: getdate() MySQL 写法: now() 3 、从数据库定位到表。 Sqlserver 写法:库名 .dbo. 表名 ;或者:库名 .. 表名 (注:中间使用两个点) select password from Info.dbo.users where userName='boss' 或者 select password from Info..users where userName='boss' mysql 写法:库名 . 表名 select password from Info.users where userName='boss' 4 、判断是否存在某个数据库,若存在,则删除 Sqlserver 写法: IF DB_ID('users') IS NOT NULL DROP DATABASE users Mysql 写法: Drop DATABASEif exists users 拓展:若 sqlserver 数据库正在使用中,删除之前,先要把数据库变成 “ 单一用户 ” ,再删除 ALTER DATABASE users SET SINGLE_USER

存储过程和触发器

匆匆过客 提交于 2019-12-24 12:12:01
为什么需要存储过程 当今的软件大都应用于网络中,而一般应用程序所需数据都保存在数据库中。在没有使用存储过程的数据库应用程序中,用户所编写的应用程序都是从本地计算机(client)向服务器(server)端发送SQL代码来请求对数据库中数据的增删改差操作,服务器对接收到的SQL代码进行编译后执行,并将结果返回给client,再由客户端的软件处理后输出。如果开发者对服务器安全性考虑不周全,就会为黑客提供盗取数据的机会。其中SQL注入是一种常见的方式。 为了防止SQL注入过程泄露企业的商业机密,我们可以通过存储过程把对数据库操作的SQL代码预先编译好并保存在服务器端。这样既减少了网络传输量,又能保证应用程序的运行性能。 然后,我们来看下什么是存储过程 什么是存储过程 存储过程(procedure)类似于C#语言中的方法,它是SQL语句和控制语句的预编译集合。存储过程保存在数据库里,可由应用程序调用执行。 说的简单一点,存储过程就像数据库中运行的方法 存储过程的优点: 执行速度更快---因为存储过程是预编译过的 模块化程序设计—类似方法的复用 提高系统的安全性—防止SQL注入 减少网络流量—只需传输存储过程的名称即可 存储过程分类: 系统存储过程: 系统存储过程提供了管理数据和更新表的机制,并充当从系统表中检索信息的快捷方式。 常用系统存储过程: 用户自定义存储过程:

晒晒我的通用数据访问层

别说谁变了你拦得住时间么 提交于 2019-12-24 11:59:48
注意:本文所介绍的框架已有新版本, 点击后面链接即可阅读。 【ClownFish:比手写代码还快的通用数据访问层】 今天来晒晒我的通用数据访问层。 写了很多年的数据库项目,数据访问嘛,一直是用业务实体+存储过程的方式,因此经常会写很多调用存储过程的代码。这些代码用Ado.net如何写,我想大家应该都知道: 创建Connection, 创建Command, 给命令参数一个一个赋值,然后调用,调用完成后,如果有输出参数,则要读出来,如果有结果集,则要将结果集转换成自己的实体列表,这个过程也是非常机械化的。 总之,调用任何存储过程都需要这样一堆类似的代码。 我是个喜欢最求完美的人,自然不喜欢每个项目都有这样一堆机械代码的存在,于是经过不断的重构代码,慢慢的就形成了自己的通用数据访问层。 我的通用数据访问层具有以下特点: 1. 可用于访问各种类型的数据库,让您的应用程序从特定的数据库类型中解藕出来,从而非常简单地就可以实现对多种数据库的支持。 2. 非常方便的调用存储过程、将数据库的结果转成实体类型(或列表)、调用完成后自动“回写”输出参数到实体对象。 只需要一个调用便可实现这三个操作步骤。 3. 数据访问层可以同时支持多种数据库类型的多个连接。并可以在运行时简单的切换。 4. 数据访问层可以非常方便地实现类似“多帐套数据库”的支持,即根据不同的客户端请求来切换相应的数据库连接。 5.

SQLServer存储过程

别说谁变了你拦得住时间么 提交于 2019-12-24 11:59:26
最基础的存储过程 新建存储过程 CREATE PROCEDURE PR_Sum12 AS BEGIN update formtable_main_122 set fzybcp = '4' WHERE requestid = 26275 END go 修改存储过程 ALTER PROCEDURE PR_Sum12 AS BEGIN update formtable_main_122 set fzybcp = '6' WHERE requestid = 26275 END go 执行存储过程 exec PR_Sum12 进阶存储过程 修改存储过程 ALTER PROCEDURE judge_MachineType @requestid int AS declare @machineSumOne int, @machineSumTwo int BEGIN declare my_cursor_one cursor for SELECT COUNT(*) as machineSum FROM formtable_main_122_dt1 dt1 WHERE dt1.mainid = ( SELECT id FROM formtable_main_122 main WHERE main.requestid = @requestid ) AND dt1.machineType!= 0

MYSQL存储过程及事件

你离开我真会死。 提交于 2019-12-24 10:46:29
关于mysql下的存储过程以及事件的创建 以下这个存储过程主要实现的功能就是查询表里面半年前的数据,假设有就存到文件。然后将数据删除。 CREATE DEFINER = `root`@`localhost` PROCEDURE `NewProc`() BEGIN select COUNT(*) INTO @count from S_ACCOUNT where date_add(registerTime, interval 6 month)<=NOW(); IF @count>0 THEN set @today=TIME_TO_SEC(now()); set @select_sql=concat("select * from S_ACCOUNT where date_add(registerTime, interval 6 month)<=NOW() INTO OUTFILE 'C:/\\",@today,".txt' FIELDS TERMINATED BY ',';"); PREPARE charu FROM @select_sql; EXECUTE charu; delete from S_ACCOUNT where date_add(registerTime, interval 6 month)<=NOW() ; commit; END IF; END; FIELDS

mongodb进阶一之高级查询

荒凉一梦 提交于 2019-12-24 04:36:26
这篇我们来说说mongodb的进阶--------------高级查询 一:各种查询 1:条件操作符 <, <=, >, >= 这个操作符就不用多解释了,最常用也是最简单的。 db.collection.find({ “field” : { $gt: value } } ); // 大于: field > value db.collection.find({ “field” : { $lt: value } } ); // 小于: field < value db.collection.find({ “field” : { $gte: value } } ); // 大于等于: field >= value db.collection.find({ “field” : { $lte: value } } ); // 小于等于: field <= value 如果要同时满足多个条件,可以这样做 db.collection.find({ “field” : { $gt: value1, $lt: value2 } } ); // value1 < field < value2 为了练习,我们先插几条数据 db.users.insert([{name:“Tom”,age:20,sex:“m”},{name:“Lily”,age:40,sex:“f”},{name:“Suby”,age

mybatis 调用存储过程

跟風遠走 提交于 2019-12-24 04:24:47
第一步,在oracle数据库中创建存储过程 create or replace procedure pro_test(ename varchar2, result out varchar2 ) as begin result:='hello,'||ename; end; 第二步,在dao接口中声明调用存储过程的方法 第三步,在mapper中实现该方法 第四步,测试 /** * 调用存储过程 */ public class Test04 { public static void main(String[] args) { SqlSession session = SqlSessionFactoryUtil.getSession(); EmpDao empDao = session.getMapper(EmpDao.class); //声明Map Map<String,Object> map = new HashMap<String,Object>(); //传递入参 map.put("ename","zhangsan"); //设置出参,出参的值暂时设置为null map.put("result",null); //调用存储过程 empDao.testPro(map); //存储过程调用之后,map中的出参就有值了 System.out.println("result:"+map

myBatis调用postgreSQL存储过程

坚强是说给别人听的谎言 提交于 2019-12-24 04:24:31
1.调用没有OUT参数的存储过程: 创建存储过程: create or replace function get_code(a1 varchar(32)) returns varchar(32) as $$       declare the_result varchar(32);       begin       the_result := name from t_project where id = a1;         return the_result;         end;       $$     language plpgsql; sqlMap配置文件: <select id="f1" resultType="String" parameterType="map" statementType="CALLABLE" useCache="false"> <![CDATA[ select get_code( #{a1,mode=IN,jdbcType=VARCHAR} ) ]]> </select> 注:不使用OUT参数的存储过程可以直接用 select 程序: public String generateCode(String a1) { Map<String,String> paramMap = new HashMap<String,String>();