精华内容
下载资源
问答
  • 存储过程使用场景

    2019-12-26 20:53:17
    存储过程使用 就拿我们公司来说,需要提升性能的地方,都用存储过程,因为存储过程是编译过的,所以使用起来比纯SQL查询速度稍快。应用场景,可能有以下几种:1、隐藏具体查询方式,开发人员只需要知道 存储过程名字...

    存储过程使用

    就拿我们公司来说,需要提升性能的地方,都用存储过程,因为存储过程是编译过的,所以使用起来比纯SQL查询速度稍快。应用场景,可能有以下几种:1、隐藏具体查询方式,开发人员只需要知道 存储过程名字,参数和返回值即可。2、提升性能,会编译成中间语言,执行效率高。3、如果开发团队中,熟悉存储过程的人多,那么就好办了。开发效率能提高。
    不好处也有:1、不可移植性,每种数据库的存储过程不尽相同。2、学习成本高,如果一个团队中懂存储过程的人多,那么还好一点。(PS:DBA经常写存储过程)3、存储过程可能会封装很多业务细节,导致不太好让开发人员理解业务。4、如果存储过程中有复杂运算的话,会增加一些数据库服务端的处理成本。建议:合理使用。
    在项目中使用:
    办公管理项目中,或管理类项目中,表关联关系比较复杂,有时会出现脏数据,比如用户表和角色表的中间表,有时插入数据会只插入了用户id或只插入了角色id时,可以用存储过程晚上检查到这些异常数据,把这些异常数据删除掉。

    展开全文
  • 数据库小白,平时工作偏向数据分析,经常操作数据库,用的比较多的是视图,想了解下什么场景下才会用到存储过程呢?谢谢
  • 一、什么是存储过程简单的说,就是一组SQL语句集,功能强大,可以实现一些比较复杂的逻辑功能,有点类似于应用程序的一个功能函数。存储过程跟触发器有点类似,都是一组SQL集,但是存储过程是主动调用的,且功能比...

    一、什么是存储过程

    简单的说,就是一组SQL语句集,功能强大,可以实现一些比较复杂的逻辑功能,有点类似于应用程序的一个功能函数。

    存储过程跟触发器有点类似,都是一组SQL集,但是存储过程是主动调用的,且功能比触发器更加强大,触发器是某件事触发后自动调用;

    二、存储过程特性

    有输入输出参数,可以声明变量,有if/else, case,while等控制语句,通过编写存储过程,可以实现复杂的逻辑功能;

    函数的普遍特性:模块化,封装,代码复用;

    速度快,只有首次执行需经过编译和优化步骤,后续被调用可以直接执行,省去以上步骤;

    基于以上特性,所以对于一些性能要求高,业务复杂的模块可以写到存储过程中,应用层直接调用即可。

    三、创建简单的存储过程

    3.1基本的语法

    CREATE PROCEDURE pro_now() -- 存储过程名称,自定义

    BEGIN -- 开始存储过程

    # 需要执行操作的sql语句集,可对数据表 进行CRUD 操作

    -- insert some sql here

    end; -- 结束存储过程

    3.2、创建一个查询当前时间的存储过程:

    CREATE PROCEDURE pro_now()

    BEGIN

    SELECT now();

    END;

    3.3、调用存储过程: call pro_now(); – call 关键字, “pro_now()” 存储过程名称

    3.4、查看已创建的存储过程: show PROCEDURE STATUS [ where name=‘pro_now’] ;

    3.5、删除存储过程:DROP PROCEDURE pro_now; – “pro_now” 存储过程名称

    四、创建带参数的存储过程

    4.1、 带输入参数的存储过程, 使用关键字: in

    a、示例如下:

    CREATE PROCEDURE pro_now_in(in time VARCHAR(20) CHARACTER set "utf8")

    -- CHARACTER set "utf8",设定字符集,解决中文乱码

    BEGIN

    SELECT now(),time;

    end;

    b、调用存储过程:

    set @time='当前时间';

    call pro_now_in(@time); -- call pro_now_in('当前时间'); 这样也可以

    c、结果如下:

    1c904e177dc56997770d743bd08655c3.png

    4.2 带输出参数的存储过程,使用关键字: out

    a、示例如下:

    CREATE PROCEDURE pro_now_out(out time VARCHAR(20),out title VARCHAR(20) CHARACTER set utf8)

    BEGIN

    SELECT now(),'当前时间' into time , title;

    end;

    b、调用存储过程:

    call pro_now_out(@times,@title);

    SELECT @title AS "标题",@times AS "时间";

    c、结果:

    2cd14cf9c456eeac6a32a874752b25e4.png

    4.3、带输入、输出参数的存储过程,使用关键字: inout

    a、示例如下:

    CREATE PROCEDURE pro_now_inout(inout name VARCHAR(20),in title VARCHAR(10), out time VARCHAR(10))

    BEGIN

    SELECT CONCAT(name,'',title) AS name,now() into name,time;

    end;

    b、调用存储过程:

    set @name='jack';

    set @title='toady';

    call pro_now_inout(@name,@title,@time);

    select @name as 'name and title',@time as 'time';

    c、结果:

    aedc4d1c883be97f219f37b6f0317c36.png

    d、理解:

    in (输入): name 、title

    out (输出): name 、 time

    CONCAT(name,’’,title) 字符串拼接,对应 name 输出、 now() 对应 time 输出。

    五、创建带控制流程的存储过程

    5.1、if 语句

    a、示例如下:

    CREATE PROCEDURE pro_if(in num INT)

    BEGIN

    DECLARE result VARCHAR(20) CHARACTER set utf8 DEFAULT null;

    IF num = 0 THEN -- 开始if判断,注意用一个等号"="

    set result='num 为0啦'; -- 满足条件

    ELSEIF num > 0 THEN -- 下一个if判断

    set result='num 大于 0';

    ELSEIF num < 0 THEN

    set result='num 小于 0';

    ELSE -- 所有条件不满足的情况下

    set result='num is null or other status';

    end if; -- 结束if 判断

    SELECT result;

    end;

    b、调用存储过程:

    call pro_if('33');

    c、结果如下:

    ad726ddbed5df8e25d7145e5bf41d2a6.png

    5.2 case 语句

    a、示例如下:

    CREATE PROCEDURE pro_case(in num INT)

    BEGIN

    DECLARE result VARCHAR(20) CHARACTER set utf8 DEFAULT null;

    case num -- 开始case 判断

    when 2 THEN -- 满足条件执行

    set result='num 值是2';

    when -2 THEN

    set result='num 值是-2';

    else -- 所有条件不满足,执行

    set result='num 不等于2和-2';

    end case ; -- 结束case语句

    SELECT result;

    end;

    b、调用存储过程:

    call pro_case(-2);

    c、结果如下:

    c0b7dfb22d41748b51bfac112ae7bf31.png

    5.3、while 循环语句

    a、示例如下:

    CREATE PROCEDURE pro_while(in num INT)

    BEGIN

    DECLARE i int;

    DECLARE result int;

    set i=0;

    set result=0;

    while i < num DO -- 开始while 循环

    set result=result+i;

    set i=i+1;

    end while; -- 结束while 循环

    SELECT result,i;

    end;

    b、调用存储过程:

    call pro_while(100);

    c、结果如下:

    d8b93d3cb77a36ed9119f89bacfaef15.png

    六、创建带游标循环的存储过程

    1、示例如下:

    CREATE PROCEDURE pro_cursor(out count int)

    BEGIN

    declare paper_id VARCHAR(1000) ; -- 论文主键id

    declare doctroName VARCHAR(1000) character set gbk; -- 医生名称

    DECLARE paper_hos VARCHAR(1000); -- 医院id

    DECLARE paper_room VARCHAR(100); -- 医生专业

    declare done int DEFAULT false ; -- 自定义控制游标循环变量,默认false

    DECLARE my_cursor CURSOR for (SELECT id,authorName,hospitalId,room

    from yee_article_paper_authorid ); -- 定义游标并输入结果集

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=TRUE; -- 绑定控制变量到游标,游标循环结束自动转true

    OPEN my_cursor; -- 打开游标

    myLoop:LOOP -- 开始循环体,myLoop为自定义循环名,结束循环时用到

    FETCH my_cursor into paper_id,doctroName,paper_hos,paper_room ; -- 将游标当前读取行的数据顺序赋予自定义变量12

    if done THEN -- 判断是否继续循环

    LEAVE myLoop;-- 结束循环

    END IF;

    -- 自己要做的事情,在 sql 中直接使用自定义变量即可

    insert into temp(str_id,name,hospitalId,room)

    VALUES(paper_id,doctroName,paper_hos,paper_room);

    COMMIT; -- 提交事务

    END LOOP myLoop; -- 结束 自定义循环体

    CLOSE my_cursor; -- 关闭游标

    # 循环结束后,统计导入个数

    SELECT count(id) count from temp into count; -- 计算个数

    end

    游标(Cursor)是处理数据的一种方法,为了查看或者处理结果集中的数据,游标提供了在结果集中一次一行或者多行前进或向后浏览数据的能力。

    七、Spring mvc 调取存储过程

    SimpleJdbcCall 类可以被用于调用一个包含 IN 和 OUT 参数的存储过程。你可以在处理任何一个 RDBMS 时使用这个方法,就像 Apache Derby, DB2, MySQL, Microsoft SQL Server, Oracle,和 Sybase。

    7、1创建表:

    CREATE TABLE ssers(

    ID INT NOT NULL AUTO_INCREMENT,

    NAME VARCHAR(20) NOT NULL,

    AGE INT NOT NULL,

    PRIMARY KEY (ID)

    );

    7.2 创建存储过程:

    DELIMITER $$

    DROP PROCEDURE IF EXISTS `TEST`.`getRecord` $$

    CREATE PROCEDURE `TEST`.`getRecord` (

    IN in_id INTEGER,

    OUT out_name VARCHAR(20) CHARACTER set "utf8",

    OUT out_age INTEGER

    )

    BEGIN

    SELECT name, age

    INTO out_name,out_age

    FROM users where id = in_id;

    END $$

    DELIMITER ;

    delimiter是MySQL中的命令,这个命令与存储过程没什么关系。

    其实就是告诉mysql解释器,该段命令是否已经结束了,mysql是否可以执行了。

    即改变输入结束符。

    默认情况下,delimiter是分号“;”。

    7.3 dao 层调用存储过程

    Public class UserDaoImpl implements UserDao {

    @Autowired

    private JdbcTemplate myJdbc;

    @Autowired

    private DataSource dataSource;

    private UserModel userModel;

    @Override

    public UserModel getUser(int id){

    //创建jdbccall对象

    SimpleJdbcCall jdbcCall = new SimpleJdbcCall(dataSource).withProcedureName("getRecord");

    //调用存储过程

    SqlParameterSource in = new MapSqlParameterSource().addValue("in_id", id);

    Mapout = jdbcCall.execute(in);

    UserModel user = new UserModel(0,null,0);

    user.setId(id);

    user.setName((String) out.get("out_name"));

    user.setAge((Integer) out.get("out_age"));

    return user;

    //普通的sql查询

    //String SQL = "select * from users id = ?";

    //UserModel user = myJdbc.queryForObject(SQL,new Object[]{id}, new UserMapper());

    //return user;

    }

    }

    八、存储过程弊端

    不同数据库,语法差别很大,移植困难,换了数据库,需要重新编写;

    不好管理,把过多业务逻辑写在存储过程不好维护,不利于分层管理,容易混乱,一般存储过程适用于个别对性能要求较高的业务,其它的必要性不是很大;

    参考链接:

    https://blog.csdn.net/HaHa_Sir/article/details/79728854

    https://www.cnblogs.com/chenpi/p/5136483.html

    https://www.w3cschool.cn/wkspring/3yh61mmc.html

    展开全文
  • MySql存储过程跟sql server 有一定的区别,使用说明和步骤如下使用说明创建存储过程MySQL中,创建存储过程的基本形式如下:CREATE PROCEDURE sp_name ([proc_parameter[,...]])[characteristic ...] routine_body...

    MySql存储过程跟sql server 有一定的区别,使用说明和步骤如下

    使用说明

    创建存储过程

    MySQL中,创建存储过程的基本形式如下:

    CREATE PROCEDURE sp_name ([proc_parameter[,...]])

    [characteristic ...] routine_body

    其中,sp_name参数是存储过程的名称;proc_parameter表示存储过程的参数列表; characteristic参数指定存储过程的特性;routine_body参数是SQL代码的内容,可以用BEGIN…END来标志SQL代码的开始和结束。

    proc_parameter中的每个参数由3部分组成。这3部分分别是输入输出类型、参数名称和参数类型。其形式如下:

    [ IN | OUT | INOUT ] param_name type

    其中,IN表示输入参数;OUT表示输出参数; INOUT表示既可以是输入,也可以是输出; param_name参数是存储过程的参数名称;type参数指定存储过程的参数类型,该类型可以是MySQL数据库的任意数据类型。

    characteristic参数有多个取值。其取值说明如下:

    LANGUAGE SQL:说明routine_body部分是由SQL语言的语句组成,这也是数据库系统默认的语言。

    [NOT] DETERMINISTIC:指明存储过程的执行结果是否是确定的。DETERMINISTIC表示结果是确定的。每次执行存储过程时,相同的输入会得到相同的输出。NOT DETERMINISTIC表示结果是非确定的,相同的输入可能得到不同的输出。默认情况下,结果是非确定的。

    { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }:指明子程序使用SQL语句的限制。CONTAINS SQL表示子程序包含SQL语句,但不包含读或写数据的语句;NO SQL表示子程序中不包含SQL语句;READS SQL DATA表示子程序中包含读数据的语句;MODIFIES SQL DATA表示子程序中包含写数据的语句。默认情况下,系统会指定为CONTAINS SQL。

    SQL SECURITY { DEFINER | INVOKER }:指明谁有权限来执行。DEFINER表示只有定义者自己才能够执行;INVOKER表示调用者可以执行。默认情况下,系统指定的权限是DEFINER。

    COMMENT 'string':注释信息。

    技巧:创建存储过程时,系统默认指定CONTAINS SQL,表示存储过程中使用了SQL语句。但是,如果存储过程中没有使用SQL语句,最好设置为NO SQL。而且,存储过程中最好在COMMENT部分对存储过程进行简单的注释,以便以后在阅读存储过程的代码时更加方便。

    使用步骤

    1,先建一个表 并插入一条数据

    DROP TABLE IF EXISTS `Users`;

    CREATE TABLE `Users` ( `userId` int(11) NOT NULL AUTO_INCREMENT,

    `userName` varchar(50) DEFAULT NULL,

    `userPassWord` varchar(50) DEFAULT NULL,

    `sex` bit(1) DEFAULT b'0',

    `ages` int(11) DEFAULT '0',

    `createTime` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

    `IsDelete` bit(1) DEFAULT b'0',

    PRIMARY KEY (`userId`) ) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

    INSERT INTO Users VALUES ('1', '小王', '123456', '', '10', '2017-02-06 02:01:01', '');

    2,创建存储过程

    create PROCEDURE pr_getUsers (in userid int) --参数必须括号括起来,IN是代表输入参数如userid; 如果是OUT表示输出参数; INOUT表示既可以是输入

    BEGIN

    select * from Users where userId=userid;

    end

    3,执行存储过程 call pr_getUsers(1);--执行的参数必须括号括起来

    4, 删除存储过程pr_getUsers:DROP PROCEDURE IF EXISTS

    5, 使用ALTER PROCEDURE语句可以修改存储过程的某些特征。

    语法格式为:ALTER PROCEDURE sp_name [characteristic ...]

    其中,characteristic为:

    { CONTAINS SQL | NO SQL | READS SQLDATA | MODIFIES SQL DATA }

    | SQL SECURITY { DEFINER | INVOKER }

    | COMMENT 'string'

    说明:characteristic是存储过程创建时的特征,在CREATE PROCEDURE语句中已经介绍过。只要设定了其中的值,存储过程的特征就随之变化。

    6b3c7b384d51b42cb070d5034f2de4f5.png

    展开全文
  • 存储过程使用场景

    2020-12-22 19:59:47
    决定是否使用存储过程,其实是在权衡:应当将计算移动到数据,还是将数据移动到计算。 计算过程可以抽象为以下3个步骤:读数据,计算,写数据。或者说,操作=存取数据+计算。如果需要的数据量较大,存取数据容易...

    http://tommwq.tech/blog/2020/12/22/284

    决定是否使用存储过程,其实是在权衡:应当将计算移动到数据,还是将数据移动到计算。

    计算过程可以抽象为以下3个步骤:读数据,计算,写数据。或者说,操作=存取数据+计算。如果需要的数据量较大,存取数据容易成为瓶颈,这时应当将计算移动到数据。反之,如果需要的数据较少,但是计算较为复杂,应当将数据移动到计算。

    现在来看存储过程。存储过程运行在数据库中,数据移动距离短,但计算能力有限。因此适合于需要读取大量的记录,而计算规则相对简单的OLAP应用。相反,对于业务规则复杂,数据量小的OLTP应用,更适合使用编程语言。

    有人认为存储过程可以保证数据一致性,这种看法混淆了事务和存储过程,是不正确的。

    展开全文
  • 一、什么是存储过程 简单的说,就是一组SQL语句集,功能强大,可以实现一些比较复杂的逻辑功能,有点类似于应用程序的一个功能函数。 存储过程跟触发器有点类似,都是一组SQL集,但是存储过程是主动调用的,且功能比...
  • 简单了解什么是存储过程,以及存储过程使用场景,和存储函数、触发气的区别:存储过程,存储函数,触发器和事件是自从MySQL 5.0版本以来,这些功能被添加到MySQL数据库引擎,使mysql更加灵活和强大。存储过程:...
  • 然后详细描述了存储过程与 J2EE 和 Web Service 中各种技术的结合使用,这些技术包括 JDBC, IBM DB Bean, WebSphere Adapter for JDBC, DADX, EJB 等,对各种技术的实现方式、使用场景及其优缺点进行了总结和比较。...
  • 分析存储过程使用场景及其优缺点 分析存储过程使用场景 当 一个事务涉及到多个SQL语句时或者涉及到对多个表的操作时就要考虑用存储过程;当在一个事务的完成需要很复杂的商业逻辑时(比如,对多个数据的操作,对 ...
  • 一、什么是存储过程存储过程(Stored Procedure)是在数据库中,一组为了完成特定功能的SQL 语句集,它存储在数据库中,一次编译后永久有效,用户通过指定存储过程的名字并给出参数(可选)来执行存储过程的优点预编译...
  • 存储过程五种使用场景比较

    千次阅读 2018-01-19 01:40:56
    存储过程五种使用场景比较 1. 使用 JDBC API 直接调用存储过程 Java Database Connectivity (JDBC) API 是 J2EE 的一部分,是 Java 语言访问关系数据库的基于标准的首要机制,提供了对数据库访问和缓存管理的直接...
  • 简单了解什么是存储过程,以及存储过程使用场景,和存储函数、触发气的区别:存储过程,存储函数,触发器和事件是自从MySQL 5.0版本以来,这些功能被添加到MySQL数据库引擎,使mysql更加灵活和强大。存储过程:...
  • 1、存储过程只在创建时进行编译,以后每次执行存储过程都不需再重新编译,而一般 SQL 语句每执行一次就编译一次,因此使用存储过程可以大大提高数据库执行速度。 2、通常,复杂的业务逻辑需要多条 SQL 语句。这些...
  • a 使用java 搭建生产测试数据的模拟器(推荐) b 使用mysql 存储过程,生成流量数据直接入库,批量生成数据(这次记录一下这个方式) 模拟场景:模拟10万台车,1年 的流量数据 思路: 查出10万个台车 循环每一个车...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,078
精华内容 831
关键字:

存储过程使用场景