1 Star 0 Fork 0

田志恒/Politics

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
第7章.txt 6.03 KB
一键复制 编辑 原始数据 按行查看 历史
田志恒 提交于 2021-05-11 15:45 . 第七章
1.创建存储过程
语法格式:
create procedure 存储过程名( [参数列表])
[begin]
存储过程体;
[end]
说明:
(1)参数:[in|out|inout] 参数名 参数类型
(2)需要在其它数据库中创建存储过程时,则要在名称前面加上数据库的名称,格式为:数据库名.存储过程名。
例1:创建存储过程delete_student,实现通过学号删除给定学生的信息。
delimiter $$
create procedure delete_student1(in xh char(6))
begin
delete from xs where 学号=xh;
select * from xs;
end$$
delimiter ;
2.调用存储过程
语法格式:
call 存储过程名(参数列表);
eg: call delete_student('081102');
select * from xs;
call delete_student1('081103');
3.定义结束标记
语法格式:
delimiter 结束标记
eg: delimiter $$
4.局部变量
(1)定义
语法格式:
declare 变量名1[,变量名2,…] 数据类型 [默认值];
eg:
declare num int(4);
declare str1,str2 char(4);
(2)赋值
set 变量名1=表达式1[,变量名2=表达式2,……];
eg:
set num=50,str1='good';
(3)使用select…into语句赋值
select 字段名1,字段名2,… into 变量名1,变量名2,……
from 表名 where ……
例2:将xs表中学号为'081101'的学生姓名和专业名赋值给变量name和project,并查询结果。
delimiter $$
create procedure fz( )
begin
declare name char(6);
declare project char(10);
select 姓名,专业名 into name,project
from xs where 学号='081101';
select name,project;
end$$
delimiter ;
调用:
call fz();
5.流程控制语句
(1)if语句
if 条件1 then 语句1;
elseif 条件2 then 语句2;
……
else 语句n;
end if
例3:创建存储过程compar,判断用户输入的两个整数的大小,并输出较大的数。
delimiter $$
create procedure compare(in x int,in y int,out max int)
begin
if x>y then set max=x;
elseif x<y then set max=y;
else set max=x;
end if;
end $$
delimiter ;
(2)case语句
语法格式一:
case
when 条件1 then 语句1;
when 条件2 then 语句2;
……
else 语句n;
end case
语法格式二:
case 表达式
when 值1 then 语句1;
when 值2 then 语句2;
……
else 语句n;
end case
例4:创建一个存储过程,针对参数的不同,返回不同的结果。
delimiter $$
create procedure result(in str varchar(4), out sex varchar(4) )begin
case str
when 'm' then set sex='男';
when 'f' then set sex='女';
else set sex='无';
end case;end$$delimiter ;
用第一种格式的CASE语句创建以上存储过程,程序片段如下:
case
when str='m' then set sex='男';when str='f' then set sex='女';
else set sex='无';end case;
(3)循环语句
while循环:
while 条件 do
循环体;
end while
例5:创建存储过程sum_pro,求1+2+3+…+100。
delimiter $$
create procedure sum_pro(out sum int)
begin
declare i int;
set i=1,sum=0;
while i<=100 do
set sum=sum+i;
set i=i+1;
end while;
end$$
delimiter ;
调用:call sum_pro(@sum);
select @sum;
思考:创建存储过程sum_pro,求1+2+3+…n ?
delimiter $$
create procedure sum_pro(in n int,out sum int)
begin
declare i int;
set i=1,sum=0;
while i<=n do
set sum=sum+i;
set i=i+1;
end while;
end$$
delimiter ;
调用:call sum_pro(10,@sum);
select @sum;
repeat循环:
repeat
语句;
until 条件;
end repeat
loop语句:
[begin_label:]
loop
语句;←(语句中写leave语句结束循环)
end loop[end_label]
leave label;
6.处理程序和条件
语法格式:
declare 处理程序的类型 handler for condition_value 存储过程语句;
说明:处理程序的类型:continue、exit、undo。
continue_value:sqlstate:值
例6:创建一个存储过程,向xs表插入一行数据('081101', '王民', '计算机', 1, '1994-02-10', 50 , NULL, NULL),已知学号081101在XS表中已存在。如果出现错误,程序继续进行。
delimiter $$
create procedure my_insert()
begin
declare continue handler for sqlstate '23000' set @x2 = 1;
set @x = 2;
insert into xs values('081216','王民','计算机',1,'1994-02-10',50,NULL,NULL);
set @x=3;
end$$
delimiter ;
调用: call my_insert();
select @x2,@x;
为错误代码命名:
declare 错误名 condition for sqlstate '值';
eg: declare NON_UNIQUE condition for sqlstate '23000';
例7:修改前例中的存储过程,将SQLSTATE '23000' 定义成NON_UNIQUE,并在处理程序中使用这个名称。
delimiter $$
create procedure my_insert1()
begin
declare NON_UNIQUE condition for sqlstate '23000';
declare continue handler for NON_UNIQUE set @x2 = 1;
set @x = 2;
insert into xs values('080021','王民','计算机',1,'1994-02-10',50,NULL,NULL);
set @x=3;
end$$
delimiter ;
7.游标
(1)声明游标
语法格式:
declare 游标名 cursor for select 语句;
eg:
declare xs_curl cursor for select * from xs;
(2)打开游标
open 游标名;
(3)读取游标
fetch 游标名 into 变量名;
(4)关闭游标
close 游标名;
例8:创建一个存储过程,计算xs表中行的数目。
delimiter $$
create procedure xs_row(out number int)
begin
declare xh char(6);
declare found boolean default true;
declare yb_xs cursor for select 学号 from xs;
declare continue handler for not found
set found = false;
set number = 0;
open yb_xs;
fetch yb_xs into xh;
while found=true do
set number = number + 1;
fetch yb_xs into xh;
end while;
close yb_xs;
end$$
delimiter ;
调用存储过程:
call xs_row(@number);
select @number;
8.存储过程的调用、删除和修改
(1)存储过程的调用
call 存储过程名(参数);
例9:创建一个存储过程do_insert1,作用是向xs表中插入一行数据。再创建另外一个存储过程do_insert2,在其中调用第一个存储过程,并根据条件处理该行数据。
create procedure do_insert1()
insert into xs values('080018','王民','计算机',1,'1994-02-10',50,NULL,NULL);
/* 0、更新数据 1、删除数据*/
delimiter $$
create procedure do_insert2(in x int,out str char(8))
begin
call do_insert1();
if x=0 then set str = '更新数据';
elseif x=1 then set str = '删除数据';
end if
end$$
delimiter ;
调用存储过程:
call do_insert2(0,@str);
select @str;
(2)存储过程的删除
drop procedure 存储过程名;
eg:
drop procedure sum_pro;
(3)存储过程特征的修改
alter procedure 存储过程名 [特征];
注意:
如果要修改存储过程的内容,需要先删除存储过程,再重新定义存储过程
9.存储函数
(1)存储函数的创建
(2)存储函数的调用
(3)存储函数的删除
(4)存储函数的修改
10.触发器
11.事件
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/tzhiheng/politics.git
git@gitee.com:tzhiheng/politics.git
tzhiheng
politics
Politics
master

搜索帮助