MySQL存储过程入门基础
创建存储过程无参语法:
delimiter //
create procedure 函数名()
begin
业务逻辑
end //
call 函数名() 通过函数名调用存储过程
创建存储过程有参与法:
delimiter //
create procedure 函数名(in 参数名 参数类型,out 参数名 参数类型)
begin
end //
call 函数名() 通过函数名调用存储过程
参数详解:
delimiter声明结束符,使语句执行时遇到;不判断为结束标识
in表示入参,只能是传入参数时赋值,之后不可赋值;
out 表示出参,只能是返回参数时赋值,之后不可赋值;
inout 表示入参和出参都可以赋值;
变量详解:
declare 变量名 varchar(32) default ‘var_value’ 设置默认值
set 变量名 = ‘a’ set给变量赋值
select s.name into 变量名 from sys_user where ID = 1; into给变量赋值
declare声明变量为局部变量,只作用于begin-end中;
set @name = ‘a’
@声明变量为用户变量,作用于当前会话(当前连接)
判断语法:
if 变量名 > 1 then 判断条件中只要不是else必须加then
业务逻辑...
elseif 变量名 < 3 then
业务逻辑...
else
业务逻辑...
end if; 结束
循环语法1:
别名:loop
if 条件 then
业务逻辑...
iterate 别名; iterate表示继续执行当前循环,相当于Java中的continue
end if;
leave 别名; leave表示跳出循环,如不写则是死循环
end loop 别名;
循环语法2:
别名:repeat
until 条件 until表示循环直到条件不成立才继续往下执行
业务逻辑...
end repeat 别名;
循环语法3:
别名:while
条件 do
业务逻辑...
end while 别名;
游标:
游标每次fetch指向的是一行数据的值,当fetch指向最后一行数据是再次fetch会报错(no data错误)异常代码1329或 0200
解决方案:handler句柄捕获异常
declare 布尔变量 boolean default true 布尔类型变量用作捕获异常的判断条件
declare 游标名 cursor for 结果集 此时该游标是没有值的,结果集通过SQL查询
declare continue handler for xxx set 布尔变量 = false 创建handler句柄 捕获xxx异常(此处xxx表示异常代码,一般no data异常捕获常用not found,如:1329表示no data异常)一旦捕获异常就将原有的布尔变量改为false(continue修饰handler句柄时捕获到异常继续往下执行,exit修饰的handler句柄捕获到异常时不继续往下执行,直接停止存储过程)
open 游标名 此时将结果集赋值给游标
循环别名:loop
fetch 游标名 into 变量接收遍历的值 这里的变量顺序要跟查询结果集的SQL中的字段顺序、字段类型一致
if 布尔变量 then
else
leave 循环别名;
end if;
end loop 循环别名;
close 游标名 ;
注意:
在语法中,变量声明->游标声明->handler句柄声明必须按照此先后顺序书写,否则创建存储过程出错;
MySQL中的时间函数:
DATE_ADD(now(),INTERVAL 1 month) 表示获取下个月的当前时间
LAST_DAY(DATE_ADD(now(),INTERVAL 1 month)) 表示获取下个月的最后一天
YEAR(DATE_ADD(now(),INTERVAL 1 month)) 表示获取该日期中的年份
MONTH(DATE_ADD(now(),INTERVAL 1 month)) 表示获取该日期中的月份
DAYOFMONTH(DATE_ADD(now(),INTERVAL 1 month)) 表示获取该日期中的日
根据日期动态创建表:
--创建结束标识符
delimiter //
--创建函数
create procedure create_table()
begin
--创建局部变量
declare table_year int ;
declare table_month int;
declare table_day int;
declare table_day_index int default 1;
declare table_day_str char(2);
declare table_month_str char(2);
declare table_name_str char(10);
--获取下个月的年份
set table_year = YEAR(DATE_ADD(now(),INTERVAL 1 month));
--获取下个月的月份
set table_month = MONTH(DATE_ADD(now(),INTERVAL 1 month));
--获取下个月最后一天
set table_day = DAYOFMONTH(LAST_DAY(DATE_ADD(now(),INTERVAL 1 month)));
--判断月份是否小于10,如成立,前面拼接'0',如不是不需要拼接
if table_month < 10 then
set table_month_str = concat('0',table_month);
else
set table_month_str = concat('',table_month);
end if;
--循环创建表,每月一号是固定的所以'1'为起始条件,下个月的最后一天为结束条件
while table_day_index <= table_day do
--判断天是否小于10,如成立,前面拼接'0',如不是不拼接
if table_day_index < 10 then
set table_day_str = concat('0',table_day_index);
else
set table_day_str = concat('',table_day_index);
end if;
--拿到年、月、日之后拼接字符串作为表名后缀
set table_name_str = concat(table_year,'',table_month_str,'',table_day_str);
--创建用户变量作为拼接SQL的接收变量
set @create_table_sql = concat('create table test_',table_name_str,'(id varchar(36) , name varchar(10) , age int(3))');
--prepare 预编译拼接的SQL
prepare create_table_stmt from @create_table_sql;
--执行编译之后的SQL
execute create_table_stmt;
--删除执行完的预编译变量 DEALLOCATE 可以换成 drop
DEALLOCATE prepare create_table_stmt;
--将循环条件+1
set table_day_index = table_day_index + 1;
--结束循环
end while;
end //
预编译详解:
prepare 预编译变量名 from 用户变量名(拼接之后的SQL) from后面的变量不能使用局部变量,否则报错
execute 预编译变量名 执行编译后的SQL语句
DEALLOCATE prepare 预编译变量名 删除执行完的预编译变量,DEALLOCATE 可以换成 drop
存储过程与函数的区别:
1.写法上的区别:
存储过程的参数列表中可以有传入参数(in)、返回参数(out)、输入输出参数(inout)
函数的参数列表只能有传入参数(in),并且有return 有效返回值,比如return 0;
2.返回值上的区别:
存储过程的返回值可以是多个值;
函数的返回值只有一个;
3.调用方式上的区别:
存储过程的调用方式有:
1. exec 过程名;
2. execute 过程名;
3. 可以在PL/SQL直接调用;
函数的调用方式有:
----调用FUNCTION add_three_numbers为例
----1. 位置表示法调用函数
BEGIN
dbms_output.put_line(add_three_numbers(2,4,5));
END;
----2. 命名表示法调用函数
BEGIN
dbms_output.put_line(add_three_numbers(b=>3, a=>4,c=>2));
END;
----3. 混合使用位置表示法和命名表示法调用函数
BEGIN
dbms_output.put_line(add_three_numbers(3, b=>4,c=>2));
END;
----4. 排除表示法
BEGIN
dbms_output.put_line(add_three_numbers(12,c=>2));
END;
----5. sql调用表示法 --混合表示法
SELECT add_three_numbers(3, b=>4,c=>2) FROM DUAL;
MySQL存储过程入门基础的更多相关文章
- [置顶] Mysql存储过程入门知识
Mysql存储过程入门知识 #1,查看数据库所有的存储过程名 #--这个语句被用来移除一个存储程序.不能在一个存储过程中删除另一个存储过程,只能调用另一个存储过程 #SELECT NAME FROM ...
- MySQL存储过程入门
MySQL存储过程入门 在本教程中,我们将逐步介绍如何使用CREATE PROCEDURE语句开发第一个MySQL存储过程. 另外,我们将向您展示如何从SQL语句调用存储过程. 编写第一个MySQL存 ...
- ava基础MySQL存储过程 Java基础 JDBC连接MySQL数据库
1.MySQL存储过程 1.1.什么是存储过程 带有逻辑的sql语句:带有流程控制语句(if while)等等 的sql语句 1.2.存储过程的特点 1)执行效率非常快,存储过程是数据库的服 ...
- Mysql存储过程入门介绍
delimiter //一般情况下MYSQL以:结尾表示确认输入并执行语句,但在存储过程中:不是表示结束,因此可以用该命令将:号改为//表示确认输入并执行. 一.创建存储过程 1.基本语法: crea ...
- MySQL存储过程入门教程
存储过程介绍 存储过程是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中.用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它.存储过程可由应用程序通过一个调用来执行,而且 ...
- MySQL存储过程入门了解
0.环境说明: mysql版本:5.7 1.使用说明 存储过程是数据库的一个重要的对象,可以封装SQL语句集,可以用来完成一些较复杂的业务逻辑,并且可以入参出参(类似于java中的方法的书写). ...
- MySQL 存储过程入门
存储过程是带有逻辑的SQL语句,优点是执行效率高.缺点是可移植性差 1.存储过程语法 DELIMITER $ --声明结束符 CREATE PROCEDURE pro_test() --创建存储过程 ...
- mysql操作入门基础之对数据库和表的增删改查
一.数据库管理-- 1.登陆数据库 mysql -u root -p; -- 2.查看数据库服务器所有数据库 SHOW DATABASES; -- 3.创建数据库 CREATE DATABASE My ...
- mysql的入门基础操作
1.数据库的简单介绍 1.1 什么是数据库,就是一个文件系统,使用标准sql对数据库进行操作 1.2 常见的数据库 oracle 是oracle公司的数据库,是一个收费的大型的数据库 DB2,是IB ...
随机推荐
- Can a C++ class have an object of self type?
A class declaration can contain static object of self type,it can also have pointer to self type,but ...
- Java设计模式—Proxy动态代理模式
代理:设计模式 代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问.代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理. 图 1. 代 ...
- List如何一边遍历,一边删除?
1.新手常犯的错误 可能很多新手(包括当年的我,哈哈)第一时间想到的写法是下面这样的: public static void main(String[] args) { List<String& ...
- 帮助IT业告别内卷,哪项变革最能被寄予厚望?
近日,中国软件行业协会发布<2021年中国低代码/无代码市场研究报告>,其中提到:我国低代码整体市场规模已达数十亿规模,并将在未来五年保持49.5%的复合增长率.低代码成为整个中国ICT产 ...
- 强化学习实战 | 表格型Q-Learning玩井字棋(四)游戏时间
在 强化学习实战 | 表格型Q-Learning玩井字棋(三)优化,优化 中,我们经过优化和训练,得到了一个还不错的Q表格,这一节我们将用pygame实现一个有人机对战,机机对战和作弊功能的井字棋游戏 ...
- 项目开发中,真的有必要定义VO,BO,PO,DO,DTO这些吗?
存在即是合理的,业务复杂,人员协同性要求高的场景下,这些规范性的东西不按着来虽然不会出错,程序照样跑,但是遵守规范会让程序更具扩展性和可读性,都是前辈血淋淋的宝贵经验,为什么不用? 随着现在后端编程标 ...
- react原理分析--this.state修改引起的重新渲染
整理向,非原创,目的是整理出浅显易懂的方向性说明. 比如现有 this.state={name:"小明",age:18} 我们说修改组件的状态要用this.setState()来实 ...
- PHP安装sqlsrv扩展( Centos系统、或宝塔面板)
最近新安装了一台Centos服务器, 由于软件使用PHP + sqlserver , 因此需要给PHP安装一个sqlsrv扩展, 虽然这个扩展自己也安装过很多次了,但是从来都没有记录下来过,导致偶尔还 ...
- box-shadow(盒子阴影)
box-shadow 属性可以设置一个或多个下拉阴影的框 可以在同一个元素上设置多个阴影效果,并用逗号将他们分隔开.该属性可设置的值包括阴影的X轴偏移量.Y轴偏移量.模糊半径.扩散半径和颜色. 语法: ...
- CF950A Left-handers, Right-handers and Ambidexters 题解
Content 有 \(l\) 个人是左撇子,有 \(r\) 个人是右撇子,另外有 \(a\) 个人既惯用左手又惯用右手.现在想组成一个队伍,要求队伍中惯用左手的人和惯用右手的人相等,试求出团队里面的 ...