创建存储过程无参语法:

	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存储过程入门基础的更多相关文章

  1. [置顶] Mysql存储过程入门知识

    Mysql存储过程入门知识 #1,查看数据库所有的存储过程名 #--这个语句被用来移除一个存储程序.不能在一个存储过程中删除另一个存储过程,只能调用另一个存储过程 #SELECT NAME FROM ...

  2. MySQL存储过程入门

    MySQL存储过程入门 在本教程中,我们将逐步介绍如何使用CREATE PROCEDURE语句开发第一个MySQL存储过程. 另外,我们将向您展示如何从SQL语句调用存储过程. 编写第一个MySQL存 ...

  3. ava基础MySQL存储过程 Java基础 JDBC连接MySQL数据库

    1.MySQL存储过程   1.1.什么是存储过程 带有逻辑的sql语句:带有流程控制语句(if  while)等等 的sql语句   1.2.存储过程的特点 1)执行效率非常快,存储过程是数据库的服 ...

  4. Mysql存储过程入门介绍

    delimiter //一般情况下MYSQL以:结尾表示确认输入并执行语句,但在存储过程中:不是表示结束,因此可以用该命令将:号改为//表示确认输入并执行. 一.创建存储过程 1.基本语法: crea ...

  5. MySQL存储过程入门教程

    存储过程介绍 存储过程是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中.用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它.存储过程可由应用程序通过一个调用来执行,而且 ...

  6. MySQL存储过程入门了解

    0.环境说明: mysql版本:5.7 1.使用说明 ​ 存储过程是数据库的一个重要的对象,可以封装SQL语句集,可以用来完成一些较复杂的业务逻辑,并且可以入参出参(类似于java中的方法的书写). ...

  7. MySQL 存储过程入门

    存储过程是带有逻辑的SQL语句,优点是执行效率高.缺点是可移植性差 1.存储过程语法 DELIMITER $ --声明结束符 CREATE PROCEDURE pro_test() --创建存储过程 ...

  8. mysql操作入门基础之对数据库和表的增删改查

    一.数据库管理-- 1.登陆数据库 mysql -u root -p; -- 2.查看数据库服务器所有数据库 SHOW DATABASES; -- 3.创建数据库 CREATE DATABASE My ...

  9. mysql的入门基础操作

    1.数据库的简单介绍 1.1 什么是数据库,就是一个文件系统,使用标准sql对数据库进行操作 1.2 常见的数据库 oracle  是oracle公司的数据库,是一个收费的大型的数据库 DB2,是IB ...

随机推荐

  1. css clip样式 属性功能及作用

    clip clip 在学前端的小伙伴前,估计是很少用到的,代码中也是很少看见的,但是,样式中有这样的代码,下面让我们来讲讲他吧! 这个我也做了很久的开发没碰到过这个属性,知道我在一个项目中,有一个功能 ...

  2. Java 设计模式--策略模式,枚举+工厂方法实现

    如果项目中的一个页面跳转功能存在10个以上的if else判断,想要做一下整改 一.什么是策略模式 策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理,最终可以实现解决 ...

  3. 1945-祖安 say hello-String

    1 #define _CRT_SECURE_NO_WARNINGS 1 2 #include<bits/stdc++.h> 3 char str[100][40]; 4 char s[10 ...

  4. 详解 Java I/O 与装饰者模式

    1.I/O分类与装饰者模式 基本java I/O包含两种类型的流,字节流(inputStream.outputStream)与字符流(Writer,Reader),关于I/O操作类的设计,用到了装饰者 ...

  5. 转:ios delegate

    首先,大家应该都明白的是委托是协议的一种,顾名思义,就是委托他人帮自己去做什么事.也就是当自己做什么事情不方便的时候,就可以建立一个委托,这样就可以委托他人帮自己去实现什么方法. 其次,我简单的总结了 ...

  6. [BUUCTF]PWN——ciscn_2019_n_3

    ciscn_2019_n_3 附件 步骤 例行检查,32位,开启了nx和canary保护 本地试运行一下,经典的堆题的菜单 3.32位ida载入 new(),申请了两个chunk,第一个chunk(1 ...

  7. Oracle 函数高级查询

    目录 oracle高级查询 Oracle SQL获取每个分组中日期最新的一条数据 求平均值(为0的参数不均摊) 字符串清除前面的0 判断字符串串是否包含某个字符串 switch 判断 oracle不足 ...

  8. SP8374 PARKET1 - PARKET 题解

    Content 有一个 \(l\times w\) 大小的网格,其四周均被染成了红色,其余部分是棕色,已知红色网格与棕色网格的数量,求 \(l\) 与 \(w\) 的值. Solution 接下来给各 ...

  9. 使用.NET 6开发TodoList应用(5)——领域实体创建

    需求 上一篇文章中我们完成了数据存储服务的接入,从这一篇开始将正式进入业务逻辑部分的开发. 首先要定义和解决的问题是,根据TodoList项目的需求,我们应该设计怎样的数据实体,如何去进行操作? 长文 ...

  10. .NET 6 优先队列 PriorityQueue 实现分析

    在最近发布的 .NET 6 中,包含了一个新的数据结构,优先队列 PriorityQueue, 实际上这个数据结构在隔壁 Java中已经存在了很多年了, 那优先队列是怎么实现的呢? 让我们来一探究竟吧 ...