【存储进程】MySQL存储进程,存储函数ITeyetengxun - 凯时娱乐

【存储进程】MySQL存储进程,存储函数ITeyetengxun

2018-09-21 11:12:31 | 作者: 鸿哲 | 标签: 进程,函数,参数 | 浏览: 5137

存储例程是存储在数据库服务器中的一组sql句子,经过在查询中调用一个指定的称号来履行这些sql句子指令

Mysql存储例程实践包含了存储进程和存储函数,它们被统称为存储例程。


存储进程首要完结在获取记载或刺进记载或更新记载或删去记载,即完结select insert delete update等的作业。
而存储函数只完结查询的作业,可接受输入参数并回来一个成果。

 

show procedure status检查已创立的存储进程


-

CALL p_draws(@a);
SELECT @a;

 

 



CREATE TABLE `myisam` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(50) default NULL,
`post` text,
PRIMARY KEY (`id`)

 

 

 

 

-create procedure 存储进程名(参数)
调用存储进程
call 存储进程名();

取总记载
create procedure select_myisam()
select * from myisam;
在终端运转并调用
#call select_news();


声明参数时规则要运用关键字IN,OUT,INOUT。
其间:
IN:用于输入参数
OUT:用于回来参数
INOUT:用于向存储进程传递参数值,假如该值改动则回来

取某条记载
drop procedure if exists select_myisam;
show procedure status;
create procedure select_myisam(IN id int,OUT name varchar(50))
select name from myisam where id=id;
调用#call select_myisam(1,@name);
1是咱们要传入的信息编号,title是要回来的对应信息编号标题,由所以OUT所以再调用时要在其前加@



取总数
create procedure getNum(OUT num int)
select COUNT(*) as num from myisam;
call getNum(@num);



多行存储进程写法:
create procedure sp_name()
begin
………
end



履行 call procedure()句子
假如有回来值,履行select   @ar,回来履行成果。

-create function 存储函数名(参数)

与存储进程回来参数不同的是存储函数在界说时没用直接声明哪个变量是回来参数,而仅仅运用了returns声明晰回来参数所属的数据类型,返

回参数是在函数体中运用return回来要回来的数据变量的方法来表明的。这就需求留意的是:
存储函数只支撑输入参数,而且输入参数前没有IN或INOUT.

delimiter //
运用delimiter更改mysql默许运用分号(;)运用新的完毕符号来完毕当时句子,运用delimiter后原先默许的分号(;)完毕句子符号不再起作用,

直到从头康复声明完毕符后。

create function count_news(hits int) returns int
留意存储函数的参数只要输入参数而且前不再声明IN或INOUT,回来只需声明要回来的数据类型


drop function if exists count_myisam;
delimiter //
create function count_myisam(hits int) returns int
comment 依据传入的点击次数计算超越此点击数的信息数目
begin
declare total_news int;
declare hits_num int default 0;
if hits =0 then
set hits_num=hits;
select count(id) into total_news from myisam where myisam.id hits_num;
else
set total_news=0;
end if;
return total_news;
end;
//
delimiter ;

调用select count_myisam(5);






ERROR 1418 (HY000) log_bin_trust_function_creators 处理
今日要写一个函数.但没有办法建提示过错如下:
mysql CREATE FUNCTION hello (s CHAR(20)) RETURNS CHAR(50)
    - RETURN CONCAT(Hello, ,s,!);
    - //
ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging

is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)
 
处理方法:(编缉my.cnf,增加如下)
[mysqld]
log_bin_trust_routine_creators = 1

 

 

 

 

 

 

 

 

 

 

存储进程实例

首要创立一个库


mysql create database mysqlsystems
mysql use mysqlsystems;

 


创立两个表 - innodb的和myisam的

 

mysql
CREATE TABLE `myisam` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(50) default NULL,
`post` text,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `innodb` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(50) default NULL,
`post` text,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 


这样叫创立了两个表,innodb和myisam。
创立可刺进数据的 存储进程

 

mysql
delimiter @
create procedure insert_isam(in item integer)
begin
declare counter int;
set counter = item;
while counter = 1 do
insert into myisam values(counter,concat(mysqlsystems.com,counter),repeat(bla,10));
set counter = counter - 1;
end while;
end
@

create procedure insert_innodb(in item integer)
begin
declare counter int;
set counter = item;
while counter = 1 do
insert into innodb values(counter,concat(mysqlsystems.com,counter),repeat(bla,10));
set counter = counter - 1;
end while;
end
@
delimiter ;

 


好了,show procedure status检查已创立的存储进程


运转吧,
你要刺进100条到innodb?         履行

mysql

call insert_innodb(100) 刺进1000000到myisam?         

mysql

call insert_myisam(1000000) 记住再一次刺进新的内容时,要清空你的表,delete from ,或许truncate 。
刺进10亿条?

 

 

根本知识

 

一.创立存储进程

1.根本语法:
create procedure sp_name()
begin
………
end
2.参数传递

二.调用存储进程

1.根本语法:call sp_name()
留意:存储进程称号后边有必要加括号,哪怕该存储进程没有参数传递

三.删去存储进程

1.根本语法:
drop procedure sp_name//
2.留意事项
(1)不能在一个存储进程中删去另一个存储进程,只能调用另一个存储进程

四.区块,条件,循环

1.区块界说,常用
begin
……
end;
也能够给区块起别号,如:
lable:begin
………..
end lable;
能够用leave lable;跳出区块,履行区块今后的代码
2.条件句子 if 条件 then
statement
else
statement
end if;
3.循环句子
(1).while循环

[label:] WHILE expression DO

statements

END WHILE [label] ;

(2).loop循环 [label:] LOOP

statements

END LOOP [label];
(3).repeat until循环 [label:] REPEAT

statements

UNTIL expression

END REPEAT [label] ;
五.其他常用指令

1.show procedure status
显现数据库中所有存储的存储进程根本信息,包含所属数据库,存储进程称号,创立时刻等
2.show create procedure sp_name
显现某一个存储进程的详细信息

 

 

版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表凯时娱乐立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章