数据库 存储过程

存储过程

是一组为了完成特定功能的sql语句的集合类似于函数,写好了一个存储过程之后,我们像函数一样随时调用sql的集合

使用场景

复杂的,需要很多sql语句联合执行完成的任务,存储过程在执行上比sql语句的执行速度要快,效率也更高

创建存储过程

create table info1 (
id int(4),
name varchar(15),
score decimal(5,2),
pass varchar(12)
);

#可以使用 # 或者 -- 注释

创建存储过程

delimiter $$
#将语句的结束符号从分号,临时改变成两个$$
create procedure proc ()
#创建存储过程,proc为名称可自定义,不能重复,在当前库中唯一,()里不定义任何方法
BEGIN
#过程体开始的关键字
select * from info;
#begin后面跟上的是需要执行的sql语句
end $$
#表示整个语句结束,和上面的定义开始符号一一对应
delimiter;
#将结束语句的分号恢复,delimiter的作用保证整个存储过程中的sql语句能够被完整的执行

创建存储过程 in

delimiter $$
create procedure proc ()
BEGIN
select * from info;
end $$
delimiter;


show procedure status where db='ys66'
#如何查看当前有多少存储过程,第一种方式
show procedure status like '%proc%';
#第二种方式


call proc;
#如何调用存储过程

drop procedure if exists test1;
#如何删除掉存储过程,如果你存在那就删除掉

#存储过程中参数有三种运用的方式
1.in :输入参数,调用者相存储过程传入值
2.out:输出参数,表示存储过程相调用者传出值,可以返回多个值
3.inout:表示调用者向存储过程传入值,存储过程对传入值可能进行额外的的操作之后,返回给调用者。


第一种
delimiter $$
create procedure test1 (in uname char(20))
begin
select * from info where name = uname;
select * from info;
update info set name = '王昊' where name=uname;
end $$
delimiter;

call test1('国企');

#数据清洗和执行数据入库,分析用户行为。
#调用,如果是字符必须要单引号

out

out

delimiter $$
create procedure test2 (out num int)
begin
set num = 100;
end $$
delimiter;

call test2(@num);

insert into info values(2,'股票',@num,'是');
#插入数据,@num = 100 是输出100

输入参数和输出参数

用户行为备注

delimiter $$
create procedure test3 (inout str varchar(10))
begin
select str;
#显示输入的字符
set str = concat(str, '_ys66');
#让传入的字符串做一个拼接
select str 
#加工之后的字符串
end $$
delimiter;

set @str='旅游网';
#先定义参数,在外面传参必须要加@

call test3(@str)
#把参数传进去

update info set name=@str where id = 1;

in:先传入,定义变量的值,初始值
call test3:调用存储过程,把变量的值传入存储过程

存储过程中的控制语句

if else

delimiter $$
create procrdure tet4 (in num int)
begin
if num >= 10 then
set num=num-6;
else
set num==num*2;
end if;
#结束if语句的判断
select num;
end $$
#结束存储过程的语句
delimiter;

set @num=19;

call test4(@num)

update info set id = @num where score = 100;

调用多个参数

范围的方式匹配,完成传参---写入表中
delimiter procedure test7 (inout score int,out grade varchar(15))
begin
if score between 85 and 100 then
set grade = '优秀';
elseif score between 60 and 84 then
else
set grade = '不及格'
end if;
select grade;
end $$
delimiter;

set @score=55;

call test7(@score,@grade);

update info set score=@score,pass=@grade where id =10;


while循环语句

delimiter $$
create procedure test8 (out result int)
begin
decalre a int;
decalre i int;
set a=10;
set i=1;
while i<=10 do 
set a=a+10
set i=i+1
#相当于i++
end while;
set result = a;
end $$
delimiter;

set @result-90;
call test7(@score,@grade);
select @result

#注意点:使用存储过程中,在内部变量不需要加@,外部使用和复制要加@,引用变量在存储过程begin、之后声明变量要用 declare a int; declare i int; 声明变量要加数据类型

#要想使用存储过程里面的结果,必须要out 才能传出参数,在声明存储变量时,要定义好参数的传参方式  in  out  inout .

你可能感兴趣的:(数据库,oracle)