zoukankan      html  css  js  c++  java
  • 存储过程--mysql

    https://zhuanlan.zhihu.com/p/23423264

    存储过程-官方解释:

    是sql语句和控制语句的预编译集合。以一个名称存储并作为一个单元处理。
    

    存储过程-直白的说:

    把需要的命令预编译好。存到数据库。只在第一次的时候需要编译,存储后,以后使用的时候客户端直接(传参)调用。各种省事。

    优点:

    增强sql语句的功能性和灵活性
    实现较快的执行速度
    减少网络流量【因为往数据库传递的参数少了。所以请求少了】
    

    怎么使用:

    A、首先需要DELIMITER 语句来修改定界符
    B、然后创建存储过程【CREATE PROCUDURE】过程体中可以用 in 和 out 传参。
    C、通过CALL来调用
    
    为什么使用DELITIMITER 修改定界符?
    mysql默认以分号作为sql语句的结束来进行执行,当我们在创建存储过程时,为
    了不让完整的存储过程语句由于分号而提前执行,需要临时规定以//或者$$来作
    为结束符号。这样的话,创建存储过程时,中间的分号会被忽略,直到遇到//符
    号才执行语句。

    注意:

    A、因为存储过程的 过程体不可修改,所以设置错误后,一般都是删除后,重新创建。
    B、设置的参数,不要和表中的字段名字相同。
    DROP PROCEDURE 名字;  删除命令
    

    举例:【带有一个参数的存储过程 IN】

    @var int   p_id 关联id
    delimiter // 重新定义定界符
    create procedure  removeUserId(IN p_id  INT  UNSIGNED)
    BEGIN
    DELETE FROM users where id = p_id;
    END
    //
    delitimer ;  这里是把定界符在修改回来
    CALL removeUserId(3); 调用

    举例:【带有IN 和 OUT类型参数的存储过程】
    @var int   p_id 关联id
    @var int  userNums 删除后剩下的条数
    DELITIMER //
    CRTEATE PROCEDURE removeAndReturnUserNums(IN p_id INT UNSIGNED,OUT userNums INT UNSIGNED) 这里设置了两个参数
    BEGIN
    DELETE FROM users WHERE id = p_id;
    SELECT COUNT(id) FROM USERS INTO userNums;
    END
    //
    DELITIMER ;
    
    CALL removeAndRrturnUserNums(27,@nums)  //这里的@ 是用户变量。下面是总结
    注意:
    mysql变量的术语分类:
    A.用户变量:以"@"开始,形式为"@变量名"
    用户变量跟mysql客户端是绑定的,设置的变量,只对当前用户使用的客户端生效
    B、全局变量:定义时,以如下两种形式出现,set GLOBAL 变量名  或者  set @@global.变量名 
    对所有客户端生效。只有具有super权限才可以设置全局变量


    认识一个系统函数:row_count()

    row_count();  得到操作行数。(单独用没用)
    例子:插入数据
    INSERT test(username) VALUES('A'),('B'),('C'); 
    SELECT ROW_COUNT(); //返回被插入的记录总数 结果为3

    举例:【带有多个 OUT类型参数的存储过程】

    @var SMALLINT p_age 关联p_age
    @var SMALLINT deleteUsers 删除总条数
    @var SMALLINT  userCounts 剩余总条数
    DELIMITER //
    CREATE PROCEDURE rmUserByAgeAndRtInfos(IN p_age SMALLINT UNSIGNED, OUT deleteUsers SMALLINT UNSIGNED, OUT userCounts SMALLINT UNSIGNED)
    BEGIN
    DELETE FROM users WHERE WHERE age = p_age; //删除条件
    SELECT ROW_COUNT() INTO deleteUsers;	//返回刚删的记录
    SELECT COUNT(id) from users INTO userCounts;	//得到剩余的ID数
    END
    //
    DELIMITER ;
    CALL rmUserByAgeAndRtInfos(23, @a, @b);
    SELECT @a, @b;

    总结:

    存储过程一般都是实现复杂一些的功能
    存储过程一般独立来执行。
    存储过程常常针对表操作。
    根据需要定制存储过程。
     
     
     
     
     
  • 相关阅读:
    函数作业1
    函数、装饰器、迭代器、内置方法总练习题
    疑问
    装饰器
    文件练习题1,2
    内置函数练习题和总结
    GET和POST请求的区别
    HTTP请求方法
    HTTP之状态码
    HTTP之响应消息Response
  • 原文地址:https://www.cnblogs.com/benpao1314/p/8472784.html
Copyright © 2011-2022 走看看