【SQL】之存储过程与函数

  • 存储过程
    • 类型1:无参数无返回值
    • 类型2:带out
    • 类型3:带in
    • 类型4:带in和out
    • 类型5:带inout
  • 存储函数
  • 存储过程和存储函数对比
  • 存储过程和函数的查看,修改,删除

存储过程的英文是 Stored Procedure 。它的思想很简单,就是一组经过预先编译的 SQL 语句的封装。
执行过程:存储过程预先存储在 MySQL 服务器上,需要执行的时候,客户端只需要向服务器端发出调用存储过程的命令,服务器端就可以把预先存储好的这一系列 SQL 语句全部执行。
和视图、函数的对比:
它和视图有着同样的优点,清晰、安全,还可以减少网络传输量。不过它和视图不同, 视图是虚拟表,通常不对底层数据表直接操作,而 存储过程是程序化的 SQL, 可以直接操作底层数据表,相比于面向集合的操作方式,能够实现一些更复杂的数据处理。一旦存储过程被创建出来,使用它就像使用函数一样简单,我们直接通过调用存储过程名即可。相较于函数,存储过程是 没有返回值的。

存储过程

类型1:无参数无返回值

-- 类型1:无参数无返回值
#创建存储过程1
DELIMITER $CREATE PROCEDURE select_all_data()
BEGINSELECT * FROM emps;
END $DELIMITER;
#存储过程1的调用
CALL select_all_data();#创建存储过程2
DELIMITER //
CREATE PROCEDURE avg_employee_salary()
BEGINSELECT AVG(salary) FROM emps;
END //
DELIMITER;
#调用存储过程2
CALL avg_employee_salary();#创建存储过程3
DELIMITER //
CREATE PROCEDURE show_max_salary()
BEGINSELECT MAX(salary) FROM emps;
END //
DELIMITER;
#调用存储过程3
CALL show_max_salary();

类型2:带out

DESC emps;
DELIMITER //
CREATE PROCEDURE show_min_salary(OUT ms DOUBLE)
BEGINSELECT MIN(salary) INTO msFROM emps;
END //
DELIMITER;
#调用
CALL show_min_salary(@ms);
#查看此变量值
SELECT @ms;

类型3:带in

#创建存储过程,查看某个员工的薪资,并用in参数empname 输入 员工姓名
DELIMITER //
CREATE PROCEDURE show_someone_salary(IN empname VARCHAR(20))
BEGINSELECT salary FROM empsWHERE last_name=empname;
END //DELIMITER;
#调用方式1:
CALL show_someone_salary('Abel');
#调用方式2:
SET @empname = 'Abel';
#SET @empname := 'Abel';    赋值符号  :=
CALL show_someone_salary(@empname);

类型4:带in和out

-- 类型4:带in和out
#创建存储过程,查看emp表的某个员工的薪资,并用in参数empname输入员工姓名,用out参数empsalary输出员工薪资
DELIMITER //
CREATE PROCEDURE show_someone_salary2(IN empname VARCHAR(20),OUT empsalary DECIMAL(10,2))
BEGINSELECT salary INTO empsalary FROM empsWHERE last_name=empname;
END //
DELIMITER;
#调用
SET @empname='Abel';
CALL show_someone_salary2(@empname,@empsalary);SELECT @empsalary;

类型5:带inout

#创建存储过程,查询某个员工领导的姓名,并用inout参数empname输入员工姓名,
DELIMITER $
CREATE PROCEDURE show_mgr_name(INOUT empname VARCHAR(25))
BEGINSELECT last_name INTO empnameFROM empsWHERE employee_id=(SELECT manager_id FROM empsWHERE last_name=empname);END $
DELIMITER;
#调用
SET @empname='Abel';
CALL show_mgr_name(@empname);SELECT @empname;

存储函数

MySQL支持自定义函数,定义好之后,调用方式与调用MySQL预定义的系统函数一样。

