数据库存储函数

思想

(问题:数据库字符集,配置问题)

#存储过程做插入

delimiter //

create procedure insertdata(oid int,oprice int,odate date,ocus varchar(64) charset utf8)

begin

insert into orders values

(oid,oprice,odate,ocus);

select * from orders;

end //

delimiter;

drop procedure insertdata;

show create procedure insertdata;

call insertdata(7,500,'2001-5-6','pika');


#修改数据库字符集

alter schema 'day06' default character set utf8;

#变量

#局部变量 申明定义 declare    default 设置初始值

delimiter //

create procedure getsum(in a int,in b int)

begin

declare c int default 0;#定义一个变量c  初始值为0;

set c=a+b;

select c as '和';

end//

delimiter;

call getsum(20,23);

#用户变量 生命周期当前连接

set @x=10;

set @y=23;

set @sum=@x+@y;

select @x;

select @sum;

#会话变量  当前连接有效  重新连接恢复默认值

show session variables;

#全局变量 当前服务有效 重启服务恢复默认值

show global variables;

select @@version;

select @@wait_timeout;


#流程控制:相当于c++里的{}

#begin  end     {}

create procedure test1()

begin

declare x int;

declare y date;

begin

set x=100;

set y=now();

select x,y;

end;

end//

delimiter;

call test1();

#if 结束用end if

delimiter //

create procedure test2(in x int)

begin

if x>100 then

select '大于100';

elseif x=100 then

select '等于100';

else

select '小于100';

endif;

end//

delimiter;

call test2(200);

#case 分支 end case;

delimiter //

create procedure test3(in socre int)

begin

case score

when 10 then select 'A';

when 20 then select 'B';

when 30 then select 'C';

else select 'D';

end case;

end//

delimiter;

call test3(60);

#while 循环语句 end while;

dlimiter //

create produce test4(out sum int)

begin

delete i int default 1;

declare s int default 0;

while i<=10 do

set s=s+i;

set i=i+1;

end while;

set sum=s;

end //

delimiter;

call test4(@s);

select @s;

#loop循环 end loop

delimiter //

create procedure test5()

begin

declare i int default 1;

ins:loop

set i=i+1;

if i=11 then

leave ins;

end if;

end loop;

select i;

end//

delimiter;

call test5();

#repeat 循环 end repeat;

delimiter //

create procedure test6()

begin

declare i int default 1;

repeatb

set i=i+1;

until i>11 #直到满足条件退出,until不能有;

select i;

end//

delimiter;

call test6();

#iterate 必须用在循环里 结束本次循环 进入下次循环

#自定义函数

create function getGrade(mark int)

returns varchar(10)

begin

#...

return(

case floor(mark/10)

when 100 then 'A'

when 90 then 'B'

when 80 then 'C'

else '不及格'

end

);

end//

delimiter;

select getGrade(100);

drop function getgrade;#不区分大小写


存储过程和函数-{DDL,参数类型(in,out,inout),流程控制(

begin end,if,case,while,loop,repeat,iterate)}



触发器:trigger{3种触发方式(insert,update,delete)}

#6种触发器{(before,insert),(after,insert),(before,update) ..........}

new(新的数据)     old(原来的数据)

#创建一个触发器(最初格式)

create trigger trigger_name

before |after   insert|update|delete

on table_name for each row

[trigger_order]

trigger_body

##

create database day09;

use day09;

create table test1(

id int primary key auto_increment,

number decimal(10,2)

)engine innodb default charset utf8;

insert into test1 values(null,1),(null,2),(null,3);

select * from test1;

#创建一个触发器,限制表的修改

#更新成<0的数   =0  更新成>100的数  =100

delimiter //

create trigger tir_test1_update

    before update

on test1 for each row

begin

if new.number<0 then

set new.number=0;

elseif new.number>100 then

set new.number=100;

endif;

end;

//

delimiter;

update test1 set number=-20 where id=1;

select * from test1 where id=1;

update test1 set number=200 where id=2;

select * from test1 where id=2;

#

#触发器时机要搞清楚


#mysql触发器都存放在 information_schema.triggers;
show databases;
use information_schema;
show tables;
select * form information_schema.Triggers ;
select * form information_schema.Triggers  where trigger_name='tir_test1_update1';
use day09;
drop trigger tir_test1_update1;
#做日志(对表做的一切操作都会被记录在日志)触发器做日志

create table  review

(

id int primary key auto_increment,

username varchar(64),

action varchar(20),

action_time datetime

)engine innodb default charset utf8;

delimiter //

create trigger test_insert

after insert  //在插入之后做操作

on test1 for each row

begin

insert into review values(null,user(),'insert',now());

end;//

delimiter;


create trigger test_update

after update  //在插入之后做操作

on test1 for each row

begin

insert into review values(null,user(),'update',now());

end;//

delimiter;


create trigger test_delete

after delete  //在插入之后做操作

on test1 for each row

begin

insert into review values(null,user(),'delete',now());

end;//

delimiter;


select * from review;

insert into test1 values(null,4);

update  test1 set number=20 where id=4;

delete from test1 where id=4;


#触发器中不能将数据返回的存储过程 也不能采用call的动态sql

(可以通过参数带出数据)

#不能使用开始和结束事务

delimiter //

create trigger tri

after delete

on test1 for each row

begin

#select 100;//错误

#declare msg varchar(100);

#select '100' into msg;

select '100' into @msg;

#1 成功

#2 成功

#3 失败   三条语句,中间有一条错误,整个过程就当没有执行过

#保持数据的一致性,回到最初的状态,当作没发生一样

end;//

delimiter;

delete from test1 where id=7;

select @msg;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码字界陈冠希

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值