存储过程的创建和使用实例
MySQL 5.0 版本开始支持存储过程。
存储过程(Stored Procedure)是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象。
存储过程是为了完成特定功能的SQL语句集,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(需要时)来调用执行。
存储过程思想上很简单,就是数据库 SQL 语言层面的代码封装与重用。
优点
- 存储过程可封装,并隐藏复杂的商业逻辑。
- 存储过程可以回传值,并可以接受参数。
- 存储过程无法使用 SELECT 指令来运行,因为它是子程序,与查看表,数据表或用户定义函数不同。
- 存储过程可以用在数据检验,强制实行商业逻辑等。
缺点
- 存储过程,往往定制化于特定的数据库上,因为支持的编程语言不同。当切换到其他厂商的数据库系统时,需要重写原有的存储过程。
- 存储过程的性能调校与撰写,受限于各种数据库系统。
一、存储过程的创建和调用
- 存储过程就是具有名字的一段代码,用来完成一个特定的功能。
- 创建的存储过程保存在数据库的数据字典中。
MYSQL 存储过程中的关键语法
声明语句结束符,可以自定义:
DELIMITER $$
或
DELIMITER //
声明存储过程:
CREATE PROCEDURE demo_in_parameter(IN p_in int)
存储过程开始和结束符号:
BEGIN .... END
变量定义:
DECLARE l_int int unsigned default 4000000;
变量赋值:
SET @p_in=1
SELECT ew.id INTO w_id
创建mysql存储过程、存储函数:
create procedure 存储过程名(参数)
存储过程体:
create function 存储函数名(参数)
实例:
-- 如果已存在同名存储过程,删除
DROP PROCEDURE IF EXISTS P_WalletRecharge;
-- 声明语句结束符,可以自定义
DELIMITER $$
-- 声明存储过程
CREATE PROCEDURE P_WalletRecharge(IN u_id bigint, IN reg_num VARCHAR(50), IN reg_amount decimal(15,2))BEGIN
-- 定义变量DECLARE w_id bigint DEFAULT NULL;START TRANSACTION;-- 查询钱包idSELECT ew.id INTO w_id FROM ev_wallet ew WHERE ew.customer_id = u_id;IF w_id IS NOT NULL THEN-- 充值UPDATE ev_wallet SET banlance = banlance + reg_amount, total_pay = total_pay + reg_amount WHERE id = w_id;INSERT INTO ev_wallet_transaction_record (serial_number, wallet_id, oper_id,amount,account_balance,transaction_method,pay_type,remark,pay_time,transaction_type,transaction_method_int, pay_type_int) VALUE (reg_num, w_id, 7, reg_amount, IFNULL((SELECT banlance FROM ev_wallet WHERE id = w_id), 0), 'CARD_PAY','PREPAY', '手动充值' ,now(), 0, 3, 1);END IF;COMMIT;END$$
DELIMITER ;-- 调用存储过程
CALL P_WalletRecharge(9998, 20201021000100130000, 1200);-- 删除
DROP PROCEDURE IF EXISTS P_WalletRecharge;
二、存储过程的参数
MySQL存储过程的参数用在存储过程的定义,共有三种参数类型,IN,OUT,INOUT,形式如:
CREATEPROCEDURE 存储过程名([[IN |OUT |INOUT ] 参数名 数据类形...])
- IN 输入参数:表示调用者向过程传入值(传入值可以是字面量或变量)
- OUT 输出参数:表示过程向调用者传出值(可以返回多个值)(传出值只能是变量)
- INOUT 输入输出参数:既表示调用者向过程传入值,又表示过程向调用者传出值(值只能是变量)
1. IN
mysql> delimiter $$
mysql> create procedure in_param(in p_in int)-> begin-> select p_in;-> set p_in=2;-> select P_in;-> end$$
mysql> delimiter ;mysql> set @p_in=1;mysql> call in_param(@p_in);
+------+
| p_in |
+------+
| 1 |
+------++------+
| P_in |
+------+
| 2 |
+------+mysql> select @p_in;
+-------+
| @p_in |
+-------+
| 1 |
+-------+
以上可以看出,p_in 在存储过程中被修改,但并不影响 @p_in 的值,因为前者为局部变量、后者为全局变量。
2. OUT
mysql> delimiter //
mysql> create procedure out_param(out p_out int)-> begin-> select p_out;-> set p_out=2;-> select p_out;-> end-> //
mysql> delimiter ;mysql> set @p_out=1;mysql> call out_param(@p_out);
+-------+
| p_out |
+-------+
| NULL |
+-------+#因为out是向调用者输出参数,不接收输入的参数,所以存储过程里的p_out为null
+-------+
| p_out |
+-------+
| 2 |
+-------+mysql> select @p_out;
+--------+
| @p_out |
+--------+
| 2 |
+--------+#调用了out_param存储过程,输出参数,改变了p_out变量的值
3. INOUT
mysql> delimiter $$
mysql> create procedure inout_param(inout p_inout int)-> begin-> select p_inout;-> set p_inout=2;-> select p_inout;-> end-> $$
mysql> delimiter ;mysql> set @p_inout=1;mysql> call inout_param(@p_inout);
+---------+
| p_inout |
+---------+
| 1 |
+---------++---------+
| p_inout |
+---------+
| 2 |
+---------+mysql> select @p_inout;
+----------+
| @p_inout |
+----------+
| 2 |
+----------+
#调用了inout_param存储过程,接受了输入的参数,也输出参数,改变了变量
注意:
1、如果过程没有参数,也必须在过程名后面写上小括号例:
CREATE PROCEDURE sp_name ([proc_parameter[,...]]) ……
2、确保参数的名字不等于列的名字,否则在过程体中,参数名被当做列名来处理
建议:
- 输入值使用in参数。
- 返回值使用out参数。
- inout参数就尽量的少用。
存储过程的创建和使用实例相关推荐
- SQL__存储过程__创建
SQL__存储过程__创建 1.简单存储过程的创建 热身 use xsglgo 2.举例说明 例子如下 -创建1个简单的存储过程YYM,查询所有学生的学号.姓名.课程号和成绩信息,并按成绩降序排列- ...
- (2)存储过程中可以调用其他存储过程吗?_详解Oracle创建存储过程、创建函数、创建包及实例演示...
概述 说句实在的,平时工作基本上不会去背啥创建存储过程.创建函数.创建包之类的语法,但是相信大家面试啥的却基本会笔试这些,所以就对存储过程.函数和包的语法做下总结,也做个备忘!这里面语法大家理解就可以 ...
- mysql语句创建临时表并存入数据_mysql实例:在存储过程中创建临时表并储存数据...
在mysql存储过程中创建临时表,并保存数据到该表,然后根据存储过程调用的例子. 是学习mysql存储过程的好例子,值得参考. 代码: mysql> mysql> CREATE TABLE ...
- mysql 存储过程 set into_mysql存储过程之创建(CREATE PROCEDURE)和调用(CALL)及变量创建(DECLARE)和赋值(SET)操作方法...
本文实例讲述了mysql存储过程之创建(CREATE PROCEDURE)和调用(CALL)及变量创建(DECLARE)和赋值(SET)操作方法.分享给大家供大家参考,具体如下: 存储过程创建(CRE ...
- mysql call procedure into_mysql存储过程之创建(CREATE PROCEDURE)和调用(CALL)及变量...
本文实例讲述了mysql存储过程之创建(CREATE PROCEDURE)和调用(CALL)及变量创建(DECLARE)和赋值(SET)操作方法.分享给大家供大家参考,具体如下: 存储过程创建(CRE ...
- 怎么修改db2服务器名字,服务器创建db2数据库实例名
服务器创建db2数据库实例名 内容精选 换一换 Microsoft SQL Server提供的发布与订阅功能,利用复制技术来实现数据同步,可以通过其提供的发布与订阅功能实现数据的读写分离和线下线上数据 ...
- mysql 动态 建表,mysql数据库动态创建表的实例分享
摘要 腾兴网为您分享:mysql数据库动态创建表的实例分享,易视云3,完美root,刷机大师,手游宝等软件知识,以及清仓兔,找明星,爱普生1500w,txt完结小说全本软件,windows自带画图软件 ...
- mysql中常用函数与存储过程的创建
mysql中常用函数与存储过程的创建 常用函数汇总 数学函数 字符串函数 日期和时间函数 条件判断函数 系统函数 加密函数 其他函数 自定义函数 自定义变量的声明和赋值 基本语法 实例 存储过程 事务 ...
- android native java_在Android Native层中创建Java虚拟机实例
前言 Android应用中JNI代码,是作为本地方法运行的.而大部分情况下,这些JNI方法均需要传递Dalvik虚拟机实例作为第一个参数.例如,你需要用虚拟机实例来创建jstring和其他的Java对 ...
最新文章
- mysql onlibe all_MySQL Online DDL
- 超高损人技巧~~不可不看
- Electron学习-创建一个程序
- mysql 5.7.13安装_安装MySQL 5.7.13
- OneAPM Cloud Test——系统性能监控神器
- MATLAB图像增强程序举例
- 面试官问:能否模拟实现JS的call和apply方法
- html dw map,DW十六 map标签
- ESXi安装时遇到不识别的硬件的处理
- 苹果开发者账号可以创建多少测试证书_苹果开发者账号相关问题解答—企业开发者账号...
- 分享改进 完全定制自己的代码生成器
- C++ 原子操作 std::atomic<int>
- Xshell、Xftp 正版资源
- php获取验证码倒数60秒,yii框架实现注册页面短信验证60秒倒计时
- 孤独星球android app,《孤独星球》终于出了全套免费的旅行指南APP!
- java毕业设计——基于java+AngularJS+jsp的配件营销系统设计与实现(毕业论文+程序源码)——配件营销系统
- lae界面开发工具入门之介绍七--组件篇-文本篇
- PPT演讲时投影仪显示技巧:分屏演示PPT,你可同时看见备注
- mac 开机启动php,mac系统,php-fpm加入开机启动项
- Mitmproxy代理工具(一):环境配置
热门文章
- 笔记本开机后闪一下就关机了
- 域名与公网IP地址(github个人博客)绑定
- 【stable diffusion】图片批量自动打标签、标签批量修改(BLIP、wd14)用于训练SD或者LORA模型
- android mp3进度条和时间,AndroidStudio音乐播放器进度条和歌曲时间的操作
- 零基础可以学3D建模吗?我们为什么要学习3D建模?
- 计算机节能管理,Win7电源管理在哪?Win7电源管理为电脑配置节能方案教程
- Jsp实现Cookie保存用户名和密码(包含:什么是Cookie,Cookie带来的好处,Cookie的主要方法)
- Python项目的目录设置 VSCode Pycharm
- 【SSD20X平台Linux应用开发】串口应用编程
- python查询数据库数据并将数据写入csv文件,并读取