-- 存储函数#方法1:加上必要的函数特征
#创建存储函数,参数定义为空,查询Abel的email,并返回,数据类型为字符串型。
DELIMITER //
CREATE FUNCTION email_by_name()
RETURNS VARCHAR (25)DETERMINISTICCONTAINS SQLREADS SQL DATA
BEGINRETURN (SELECT email FROM empsWHERE last_name='Abel');
END //
DELIMITER;#调用1
SELECT email_by_name();SELECT email,last_name FROM emps
WHERE last_name='Abel';#方法2:
#创建函数前执行此语句,保证函数创建会成功
SET GLOBAL log_bin_trust_function_creators=1;#创建存储函数,传入参数emp_id,改函数查询emp_id的email,并返回,数据类型为字符串型
DELIMITER //
CREATE FUNCTION email_by_id(emp_id INT)
RETURNS VARCHAR(25)
BEGINRETURN (SELECT email FROM emps WHERE employee_id=emp_id);
END //
DELIMITER;#调用2
SELECT email_by_id(102);SET @emp_id :=102;
SELECT email_by_id(@emp_id);#举例3:
#创建存储函数count_by_id(),参数传入dept_id,该函数查询dept_id部门的员工人数,并返回,数据类型为整型
DELIMITER //
CREATE FUNCTION count_by_id(dept_id INT)
RETURNS INT
BEGINRETURN(SELECT COUNT(*) FROM emps WHERE department_id=dept_id);
END //
DELIMITER;#调用3
SET @dept_id := 50;
SELECT count_by_id(@dept_id);

存储过程和存储函数对比

存储过程一般用于更新,存储函数一般用于查询结果为一个值并返回时。
存储过程调用语法call,存储函数select。
存储过程可以返回0个或多个返回值,存储函数只能是一个。
存储函数可以放在查询语句中使用,存储过程不行。反之,存储过程的功能更加强大,包括能够执行对表的操作(比如创建表,删除表等)和事务操作,这些功能是存储函数不具备的。

存储过程和函数的查看,修改,删除

存储过程,存储函数的查看:

-- 存储过程,存储函数的查看
#1.show create语句查看存储过程和函数的创建信息
SHOW CREATE PROCEDURE show_mgr_name;
SHOW CREATE FUNCTION count_by_id;
#2.SHOW STATUS语句查看存储过程和函数的状态信息
SHOW PROCEDURE STATUS;SHOW PROCEDURE STATUS LIKE 'show_max_salary';#3.从information_schema.Routines表中查看存储过程和函数的信息
SELECT * FROM information_schema.Routines
WHERE ROUTINE_NAME='email_by_id' AND ROUTINE_TYPE = 'FUNCTION'; #function区分大写
#存储过程和存储函数重名时,补routine_type

存储过程,函数的修改

-- 存储过程,函数的修改
#修改存储过程或函数,不影响存储过程或函数功能,只是修改相关特性。使用ALTER语句实现。
ALTER PROCEDURE show_max_salary
SQL SECURITY INVOKER
COMMENT '查询最高工资';#删除
DROP FUNCTION count_by_id;DROP PROCEDURE IF EXISTS show_min_salary;

