【SQL】之存储过程与函数
【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】之存储过程与函数相关推荐
- SQL中存储过程和函数的标准写法
之前一直用的存储过程,今天忽然又接触到跑算法获取返回值的问题,想到可以用函数,好久没用过一时忘了怎么写,还要现查,于是就记录下来,顺便连存储过程一块啦. 存储过程: CREATE PROC dbo.存 ...
- sql 存储过程和函数
最近在学习数据库,上课过程中总是在许多知识点有或多或少的问题,对于这些问题的产生,大概是由于我听课习惯所造成的吧,好啦,废话不多说,开始今天到主题吧. 首先介绍SQL的存储过程,先来给它定义,存储过程 ...
- SQL Server中的CLR编程——用.NET为SQL Server编写存储过程和函数
很早就知道可以用.NET为SQL Server2005及以上版本编写存储过程.触发器和存储过程的,不过之前开发的系统要么因为历史原因用的是SQL2000要么根本用不着在SQL Server中启用CLR ...
- 删除数据库中所有存储过程和函数的sql语句
-删除数据库中所有存储过程和函数的sql语句 USE [TmpDb] SELECT IDENTITY( INT,1,1 ) flag , [name] NAMES,xtype INT ...
- SQL编程---存储过程和存储函数
1.基本概念 存储过程和函数是事先经过编译并存储在数据库中的一段 SQL 语句的集合. 2.存储过程和函数的好处 提高代码的复用性. 减少数据在数据库和应用服务器之间的传输,提高效率. 减少代码层面的 ...
- oracle字段公式怎么执行,Oracle 在存储过程或函数中执行字符串sql PDF 下载
主要内容: 有时,我们需要在存储过程或函数中根据条件拼凑一些sql字符串语句,然后再执行拼凑后的sql字符串,如何做到呢? 参考以下代码: FUNCTION CALCULATE_TARGET_SCOR ...
- SQL存储过程和函数
SQL存储过程: 由来:在具体应用中,一个完整的操作会包含多条SQL语句,在执行过程中需要根据前面SQL语句的执行结果有选择的执行后面的SQL语句.因此,mysql提供了数据库对象存储过程和函数. 定 ...
- mysql 存储过程 sql变量_SQL基础-变量 存储过程和函数
一.变量 1.系统变量:全局变量.会话变量 说明:由系统提供,属于服务器层面.如果是全局级别,则需要加 global,如果是会话级别,则需加 session,如果不写,则默认 session.全局变量 ...
- 【PL/SQL】匿名块、存储过程、函数、触发器
名词解释 子程序:PL/SQL的过程和函数统称为子程序. 匿名块:以DECLARE或BEGIN开始,每次提交都被编译.匿名块因为没有名称,所以不能在数据库中存储并且不能直接从其他PL/SQL块中调用. ...
- SQL存储过程与函数
目录 1. 存储过程概述 1.1 理解 1.2 分类 2. 创建存储过程 3. 调用存储过程 3.1 调用格式 4.存储函数的使用 4.1 语法分析 4.2 调用存储函数 4.4 对比存储函数和存储过 ...
最新文章
- Python数字类型及操作汇总(入门级)
- WPF程序中的XPSDocumentViewer
- 第八周项目一-数组作数据成员(1)
- Windows异常学习笔记(一)—— CPU异常记录模拟异常记录
- C/C++实现读取当前文件夹下的文件-popen
- osg第三方插件的编译方法(以jpeg插件来讲解)
- 风格迁移--U-GAT-IT模型(ICLR 2020)
- Magento: 判断是否为手机浏览 Optimise Web's Mobile Detect Class for Magento
- 科研必备?年入百万?来看这份知乎大佬的图形学书籍清单!
- 基于SpringCloud+MySQL+Mybait+Vue的数字货币交易系统(附:源码+课件)
- 九型人格在招聘中的应用策略
- XMPP即时通讯协议使用(前传)——协议详解
- 内置函数--inline
- 离线安装vscode
- ptp输出内容包含什么_PTP 无线传输
- 山西大学生计算机设计大赛,2017中国大学生计算机设计大赛山西赛区决赛在中北大学成功举办...
- 八股总结(二)计算机网络与网络编程
- 一起学习R语言吧——R语言+RStudio
- matplotlib-04 xlabel设置x轴的标签
- “印象笔记”使用笔记
热门文章
- 图灵对计算机行业的贡献论文,这届图灵奖得主究竟做了什么贡献?这篇1974年的论文给了我们答案...
- 计算机常用芯片,笔记本电脑常用芯片大全
- OpenFire源码学习之二十九:openfire集群配置
- 常用开关电源芯片大全
- 2022 最新 Android 基础教程,从开发入门到项目实战【b站动脑学院】学习笔记——第八章:高级控件
- 什么是字节码,采用字节码的好处是什么?
- CTFHub-SSRF---(Post请求/上传文件/FastCGI/Redis/URL/数字IP/302跳转/DNS重绑定 Bypass)
- 训练ChatGPT的必备资源:语料、模型和代码库完全指南
- JS-一张纸折叠多少次可达到珠穆朗玛峰的高度
- Pygame中的两种键盘按键捕获方式