将其定义为片段,但是这种方法不好,所以使用th:block。
引用
该标签不影响静态页面。
MySQL 存储过程
SQL语句需要先编译然后执行,而存储过程()是一组完成特定功能的SQL语句。 它们被编译并存储在数据库中。 用户通过指定存储过程的名称并提供参数(如果有)来调用它们。 执行它。
存储过程是在数据库中创建并保存的可编程函数,可以由 SQL 语句和控制结构组成。 当您想要跨不同应用程序或平台执行相同的功能或封装特定功能时,存储过程非常有用。 数据库中的存储过程可以看作是编程中面向对象方法的模拟,它允许控制数据的访问方式。
存储过程的优点:
1.增强SQL语言的功能和灵活性:存储过程可以用控制语句来编写,具有很强的灵活性,可以完成复杂的判断和更复杂的操作。
2、标准组件编程:存储过程创建后,可以在程序中多次调用,而无需重写存储过程的SQL语句。 数据库专业人员可以随时修改存储过程,而不会影响应用程序源代码。
3、执行速度更快:如果一个操作包含大量SQL代码或者执行多次,存储过程的执行速度将比批处理快得多。 因为存储过程是预编译的。 当存储过程第一次运行时,优化器会对查询进行分析和优化,最终将执行计划存储在系统表中。 Batch-SQL语句每次运行时都必须进行编译和优化,速度相对较慢。
4、减少网络流量:对于约定数据库对象的操作(如查询、修改),如果将这个操作涉及到的SQL语句组织成一个存储过程,那么当在客户端计算机上调用该存储过程时,将会通过网络传输的只是那个调用语句,减少了网络流量,降低了网络负载。
5、充分利用它作为安全机制:通过限制执行某个存储过程的权限,可以限制相应数据的访问权限,避免非授权用户访问数据,保证数据的安全。 。
.0以后开始支持存储过程,提高了数据库的处理速度和编程的灵活性。
MySQL存储过程的创建
语法
过程名称 ([IN | OUT | INOUT]) 参数名称数据类型 [IN | OUT | INOUT] 输出 | INOUT] 参数名称数据类型...]]) [特征...] 过程体
例子:
//
(输出INT)
开始
COUNT(*) INTO s FROM ;
结尾
//
;
分隔符
MySQL 使用“;” 默认作为分隔符。 如果没有声明分隔符,编译器会将存储过程视为SQL语句,因此编译过程会报错。因此,我们需要使用“//”来声明当前的段分隔符,让编译器将两者结合起来
“//”之间的内容被视为存储过程的代码,这些代码不会被执行;
最后一句“;” 表示恢复分隔符
范围
存储过程可以根据需要具有输入、输出以及输入和输出参数。 如果有多个参数,请将它们分开。 存储过程的定义中必须使用MySQL存储过程的参数。 参数类型共有三种: IN OUT INOUT
过程体
流程体的开始和结束用BEGIN和END标记。
调用存储过程时必须指定 IN 参数的值。 如果在存储过程中修改了参数的值,则无法返回,且为默认值。
//
(IN p_in int)
开始
别针;
设置 p_in=2;
别针;
结尾;
//
;
#转移
设置@p_in = 1;
调用(@p_int);
@别针;
结果:
1 存储过程中set p_in =2 不返回。
OUT的值可以在存储过程内部改变并且可以返回
//
(OUT p_out int)
开始
噘;
设置 p_out=2;
噘;
结尾;
//
;
#转移
设置@p_out = 1;
调用(@p_out);
@噘;
结果:
null?看来这个参数传入存储过程后就被清除了。
INOUT 在调用时指定,可以更改并返回
//
(输入输出整数)
开始
;
设置=2;
;
结尾;
//
;
#转移
设置@=1;
称呼 (@) ;
@;
结果
多变的
语法:变量名1[,变量名2....]数据类型[默认值];
数据类型是MySQL数据类型,我就不写了!
变量赋值
语法:SET 变量名=变量值
用户变量
用户变量一般以@开头
注意:滥用用户变量会使程序难以理解和管理。
#在MySQL客户端使用用户变量
将“HELLO WORLD”输入@x;
@X;
设置@y='';
@y;
设置@z=1+2+3;
@z;
结果:
你好世界
#在存储过程中使用用户变量
() (@,'世界');
设置@='你好';
称呼 ();
结果
#在存储过程之间传输全局范围的用户变量
p1() SET @='p1';
p2() ('最后是',@);
调用 p1();
调用 p2();
结果
最后是p1
评论
两种风格的存储过程注释
1.双杠:-一般用于单行注释
2.C风格:一般用于多行注释
存储过程调用
使用 call 和过程名称以及括号,并根据需要在括号内添加参数,如上面的示例所示。
存储过程查询
#查询存储过程
name FROM mysql.proc WHERE db='数据库名称';
从 。 WHERE = '数据库名称';
SHOW WHERE db='数据库名称';
#查看存储过程详细信息
SHOW 数据库.存储过程名称;
存储过程的修改
ALTER 更改创建的预先指定的存储过程,而不影响存储过程或存储功能。
改变{| } [ ....]
:
{ SQL | 没有 SQL | 读取 SQL 数据 | SQL 数据 |
SQL { | } | ''}
参数代表存储过程或函数的名称;
参数指定存储函数的特征
SQL是指子程序中包含SQL语句,不包含读取或写入数据的语句;
NO SQL表示子程序不包含SQL语句
READS SQL DATA 表示子例程包含读取数据的语句。
SQL DATA 表示子例程包含用于写入数据的语句。
SQL{|}指定谁有权限执行,表示只有定义者可以执行,表示调用者可以执行
''为注释信息
例子:
#更改SQL DATA的读写权限并表明调用者可以执行
改变
SQL数据
SQL;
#更改RAEDS SQL DATA的读写权限,并添加注释信息“FIND NAME”
改变
读取 SQL 数据
'查找名称';
删除MySQL存储过程
DROP [进程 1 [,进程 2....]]
从 MySQL 表中删除一个或多个存储过程
MySQL存储过程控制语句
变量范围
内部变量在其范围内具有更高的优先级。 当执行结束时,内部变量消失并且不再可见。 这个内部变量不能再在存储过程之外找到,但可以通过 Out 参数或将值赋给会话变量来保存它们的值。
#变量范围
//
过程()
开始
x1 (5) '外部';
开始
x1 (5) '内部';
x1;
结尾;
x1;
结尾;
//
;
#转移
调用过程();
结果:
内
外
条件语句
IF-THEN-ELSE 语句
#条件语句 IF-THEN-ELSE
删除 IF proc3;
//
proc3(IN 整数)
开始
var int;
设置变量=+1;
如果变量=0 那么
进入t (17);
万一 ;
如果=0则
tSET s1=s1+1;
别的
tSET s1=s1+2;
万一 ;
结尾;
//
;
CASE-WHEN-THEN-ELSE 语句
#CASE-WHEN-THEN-ELSE 语句
//
proc4(输入整数)
开始
;
设置变量=+1;
案例变量
当 0 那么
进入t (17);
当 1 那么
进入t (18);
别的
进入t (19);
结束案例;
结尾;
//
;
循环语句
趁-做…结束-同时
//
过程5()
开始
;
设置变量=0;
WHILE var INTO t (var);
设置变量=变量+1;
结束同时;
结尾;
//
;
...结尾
该语句的特点是执行完操作后检查结果
//
过程6()
开始
酿酒;
设置v=0;
进入 t (v);
设置v=v+1;
直到 v>=5
结尾;
结尾;
//
;
循环...结束循环
//
过程7()
开始
酿酒;
设置v=0;
:环形
进入 t (v);
设置v=v+1;
如果 v >=5 那么
离开;
万一;
结束循环;
结尾;
//
;
标签
标签可以用在begin while 或loop 语句之前,并且语句标签只能在合法语句之前使用。 您可以跳出循环,使执行指令到达复合语句的最后一步。
迭代
通过引用其标签来重新启动复合语句
#
//
proc8()
开始
酿酒;
设置v=0;
:环形
如果 v=3 那么
设置v=v+1;
;
万一;
进入 t (v);
设置v=v+1;
如果 v>=5 那么
离开;
万一;
结束循环;
结尾;
//
;
MySQL存储过程的基本功能
字符串类
(str) //返回字符串字符集
([,...]) //连接字符串
INSTR ( , ) //返回第一次出现的位置,如果不存在则返回0
LCASE() //转换为小写
LEFT ( , ) //从左边取一个字符
( ) //长度
( ) //从文件中读取内容
( , [, ] ) 与 INSTR 相同,但可以指定起始位置
LPAD ( , ,pad ) //在开头重复添加pad,直到字符串长度为
LTRIM() //去掉前导空格
(,count) //重复count次
(str, ,) //替换为str
RPAD ( , ,pad) //在str后面添加pad,直到长度为
RTRIM() //去除后端空格
( , ) //逐个字符比较两个字符串的大小,
(str, [, ]) //从str开头,取一个字符,
注意:MySQL中处理字符串时,默认首字符下标为1,即参数必须大于等于1
('abcd',0,2);
结果:无
('abcd',1,2);
结果:ab
TRIM([[BOTH||] [] FROM]) //删除指定位置的指定字符
UCASE() //转换为大写
RIGHT(,) //获取最后一个字符
SPACE(count) //生成count个空格
数学
ABS() //绝对值
BIN() //将十进制转换为二进制
( ) //向上取整
CONV(,,) //十六进制转换
FLOOR () //向下取整
(, ) //保留小数位数
HEX() //转换为十六进制
注意:可以将字符串传递给 HEX(),并且将返回其 ASC-11 代码。 例如,HEX('DEF') 返回
还可以传入十进制整数并返回其十六进制代码,例如 HEX(25) 返回 19
LEAST ( , [,..]) //求最小值
MOD ( , ) //求余数
POWER (,power) //求指数
RAND([seed]) //随机数
ROUND([,]) //四舍五入到最接近的小数位] 注意:并非所有返回类型都是整数,例如:
回合(1.23);
回合(1.56);
#设置小数位数并返回浮点数据
回合(1.567,2);
1.57
SIGN ( ) // 正数返回 1,负数返回 -1
日期时间类
(date2, ) //将添加到date2
( , ,toTZ ) //转换时区
( ) //当前日期
( ) //当前时间
( ) //当前时间戳
DATE() //返回日期部分
(date2, ) //向date2添加日期或时间
( , ) //使用格式显示
(date2, ) //从date2中减去时间
(date1,date2) //两个日期之间的差异
DAY(日期) //返回日期中的第几天
(date) //英语周
(date) //周(1-7), 1是星期日
(date) //一年中的第几天
(FROM date) //从date中提取日期的指定部分
(year,day) //给定年份和年份中的日期,生成日期字符串
(hour, ,) //生成时间字符串
(date) //英文月份名称
NOW() //当前时间
( ) //将秒转换为时间
( , ) //将字符串转换为时间并以格式显示
( , ) //两个时间差
(time) //时间到秒]
周 ([, ]) //周
YEAR ( ) //年份
() //该月的第几天
HOUR() //小时
(date) //date月份的最后一个日期
() //微秒
MONTH() //月份
() //返回符号,正数或负数或0
SQRT() //平方根