.关于MySQL的存储过程
存储过程是数据库存储的一个重要的功能,但是MySQL在5.0以前并不支持存储过程,这使得MySQL在应用上大打折扣。好在MySQL 5.0终于开始已经支持存储过程,这样即可以大大提高数据库的处理速度,同时也可以提高数据库编程的灵活性。
MySQL存储过程的创建
(1).格式
MySQL存储过程创建的格式:CREATE PROCEDURE过程名([过程参数[,...]])
[特性...]过程体
这里先举个例子:
mysql>DELIMITER//
mysql>CREATEPROCEDUREproc1(OUTsint)
->BEGIN
->SELECTCOUNT(*)INTOsFROMuser;
->END
->//
mysql>DELIMITER;
- 注:
(1)这里需要注意的是DELIMITER //和DELIMITER ;两句,DELIMITER是分割符的意思,因为MySQL默认以";"为分隔符,如果我们没有声明分割符,那么编译器会把存储过程当成SQL语句进行处理,则存储过程的编译过程会报错,所以要事先用DELIMITER关键字申明当前段分隔符,这样MySQL才会将";"当做存储过程中的代码,不会执行这些代码,用完了之后要把分隔符还原。
(2)存储过程根据需要可能会有输入、输出、输入输出参数,这里有一个输出参数s,类型是int型,如果有多个参数用","分割开。
(3)过程体的开始与结束使用BEGIN与END进行标识。
‘贰’ 如何查看mysql内的存储过程总数
查看存储过程创建语句可运行下列SQL语句:语法show create {procere|function} sp_name;例如查看存储过程myPro的创建语句show create procere myPro;查看自定义函数myFunc的创建语句show create function myFunc;
‘叁’ mysql中怎样查询表中的储存过程
假设A表有3个字段,ID, DATA1,DATA2
简单的话可以不使用存储过程,比如:
select * form A where ID in (select ID from A where DATA1 between 0 and 100)
如果你的应用比较复杂,在嵌套中还有复杂的运算,存储过程可以如下例子:
CREATE PROCEDURE test(in_start int,in_end int)
BEGIN
DECLARE ids TEXT;
select GROUP_CONCAT(ID) into ids from A where DATA1 between in_start and in_end;
select * from A where FIND_IN_SET(ID,ids) > 0;
END
注: in_start, in_end是DATA1的筛选范围。 后面一个select直接返回一个表
直接用SQL和使用存储过程各有利弊,存储过程在你使用大量查询及SQL运算的时候效率很高,而且存储过程一旦写入数据库会被自动编译运行速度比较快,而SQL是每次执行都需要被编译一次的。但是存储过程的调试比较麻烦,不像你使用编程语言和SQL的时候可以单步调试。而且如果没有熟练掌握存储过程的效率优化情况下,使用存储过程可能比使用SQL更慢。
‘肆’ 存储过程怎么在mysql查询里执行
方法一:(直接查询,比较实用,查看当前自定义的存储过程)
select `specific_name` from MySQL.proc where `db` = 'your_db_name' and `type` = 'procere'
方法二:(查看数据库里所有存储过程+内容)
show procere status;
方法三:(查看当前数据库里存储过程列表)
select specific_name from mysql.proc ;
方法四:(查看某一个存储过程的具体内容)
select body from mysql.proc where specific_name = 'your_proc_name';
查看存储过程或函数的创建代码 :
show create procere your_proc_name;
show create function your_func_name;
‘伍’ mysql 存储过程总结(一)
1、存储过程定义:
存储过程是事先经过编译并存储在数据库中的一段 SQL 语句的集合,调用存储过程可以简化应用开发 人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是有好处的。 存储过程思想上很简单,就是数据库 SQL 语言层面的代码封装与重用。
2、特点:
封装,复用 : 可以把某一业务SQL封装在存储过程中,需要用到 的时候直接调用即可。
可以接收参数,也可以返回数据 :再存储过程中,可以传递参数,也可以接收返回 值。
减少网络交互,效率提升 : 如果涉及到多条SQL,每执行一次都是一次网络传 输。 而如果封装在存储过程中,我们只需要网络交互一次可能就可以了。
3、基本语法
(1)创建:
(2)调用:
(3)查看:
(4)删除
注意: 在命令行中,执行创建存储过程的SQL时,需要通过关键字 delimiter 指定SQL语句的 结束符。
‘陆’ MySQL存储过程会直接查询主库
主库和从库都直接可以查询。
MySQL存储过程-循环遍历查询到的结果集:根据MySQL的语法创建存储过程,要注意的是如果循环遍历查询到的结果集,取出结果集中的数据做操作。
‘柒’ mysql存储过程
MySQL存储过程创建的格式如下:
CREATE PROCEDURE 过程名 ([过程参数[,...]])[特性 ...] 过程体
举例代码如下:
CREATE PROCEDURE proc1(OUT s int) BEGIN SELECT COUNT(*) INTO s FROM user; END
存储过程根据需要可能会有输入、输出、输入输出参数,这里有一个输出参数s,类型是int型,如果有多个参数用","分割开。
过程体的开始与结束使用BEGIN与END进行标识。
注意:MySQL在5.0以前并不支持存储过程
‘捌’ mysql 使用存储过程 循环查找数据
delimiter $$
mysql>
mysql> CREATE PROCEDURE myProc() //创建while循环的存储过程 if分支语句示例
-> BEGIN
->
-> DECLARE i int;
-> SET i=1;
-> loop1: WHILE i<=10 DO
-> IF MOD(i,2)<>0 THEN /*Even number - try again*/
-> SELECT CONCAT(i," is an odd number");
-> END IF;
-> SET i=i+1;
-> END WHILE loop1;
-> END$$
Query OK, 0 rows affected (0.00 sec)
这种也可以
‘玖’ mysql 如何查看某个表在哪些存储过程中用那个到了
SELECT * FROM mysql.proc
WHERE type = 'PROCEDURE'
AND specific_name = 'P_UserBetDayDetail'
AND Body LIKE '%Report_UserBetDayDetail%';
mysql.proc:表示查询的目标表;
type = 'PROCEDURE':表示查询的是存储过程;
specific_name = 'P_UserBetDayDetail' :表示查询的具体存储过程名称;
Body LIKE '%Report_UserBetDayDetail%':表示存储过程内容中包含的表。
‘拾’ mysql 使用存储过程 循环查找数据
delimiter
$$
mysql>
mysql>
CREATE
PROCEDURE
myProc()
//创建while循环的存储过程
if分支语句示例
->
BEGIN
->
->
DECLARE
i
int;
->
SET
i=1;
->
loop1:
WHILE
i<=10
DO
->
IF
MOD(i,2)<>0
THEN
/*Even
number
-
try
again*/
->
SELECT
CONCAT(i,"
is
an
odd
number");
->
END
IF;
->
SET
i=i+1;
->
END
WHILE
loop1;
->
END$$
Query
OK,
0
rows
affected
(0.00
sec)
这种也可以