【SQL】之存储过程与函数相关推荐

  1. SQL中存储过程和函数的标准写法

    之前一直用的存储过程,今天忽然又接触到跑算法获取返回值的问题,想到可以用函数,好久没用过一时忘了怎么写,还要现查,于是就记录下来,顺便连存储过程一块啦. 存储过程: CREATE PROC dbo.存 ...

  2. sql 存储过程和函数

    最近在学习数据库,上课过程中总是在许多知识点有或多或少的问题,对于这些问题的产生,大概是由于我听课习惯所造成的吧,好啦,废话不多说,开始今天到主题吧. 首先介绍SQL的存储过程,先来给它定义,存储过程 ...

  3. SQL Server中的CLR编程——用.NET为SQL Server编写存储过程和函数

    很早就知道可以用.NET为SQL Server2005及以上版本编写存储过程.触发器和存储过程的,不过之前开发的系统要么因为历史原因用的是SQL2000要么根本用不着在SQL Server中启用CLR ...

  4. 删除数据库中所有存储过程和函数的sql语句

    -删除数据库中所有存储过程和函数的sql语句 USE [TmpDb] SELECT  IDENTITY( INT,1,1 ) flag ,         [name] NAMES,xtype INT ...

  5. SQL编程---存储过程和存储函数

    1.基本概念 存储过程和函数是事先经过编译并存储在数据库中的一段 SQL 语句的集合. 2.存储过程和函数的好处 提高代码的复用性. 减少数据在数据库和应用服务器之间的传输,提高效率. 减少代码层面的 ...

  6. oracle字段公式怎么执行,Oracle 在存储过程或函数中执行字符串sql PDF 下载

    主要内容: 有时,我们需要在存储过程或函数中根据条件拼凑一些sql字符串语句,然后再执行拼凑后的sql字符串,如何做到呢? 参考以下代码: FUNCTION CALCULATE_TARGET_SCOR ...

  7. SQL存储过程和函数

    SQL存储过程: 由来:在具体应用中,一个完整的操作会包含多条SQL语句,在执行过程中需要根据前面SQL语句的执行结果有选择的执行后面的SQL语句.因此,mysql提供了数据库对象存储过程和函数. 定 ...

  8. mysql 存储过程 sql变量_SQL基础-变量 存储过程和函数

    一.变量 1.系统变量:全局变量.会话变量 说明:由系统提供,属于服务器层面.如果是全局级别,则需要加 global,如果是会话级别,则需加 session,如果不写,则默认 session.全局变量 ...

  9. 【PL/SQL】匿名块、存储过程、函数、触发器

    名词解释 子程序:PL/SQL的过程和函数统称为子程序. 匿名块:以DECLARE或BEGIN开始,每次提交都被编译.匿名块因为没有名称,所以不能在数据库中存储并且不能直接从其他PL/SQL块中调用. ...

  10. SQL存储过程与函数

    目录 1. 存储过程概述 1.1 理解 1.2 分类 2. 创建存储过程 3. 调用存储过程 3.1 调用格式 4.存储函数的使用 4.1 语法分析 4.2 调用存储函数 4.4 对比存储函数和存储过 ...

最新文章

  1. Python数字类型及操作汇总(入门级)
  2. WPF程序中的XPSDocumentViewer
  3. 第八周项目一-数组作数据成员(1)
  4. Windows异常学习笔记(一)—— CPU异常记录模拟异常记录
  5. C/C++实现读取当前文件夹下的文件-popen
  6. osg第三方插件的编译方法(以jpeg插件来讲解)
  7. 风格迁移--U-GAT-IT模型(ICLR 2020)
  8. Magento: 判断是否为手机浏览 Optimise Web's Mobile Detect Class for Magento
  9. 科研必备?年入百万?来看这份知乎大佬的图形学书籍清单!
  10. 基于SpringCloud+MySQL+Mybait+Vue的数字货币交易系统(附:源码+课件)
  11. 九型人格在招聘中的应用策略
  12. XMPP即时通讯协议使用(前传)——协议详解
  13. 内置函数--inline
  14. 离线安装vscode
  15. ptp输出内容包含什么_PTP 无线传输
  16. 山西大学生计算机设计大赛,2017中国大学生计算机设计大赛山西赛区决赛在中北大学成功举办...
  17. 八股总结(二)计算机网络与网络编程
  18. 一起学习R语言吧——R语言+RStudio
  19. matplotlib-04 xlabel设置x轴的标签
  20. “印象笔记”使用笔记

热门文章

  1. 图灵对计算机行业的贡献论文,这届图灵奖得主究竟做了什么贡献?这篇1974年的论文给了我们答案...
  2. 计算机常用芯片,笔记本电脑常用芯片大全
  3. OpenFire源码学习之二十九:openfire集群配置
  4. 常用开关电源芯片大全
  5. 2022 最新 Android 基础教程,从开发入门到项目实战【b站动脑学院】学习笔记——第八章:高级控件
  6. 什么是字节码,采用字节码的好处是什么?
  7. CTFHub-SSRF---(Post请求/上传文件/FastCGI/Redis/URL/数字IP/302跳转/DNS重绑定 Bypass)
  8. 训练ChatGPT的必备资源:语料、模型和代码库完全指南
  9. JS-一张纸折叠多少次可达到珠穆朗玛峰的高度
  10. Pygame中的两种键盘按键捕获方式