zoukankan      html  css  js  c++  java
  • 关系型数据库的存储过程

     1.定义:存储过程就是一组预先编译好的sql语句集。
    2.优点:提高重用性,减少冗余,减少了sql的编译次数,减少了与服务器连接交互的次数。

    3.存储过程的创建语法

    CREATE PROCEDURE 存储过程名(参数列表)
    BEGIN
        存储过程体;
    END

    4.参数列表包含三部分:参数模式(in/out/in~out),参数名,参数类型

    参数模式:
      in : 需要调用者传入,类似java中的形参
      out : 作为返回值,类似java中的return
      in~out : 调用者传入参数,对应的可以有返回值
    如果存储过程体中只有一句话那么对应的begin end 可以省略;
    存储过程体中每一条sql语句结尾都必须加上分号;
    存储过程结尾需要使用delimiter 标记 重新去设置存储过程的结束标记。

    5.存储过程的调用

    CALL 存储过程名(实参);
    

      

    6.案例

    建employee表,department表,role表

    #空参构造
    DELIMITER $
    CREATE PROCEDURE add1()
    BEGIN
    	SELECT 'SD';
    END $
    CALL radd();
    

      

    #带IN 模式的存储过程
    #通过部门名称查询对应的员工信息
    DELIMITER $
    CREATE PROCEDURE empinfo(IN dept_name varchar(20))
    BEGIN
    	SELECT
    		e.e_id,
    		e.e_name,
    		d.dept_name
    	FROM
    		employee e RIGHT JOIN department d
    	ON
    		e.dept_id=d.dept_id
    	WHERE
    		d.dept_name=dept_name;
    END $
    
    CALL empinfo('开发部')
    

      

    #通过员工部门名称和角色信息,查询员工是否存在,如果存在则显示存在两字,否则显示不存在
    DELIMITER $
    CREATE PROCEDURE empinfo1(IN dept_name VARCHAR(20),IN r_name VARCHAR(20))
    BEGIN
    		DECLARE result int DEFAULT 0;
    		SELECT count(*) INTO result FROM emoloyee e
    		LEFT JOIN department d
    		ON e.dept_id=d.dept_id
    		LEFT JOIN role r
    		ON r.r_id=e.r_id
    		WHERE d.dept_name=dept_name AND r.r_name=r_name;
    		SELECT 
    			IF(result>0,'存在','不存在');
    END $
    CALL emploinfo1('开发部','一级管理员');
    

      

    #带out的存储过程
    #传入员工姓名显示对应的部门名称
    DELIMITER $
    CREATE PROCEDURE empdep(IN empName VARCHAR(20),OUT deptName VARCHAR(20))
    BEGIN
    	SELECT 
    		d.dept_name INTO deptName
    	FROM 
    		employee e LEFT JOIN department d
    	ON
    		e.dept_id=d.dept_id
    	WHERE
    		e.e_name=empName;
    END $
    #调用
    CALL empdep('据',@DeptName);
    SELECT @DeptName;
    

      

    #通过员工姓名返回员工对应的部门名称和角色名称
    CREATE PROCEDURE deptNameAndRoleName(IN emp_name VARCHAR(10),OUT dep_name VARCHAR(20),OUT rol_name VARCHAR(20))
    BEGIN
    	SELECT d.dept_name 部门名称,r.r_name 角色名称 INTO dep_name,rol_name
    	FROM employee e
    	LEFT JOIN department d
    	ON d.dept_id=e.dept_id
    	LEFT JOIN role r
    	ON r.r_name=e.r_name
    	WHERE
    		e.e_name=emp_name
    END $
    
    #调用
    CALL deptNameAndRoleName('hjbj',@deptNAME,@ROLEnaME)
    
    #查看变量
    SELECT @deptNAME,@ROLEnaME;
    

      

    #创建IN~OUT
    #传入对应的工资计算年薪
    DELIMITER $
    CREATE PROCEDURE salaryss(INOUT s1 DOUBLE,INOUT s2 DOUBLE)
    BEGIN
    	SET s1=s1*12;
    	SET s2=s2*12;
    END 
    #调用
    set @s1=1000;
    set @s2=1200;
    CALL salaryss(@s1,@s2);
    SELECT @s1,@s2
    

     7.删除存储过程(一次只能删除一个)

    DROP PROCEDURE 存储过程名;
    

     8.查看存储过程

    SHOW CREATE PROCEDURE 存储过程名
    

     9.修改存储过程(一般创建好不允许修改)

  • 相关阅读:
    MySQL联结查询
    MySQL的一些优化方法
    MySQL 基本操作
    一个关于python定制类的例子
    用python类方法处理参数
    python global的用法
    sqli-libs(29(jspstudy)-31关)
    sqli-libs(23-28a关)
    sqli-libs(11-22关)
    sqli-libs(5-10关)
  • 原文地址:https://www.cnblogs.com/maohaitao/p/11279992.html
Copyright © 2011-2022 走看看