记录mysql存储过程中的关键语法:DELIMITER // 声明语句结束符,用于区分;CREATE PROCEDURE demo_in_parameter(IN p_in int) 声明存储过程BEGIN .... END 存储过程开始和结束符号SET @p_in=1 变量赋值
DECLARE l_int int unsigned default 4000000; 变量定义
什么是mysql存储例程?
存储例程是存储在数据库服务器中的一组sql语句,通过在查询中调用一个指定的名称来执行这些sql语句命令。
为什么要使用mysql存储过程?
我们都知道应用程序分为两种,一种是基于web,一种是基于桌面,他们都和数据库进行交互来完成数据的存取工作。假设现在有一种应用程序包含了这两 种,现在要修改其中的一个查询sql语句,那么我们可能要同时修改他们中对应的查询sql语句,当我们的应用程序很庞大很复杂的时候问题就出现了,不易维护!另外把sql查询语句放在我们的web程序或桌面中很容易遭到sql注入的破坏。而存储例程正好可以帮我们解决这些问题。
存储过程(stored procedure)、存储例程(store routine)、存储函数区别
Mysql存储例程实际包含了存储过程和存储函数,它们被统称为存储例程。
其中存储过程主要完成在获取记录或插入记录或更新记录或删除记录,即完成select insert delete update等工作。而存储函数只完成查询的工作,可接受输入参数并返回一个结果。
创建mysql存储过程、存储函数
create procedure 存储过程名(参数)
存储过程体
create function 存储函数名(参数)
下面是存储过程的例子:mysql> DELIMITER // mysql> CREATE PROCEDURE proc1(OUT s int) -> BEGIN -> SELECT COUNT(*) INTO s FROM user; -> END -> // mysql> DELIMITER ;
注:
(1)这里需要注意的是DELIMITER//和DELIMITER;两句,DELIMITER是分割符的意思,因为MySQL默认以";"为分隔符,如果我们没有声明分割符,那么编译器会把存储过程当成SQL语句进行处理,则存储过程的编译过程会报错,所以要事先用DELIMITER关键字申明当前段分隔符,这样MySQL才会将";"当做存储过程中的代码,不会执行这些代码,用完了之后要把分隔符还原。
(2)存储过程根据需要可能会有输入、输出、输入输出参数,这里有一个输出参数s,类型是int型,如果有多个参数用","分割开。
(3)存储过程体的开始与结束使用BEGIN与END进行标识。
这样,我们的一个MySQL存储过程就完成了,是不是很容易呢?看不懂也没关系,接下来,我们详细的讲解。
(2). 声明分割符
其实,关于声明分割符,上面的注解已经写得很清楚,不需要多说,只是稍微要注意一点的是:如果是用MySQL的Administrator管理工具时,可以直接创建,不再需要声明。
(3). 参数
MySQL存储过程的参数用在存储过程的定义,共有三种参数类型,IN,OUT,INOUT,形式如:
CREATEPROCEDURE 存储过程名([[IN |OUT |INOUT ] 参数名 数据类型...])
IN 输入参数:表示该参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值
OUT 输出参数:该值可在存储过程内部被改变,并可返回
INOUT 输入输出参数:调用时指定,并且可被改变和返回
Ⅰ. IN参数例子
创建:
1. mysql > DELIMITER //
2. mysql > CREATE PROCEDURE demo_in_parameter(IN p_in int)
3. -> BEGIN
4. -> SELECT p_in;
5. -> SET p_in=2;
6. -> SELECT p_in;
7. -> END;
8. -> //
9. mysql > DELIMITER ;
执行结果:
1. mysql > SET @p_in=1;
2. mysql > CALL demo_in_parameter(@p_in);
3. +------+
4. | p_in |
5. +------+
6. | 1 |
7. +------+
8.
9. +------+
10.| p_in |
11.+------+
12.| 2 |
13.+------+
14.
15.mysql> SELECT @p_in;
16.+-------+
17.| @p_in |
18.+-------+
19.| 1 |
20.+-------+
以上可以看出,p_in虽然在存储过程中被修改,但并不影响@p_id的值
Ⅱ.OUT参数例子
创建:
1. mysql > DELIMITER //
2. mysql > CREATE PROCEDURE demo_out_parameter(OUT p_out int)
3. -> BEGIN
4. -> SELECT p_out;
5. -> SET p_out=2;
6. -> SELECT p_out;
7. -> END;
8. -> //
9. mysql > DELIMITER ;
执行结果:
1. mysql > SET @p_out=1;
2. mysql > CALL sp_demo_out_parameter(@p_out);
3. +-------+
4. | p_out |
5. +-------+
6. | NULL |
7. +-------+
8.
9. +-------+
10.| p_out |
11.+-------+
12.| 2 |
13.+-------+
14.
15.mysql> SELECT @p_out;
16.+-------+
17.| p_out |
18.+-------+
19.| 2 |
20.+-------+
Ⅲ. INOUT参数例子
创建:
1. mysql > DELIMITER //
2. mysql > CREATE PROCEDURE demo_inout_parameter(INOUT p_inout int)
3. -> BEGIN
4. -> SELECT p_inout;
5. -> SET p_inout=2;
6. -> SELECT p_inout;
7. -> END;
8. -> //
9. mysql > DELIMITER ;
执行结果:
1. mysql > SET @p_inout=1;
2. mysql > CALL demo_inout_parameter(@p_inout) ;
3. +---------+
4. | p_inout |
5. +---------+
6. | 1 |
7. +---------+
8.
9. +---------+
10.| p_inout |
11.+---------+
12.| 2 |
13.+---------+
14.
15.mysql > SELECT @p_inout;
16.+----------+
17.| @p_inout |
18.+----------+
19.| 2 |
20.+----------+
(4). 变量
Ⅰ. 变量定义
局部变量声明一定要放在存储过程体的开始
DECLAREvariable_name [,variable_name...] datatype [DEFAULT value];
其中,datatype为MySQL的数据类型,如:int, float, date,varchar(length)
例如:
1. DECLARE l_int int unsigned default 4000000;
2. DECLARE l_numeric number(8,2) DEFAULT 9.95;
3. DECLARE l_date date DEFAULT ‘1999-12-31‘;
4. DECLARE l_datetime datetime DEFAULT ‘1999-12-31 23:59:59‘;
5. DECLARE l_varchar varchar(255) DEFAULT ‘This will not be padded‘;
Ⅱ. 变量赋值
SET 变量名 = 表达式值 [,variable_name = expression ...]
Ⅲ. 用户变量
ⅰ. 在MySQL客户端使用用户变量
1. mysql > SELECT ‘Hello World‘ into @x;
2. mysql > SELECT @x;
3. +-------------+
4. | @x |
5. +-------------+
6. | Hello World |
7. +-------------+
8. mysql > SET @y=‘Goodbye Cruel World‘;
9. mysql > SELECT @y;
10.+---------------------+
11.| @y |
12.+---------------------+
13.| Goodbye Cruel World |
14.+---------------------+
15.
16.mysql > SET @z=1+2+3;
17.mysql > SELECT @z;
18.+------+
19.| @z |
20.+------+
21.| 6 |
22.+------+
ⅱ. 在存储过程中使用用户变量
1. mysql > CREATE PROCEDURE GreetWorld( ) SELECT CONCAT(@greeting,‘ World‘);
2. mysql > SET @greeting=‘Hello‘;
3. mysql > CALL GreetWorld( );
4. +----------------------------+
5. | CONCAT(@greeting,‘ World‘) |
6. +----------------------------+
7. | Hello World |
8. +----------------------------+
ⅲ. 在存储过程间传递全局范围的用户变量
1. mysql> CREATE PROCEDURE p1() SET @last_procedure=‘p1‘;
2. mysql> CREATE PROCEDURE p2() SELECT CONCAT(‘Last procedure was ‘,@last_procedure);
3. mysql> CALL p1( );
4. mysql> CALL p2( );
5. +-----------------------------------------------+
6. | CONCAT(‘Last procedure was ‘,@last_proc |
7. +-----------------------------------------------+
8. | Last procedure was p1 |
9. +-----------------------------------------------+
注意:
①用户变量名一般以@开头
②滥用用户变量会导致程序难以理解及管理
(5). 注释
MySQL存储过程可使用两种风格的注释
双模杠:--
该风格一般用于单行注释
c风格: 一般用于多行注释
例如:
1. mysql > DELIMITER //
2. mysql > CREATE PROCEDURE proc1 --name存储过程名
3. -> (IN parameter1 INTEGER)
4. -> BEGIN
5. -> DECLARE variable1 CHAR(10);
6. -> IF parameter1 = 17 THEN
7. -> SET variable1 = ‘birds‘;
8. -> ELSE
9. -> SET variable1 = ‘beasts‘;
10. -> END IF;
11. -> INSERT INTO table1 VALUES (variable1);
12. -> END
13. -> //
14.mysql > DELIMITER ;
4. MySQL存储过程的调用
用call和你过程名以及一个括号,括号里面根据需要,加入参数,参数包括输入参数、输出参数、输入输出参数。具体的调用方法可以参看上面的例子。
5. MySQL存储过程的查询
我们想知道一个数据库下面有那些表,我们一般采用 showtables; 进行查看。那么我们要查看某个数据库下面的存储过程,是否也可以采用呢?答案是,我们可以查看某个数据库下面的存储过程,但是是另一种方式。
我们可以用
select name from mysql.proc where db=’数据库名’;
或者
select routine_name from information_schema.routines where routine_schema=‘数据库名‘;
或者
show procedure status where db=‘数据库名‘;
进行查询。
如果我们想知道,某个存储过程的详细,那我们又该怎么做呢?是不是也可以像操作表一样用describe 表名进行查看呢?
答案是:我们可以查看存储过程的详细,但是需要用另一种方法:
SHOW CREATE PROCEDURE 数据库.存储过程名;
就可以查看当前存储过程的详细。
6. MySQL存储过程的修改
ALTER PROCEDURE
更改用CREATE PROCEDURE 建立的预先指定的存储过程,其不会影响相关存储过程或存储功能。
7. MySQL存储过程的删除
删除一个存储过程比较简单,和删除表一样:
DROP PROCEDURE IF EXISTS 存储过程名
从MySQL的表格中删除一个或多个存储过程。
8. MySQL存储过程的控制语句
(1). 变量作用域
内部的变量在其作用域范围内享有更高的优先权,当执行到end时,内部变量消失,此时已经在其作用域外,变量不再可见了,应为在存储过程外再也不能找到这个申明的变量,但是你可以通过out参数或者将其值指派给会话变量来保存其值。
1. mysql > DELIMITER //
2. mysql > CREATE PROCEDURE proc3()
3. -> begin
4. -> declare x1 varchar(5) default ‘outer‘;
5. -> begin
6. -> declare x1 varchar(5) default ‘inner‘;
7. -> select x1;
8. -> end;
9. -> select x1;
10. -> end;
11. -> //
12.mysql > DELIMITER ;
(2). 条件语句
Ⅰ. if-then -else语句
1. mysql > DELIMITER //
2. mysql > CREATE PROCEDURE proc2(IN parameter int)
3. -> begin
4. -> declare var int;
5. -> set var=parameter+1;
6. -> if var=0 then
7. -> insert into t values(17);
8. -> end if;
9. -> if parameter=0 then
10. -> update t set s1=s1+1;
11. -> else
12. -> update t set s1=s1+2;
13. -> end if;
14. -> end;
15. -> //
16.mysql > DELIMITER ;
Ⅱ. case语句:
1. mysql > DELIMITER //
2. mysql > CREATE PROCEDURE proc3 (in parameter int)
3. -> begin
4. -> declare var int;
5. -> set var=parameter+1;
6. -> case var
7. -> when 0 then
8. -> insert into t values(17);
9. -> when 1 then
10. -> insert into t values(18);
11. -> else
12. -> insert into t values(19);
13. -> end case;
14. -> end;
15. -> //
16.mysql > DELIMITER ;
case
when var=0 then
insert into t values(30);
when var>0 then
when var<0 then
else
end case
(3). 循环语句
Ⅰ. while ···· end while:
1. mysql > DELIMITER //
2. mysql > CREATE PROCEDURE proc4()
3. -> begin
4. -> declare var int;
5. -> set var=0;
6. -> while var<6 do
7. -> insert into t values(var);
8. -> set var=var+1;
9. -> end while;
10. -> end;
11. -> //
12.mysql > DELIMITER ;
while条件 do
--循环体
endwhile
Ⅱ. repeat···· end repeat:
它在执行操作后检查结果,而while则是执行前进行检查。
1. mysql > DELIMITER //
2. mysql > CREATE PROCEDURE proc5 ()
3. -> begin
4. -> declare v int;
5. -> set v=0;
6. -> repeat
7. -> insert into t values(v);
8. -> set v=v+1;
9. -> until v>=5
10. -> end repeat;
11. -> end;
12. -> //
13.mysql > DELIMITER ;
repeat
--循环体
until循环条件
endrepeat;
Ⅲ. loop ·····endloop:
loop循环不需要初始条件,这点和while 循环相似,同时和repeat循环一样不需要结束条件, leave语句的意义是离开循环。
1. mysql > DELIMITER //
2. mysql > CREATE PROCEDURE proc6 ()
3. -> begin
4. -> declare v int;
5. -> set v=0;
6. -> LOOP_LABLE:loop
7. -> insert into t values(v);
8. -> set v=v+1;
9. -> if v >=5 then
10. -> leave LOOP_LABLE;
11. -> end if;
12. -> end loop;
13. -> end;
14. -> //
15.mysql > DELIMITER ;
Ⅳ. LABLES 标号:
标号可以用在begin repeat while 或者loop 语句前,语句标号只能在合法的语句前面使用。可以跳出循环,使运行指令达到复合语句的最后一步。
(4). ITERATE迭代
Ⅰ. ITERATE:
1. 通过引用复合语句的标号,来从新开始复合语句
2. mysql > DELIMITER //
3. mysql > CREATE PROCEDURE proc10 ()
4. -> begin
5. -> declare v int;
6. -> set v=0;
7. -> LOOP_LABLE:loop
8. -> if v=3 then
9. -> set v=v+1;
10. -> ITERATE LOOP_LABLE;
11. -> end if;
12. -> insert into t values(v);
13. -> set v=v+1;
14. -> if v>=5 then
15. -> leave LOOP_LABLE;
16. -> end if;
17. -> end loop;
18. -> end;
19. -> //
20.mysql > DELIMITER ;
9. MySQL存储过程的基本函数
(1).字符串类
CHARSET(str) //返回字串字符集CONCAT (string2 [,... ]) //连接字串INSTR (string ,substring ) //返回substring首次在string中出现的位置,不存在返回0LCASE (string2 ) //转换成小写LEFT (string2 ,length ) //从string2中的左边起取length个字符LENGTH (string ) //string长度LOAD_FILE (file_name ) //从文件读取内容LOCATE (substring , string [,start_position ] ) 同INSTR,但可指定开始位置LPAD (string2 ,length ,pad ) //重复用pad加在string开头,直到字串长度为lengthLTRIM (string2 ) //去除前端空格REPEAT (string2 ,count ) //重复count次REPLACE (str ,search_str ,replace_str ) //在str中用replace_str替换search_strRPAD (string2 ,length ,pad) //在str后用pad补充,直到长度为lengthRTRIM (string2 ) //去除后端空格STRCMP (string1 ,string2 ) //逐字符比较两字串大小,SUBSTRING (str , position [,length ]) //从str的position开始,取length个字符,注:mysql中处理字符串时,默认第一个字符下标为1,即参数position必须大于等于1
1. mysql> select substring(‘abcd‘,0,2);
2. +-----------------------+
3. | substring(‘abcd‘,0,2) |
4. +-----------------------+
5. | |
6. +-----------------------+
7. 1 row in set (0.00 sec)
8.
9. mysql> select substring(‘abcd‘,1,2);
10.+-----------------------+
11.| substring(‘abcd‘,1,2) |
12.+-----------------------+
13.| ab |
14.+-----------------------+
15.1 row in set (0.02 sec)
TRIM([[BOTH|LEADING|TRAILING][padding] FROM]string2) //去除指定位置的指定字符UCASE (string2 ) //转换成大写RIGHT(string2,length) //取string2最后length个字符SPACE(count) //生成count个空格
(2).数学类
ABS (number2 ) //绝对值BIN (decimal_number ) //十进制转二进制CEILING (number2 ) //向上取整CONV(number2,from_base,to_base) //进制转换FLOOR (number2 ) //向下取整FORMAT (number,decimal_places ) //保留小数位数HEX (DecimalNumber ) //转十六进制注:HEX()中可传入字符串,则返回其ASC-11码,如HEX(‘DEF‘)返回4142143也可以传入十进制整数,返回其十六进制编码,如HEX(25)返回19LEAST (number , number2 [,..]) //求最小值MOD (numerator ,denominator ) //求余POWER (number ,power ) //求指数RAND([seed]) //随机数ROUND (number [,decimals ]) //四舍五入,decimals为小数位数]
注:返回类型并非均为整数,如:(1)默认变为整形值
1. mysql> select round(1.23);
2. +-------------+
3. | round(1.23) |
4. +-------------+
5. | 1 |
6. +-------------+
7. 1 row in set (0.00 sec)
8.
9. mysql> select round(1.56);
10.+-------------+
11.| round(1.56) |
12.+-------------+
13.| 2 |
14.+-------------+
15.1 row in set (0.00 sec)
(2)可以设定小数位数,返回浮点型数据
1. mysql> select round(1.567,2);
2. +----------------+
3. | round(1.567,2) |
4. +----------------+
5. | 1.57 |
6. +----------------+
7. 1 row in set (0.00 sec)
SIGN (number2 ) //
(3).日期时间类
ADDTIME (date2 ,time_interval )//将time_interval加到date2CONVERT_TZ (datetime2 ,fromTZ ,toTZ ) //转换时区CURRENT_DATE ( ) //当前日期CURRENT_TIME ( ) //当前时间CURRENT_TIMESTAMP ( ) //当前时间戳DATE (datetime ) //返回datetime的日期部分DATE_ADD (date2 , INTERVAL d_value d_type ) //在date2中加上日期或时间DATE_FORMAT (datetime ,FormatCodes ) //使用formatcodes格式显示datetimeDATE_SUB (date2 , INTERVAL d_value d_type ) //在date2上减去一个时间DATEDIFF (date1 ,date2 ) //两个日期差DAY (date ) //返回日期的天DAYNAME (date ) //英文星期DAYOFWEEK (date ) //星期(1-7) ,1为星期天DAYOFYEAR (date ) //一年中的第几天EXTRACT (interval_name FROM date ) //从date中提取日期的指定部分MAKEDATE (year ,day ) //给出年及年中的第几天,生成日期串MAKETIME (hour ,minute ,second ) //生成时间串MONTHNAME (date ) //英文月份名NOW ( ) //当前时间SEC_TO_TIME (seconds ) //秒数转成时间STR_TO_DATE (string ,format ) //字串转成时间,以format格式显示TIMEDIFF (datetime1 ,datetime2 ) //两个时间差TIME_TO_SEC (time ) //时间转秒数]WEEK (date_time [,start_of_week ]) //第几周YEAR (datetime ) //年份DAYOFMONTH(datetime) //月的第几天HOUR(datetime) //小时LAST_DAY(date) //date的月的最后日期MICROSECOND(datetime) //微秒MONTH(datetime) //月MINUTE(datetime) //分返回符号,正负或0SQRT(number2) //开平方
MySql分页存储过程
MySql测试版本:5.0.41-community-nt
DROP PROCEDURE IF EXISTS pr_pager;CREATE PROCEDURE pr_pager( IN p_table_name VARCHAR(1024), IN p_fields VARCHAR(1024), IN p_page_size INT, IN p_page_now INT, IN p_order_string VARCHAR(128), IN p_where_string VARCHAR(1024), OUT p_out_rows INT ) NOT DETERMINISTIC SQL SECURITY DEFINER COMMENT ‘分页存储过程‘ BEGIN DECLARE m_begin_row INT DEFAULT 0; DECLARE m_limit_string CHAR(64); SET m_begin_row = (p_page_now - 1) * p_page_size; SET m_limit_string = CONCAT(‘ LIMIT ‘, m_begin_row, ‘, ‘, p_page_size); SET @COUNT_STRING = CONCAT(‘SELECT COUNT(*) INTO @ROWS_TOTAL FROM ‘, p_table_name, ‘ ‘, p_where_string); SET @MAIN_STRING = CONCAT(‘SELECT ‘, p_fields, ‘ FROM ‘, p_table_name, ‘ ‘, p_where_string, ‘ ‘, p_order_string,m_limit_string); PREPARE count_stmt FROM @COUNT_STRING; EXECUTE count_stmt; DEALLOCATE PREPARE count_stmt; SET p_out_rows = @ROWS_TOTAL; PREPARE main_stmt FROM @MAIN_STRING; EXECUTE main_stmt; DEALLOCATE PREPARE main_stmt; END;
调用
mysql> call pr_pager("t","var",3,3,"","",@result);
mysql> call pr_pager("t","var",3,2,"","",@result);
mysql存储过程详细教程
标签:
小编还为您整理了以下内容,可能对您也有帮助:
MySQL里面sql语句调用存储过程,该如何写?
这样:
CREATE PROCEDURE sp_add(a int, b int,out c int)
begin
set c=a+ b;
end;
调用过程:
call sp_add (1,2,@a);
select @a;
注意事项
存储过程(stored procere)是一组为了完成特定功能的SQL语句集合,经编译后存储在服务器端的数据库中,利用存储过程可以加速SQL语句的执行。
存储过程分为系统存储过程和自定义存储过程。
系统存储过程在master数据库中,但是在其他的数据库中可以直接调用,并且在调用时不必在存储过程前加上数据库名,因为在创建一个新数据库时,系统存储过程在新的数据库中会自动创建。
自定义存储过程,由用户创建并能完成某一特定功能的存储过程,存储过程既可以有参数又有返回值,但是它与函数不同,存储过程的返回值只是指明执行是否成功,并不能像函数那样被直接调用,只能利用execute来执行存储过程。
创建存储过程
SQL Server创建存储过程:
create procere 过程名
@parameter 参数类型
@parameter 参数类型
。。。
as
begin
end
执行存储过程:execute 过程名
mysql 存储过程总结(一)
1、存储过程定义:
存储过程是事先经过编译并存储在数据库中的一段 SQL 语句的集合,调用存储过程可以简化应用开发 人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是有好处的。 存储过程思想上很简单,就是数据库 SQL 语言层面的代码封装与重用。
2、特点:
封装,复用 : 可以把某一业务SQL封装在存储过程中,需要用到 的时候直接调用即可。
可以接收参数,也可以返回数据 :再存储过程中,可以传递参数,也可以接收返回 值。
减少网络交互,效率提升 : 如果涉及到多条SQL,每执行一次都是一次网络传 输。 而如果封装在存储过程中,我们只需要网络交互一次可能就可以了。
3、基本语法
(1)创建:
(2)调用:
(3)查看:
(4)删除
注意: 在命令行中,执行创建存储过程的SQL时,需要通过关键字 delimiter 指定SQL语句的 结束符。
mysql 存储过程总结(一)
1、存储过程定义:
存储过程是事先经过编译并存储在数据库中的一段 SQL 语句的集合,调用存储过程可以简化应用开发 人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是有好处的。 存储过程思想上很简单,就是数据库 SQL 语言层面的代码封装与重用。
2、特点:
封装,复用 : 可以把某一业务SQL封装在存储过程中,需要用到 的时候直接调用即可。
可以接收参数,也可以返回数据 :再存储过程中,可以传递参数,也可以接收返回 值。
减少网络交互,效率提升 : 如果涉及到多条SQL,每执行一次都是一次网络传 输。 而如果封装在存储过程中,我们只需要网络交互一次可能就可以了。
3、基本语法
(1)创建:
(2)调用:
(3)查看:
(4)删除
注意: 在命令行中,执行创建存储过程的SQL时,需要通过关键字 delimiter 指定SQL语句的 结束符。
mysql 存储过程怎么调用?
php调用mysql存储过程和函数的方法
存储过程和函数是MySql5.0刚刚引入的。关于这方面的操作在PHP里面没有直接的支持。但是由于Mysql PHP API的设计,使得我们可以在以前的PHP版本中的mysql php api中支持存储过程和函数的调用。
在php中调用存储过程和函数。
1。调用存储过程的方法。
a。如果存储过程有 IN/INOUT参数,声明一个变量,输入参数给存储过程,该变量是一对,
一个php变量(也可以不必,只是没有php变量时,没有办法进行动态输入),一个Mysql
变量。
b。如果存储过程有OUT变量,声明一个Mysql变量。
mysql变量的声明比较特殊,必须让mysql服务器知道此变量的存在,其实也就是执行一条mysql语句。
入set @mysqlvar=$phpvar ;
c。使用mysql_query()/mysql_db_query()执行mysql 变量声明语句。
mysql_query("set @mysqlvar=$pbpvar");
这样,在mysql服务器里面就有一个变量,@mysqlar。如果是IN参数,那么其值可以由phpar传入。
d。 如果是存储过程。
1。执行 call procere()语句。
也就是mysql_query("call proceer([var1]...)");
2. 如果有返回值,执行select @ar,返回执行结果。
mysql_query("select @var)"
接下来的操作就和php执行一般的mysql语句一样了。可以通过mydql_fetch_row()等函数获得结果。
如果时函数。 直接执行 select function() 就可以了。
$host="localhost";
$user="root";
$password="11212";
$db="samp_db";
$dblink=mysql_connect($host,$user,$password)
or die("can't connect to mysql");
mysql_select_db($db,$dblink)
or die("can't select samp_db");
$res=mysql_query("set @a=$password",$dblink);
$res=mysql_query("call aa(@a)",$dblink);
$res=mysql_query("select @a",$dblink);
$row=mysql_fetch_row($res);
echo $row[0];
MySQL创建存储过程
存储过程是数据库管理中常用的技术之一,可以很方便的做些类似数据统计、数据分析等工作,市场上的SQL SERVER、ORACLE、MySQL都支持存储过程,但不同的数据库环境语法结构有点区别,本案例给大家讲解下MySQL创建存储过程的方法
使用常规的创建存储过程方法,发现各种报错,无法执行,在SQL SERVER下很容易成功的写法,在MySQL下居然不行,经过查找资料发现在MySQL中需要设置DELIMITER
这是正确的存储过程写法,可以成功执行,相比较上图的报错,增加了DELIMITER,简单解释下这个命令的用途,在MySQL中每行命令都是用“;”结尾,回车后自动执行,在存储过程中“;”往往不代表指令结束,马上运行,而DELIMITER原本就是“;”的意思,因此用这个命令转换一下“;”为“//”,这样只有收到“//”才认为指令结束可以执行
该存储过程的功能是将“编号”这行记录的流水号+1,在执行存储过程之前,我们查看下数据库中该表的数据情况
执行存储过程使用call命令,与SQL SERVER的exec用法一样,执行后发现了返回值,流水号已经+1
为了确认数据库中数据确实修改,重新执行遍查询操作
该例中使用了start transaction;事务处理,功能就不解释了,但用法与SQL SERVER有点区别,事实上MySQL在很多地方的语法上与SQL SERVER不一样,但功能类似,需要大家多接触,多练习
还有一点需要补充下,在MySQL中似乎没有修改存储过程的命令,执行alter procere报错
分析了下mysql workbench工具中的alter命令,其实是先执行的drop然后在create,没有直接用alter操作
MySQL创建存储过程
存储过程是数据库管理中常用的技术之一,可以很方便的做些类似数据统计、数据分析等工作,市场上的SQL SERVER、ORACLE、MySQL都支持存储过程,但不同的数据库环境语法结构有点区别,本案例给大家讲解下MySQL创建存储过程的方法
使用常规的创建存储过程方法,发现各种报错,无法执行,在SQL SERVER下很容易成功的写法,在MySQL下居然不行,经过查找资料发现在MySQL中需要设置DELIMITER
这是正确的存储过程写法,可以成功执行,相比较上图的报错,增加了DELIMITER,简单解释下这个命令的用途,在MySQL中每行命令都是用“;”结尾,回车后自动执行,在存储过程中“;”往往不代表指令结束,马上运行,而DELIMITER原本就是“;”的意思,因此用这个命令转换一下“;”为“//”,这样只有收到“//”才认为指令结束可以执行
该存储过程的功能是将“编号”这行记录的流水号+1,在执行存储过程之前,我们查看下数据库中该表的数据情况
执行存储过程使用call命令,与SQL SERVER的exec用法一样,执行后发现了返回值,流水号已经+1
为了确认数据库中数据确实修改,重新执行遍查询操作
该例中使用了start transaction;事务处理,功能就不解释了,但用法与SQL SERVER有点区别,事实上MySQL在很多地方的语法上与SQL SERVER不一样,但功能类似,需要大家多接触,多练习
还有一点需要补充下,在MySQL中似乎没有修改存储过程的命令,执行alter procere报错
分析了下mysql workbench工具中的alter命令,其实是先执行的drop然后在create,没有直接用alter操作
mysql如何创建存储过程?
1 用mysql客户端登入
2 选择数据库
mysql>use test
3 查询当前数据库有哪些存储过程
mysql>show procere status where Db='test'
4 创建一个简单的存储过程
mysql>create procere hi() select 'hello';
5 存储过程创建完毕,看怎么调用它
mysql>call hi();
显示结果 mysql> call hi();
+-------+
| hello |
+-------+
| hello |
+-------+
1 row in set (0.00 sec) Query OK, 0 rows affected (0.01 sec)
6 一个简单的储存过程就成功了
mysql如何创建存储过程?
1 用mysql客户端登入
2 选择数据库
mysql>use test
3 查询当前数据库有哪些存储过程
mysql>show procere status where Db='test'
4 创建一个简单的存储过程
mysql>create procere hi() select 'hello';
5 存储过程创建完毕,看怎么调用它
mysql>call hi();
显示结果 mysql> call hi();
+-------+
| hello |
+-------+
| hello |
+-------+
1 row in set (0.00 sec) Query OK, 0 rows affected (0.01 sec)
6 一个简单的储存过程就成功了
SQL 中存储过程怎么使用?
一、简单的储存过程:
1、创建一个存储过程
create procere GetUsers()
begin
select * from user;
end;12345
2、调用存储过程
call GetUsers();12
3、删除存储过程
drop procere if exists GetUsers;
二、带参数的存储过程
1、MySql 支持 IN (传递给存储过程) , OUT (从存储过程传出) 和 INOUT (对存储过程传入和传出) 类型的参数 , 存储过程的代码位于 BEGIN 和 END 语句内 , 它们是一系列 SQL 语句 , 用来检索值 , 然后保存到相应的变量 (通过指定INTO关键字) ;
2、下面的存储过程接受三个参数 , 分别用于获取用户表的最小 , 平均 , 最大分数 , 每个参数必须具有指定的类型 , 这里使用十进制值(decimal(8,2)) , 关键字 OUT 指出相应的参数用来从存储过程传出
create procere GetScores(
out minScore decimal(8,2),
out avgScore decimal(8,2),
out maxScore decimal(8,2)
)
begin
select min(score) into minScore from user;
select avg(score) into avgScore from user;
select max(score) into maxScore from user;
end;1234567891011
3、调用此存储过程 , 必须指定3个变量名(所有 MySql 变量都必须以 @ 开始) , 如下所示 :
call GetScores(@minScore, @avgScore, @maxScore);12
4、该调用并没有任何输出 , 只是把调用的结果赋给了调用时传入的变量 @minScore, @avgScore, @maxScore , 然后即可调用显示该变量的值 :
select @minScore, @avgScore, @maxScore;
5、使用 IN 参数 , 输入一个用户 id , 返回该用户的名字 :
create procere GetNameByID(
in userID int,
out userName varchar(200)
)
begin
select name from user
where id = userID
into userName;
end;12345678910
6、调用存储过程 :
call GetNameByID(1, @userName);
select @userName;123
参考资料
SQL存储过程使用介绍.csdn博客[引用时间2017-12-31]
mysql 导入导出数据库以及函数、存储过程的介绍
mysql常用导出数据命令:
1.mysql导出整个数据库
mysqlmp
-hhostname
-uusername
-ppassword
databasename
>
backupfile.sql
mysqlmp
-hlocalhost
-uroot
hqgr>
hqgr.sql
(如果root用户没用密码可以不写-p,当然导出的sql文件你可以制定一个路径,未指定则存放在mysql的bin目录下)
2.mysql导出数据库一个表
mysqlmp
-hhostname
-uusername
-ppassword
database
tablename>
导出的文件名
mysqlmp
-hlocalhost
-uroot
hqgr
t_ug_user>
user.sql
3.mysql导出一个数据库结构
mysqlmp
-hhostname
-uusername
-ppassword
-d
--add-drop-table
databasename>d:hqgrstructure.sql
-d
没有数据
--add-drop-table
在每个create语句之前增加一个drop
table
4.如果需要导出mysql里面的函数或者存储过程
mysqlmp
-hhostname
-uusername
-ppassword
-ntd
-R
databasename
>
backupflie.sql
mysqlmp
-hlocalhost
-uroot
-ntd
-R
hqgr
>
hqgr.sql
其中的
-ntd
是表示导出存储过程;-R是表示导出函数
mysql常用导入数据的命令:
1.mysql命令
mysql
-hhostname
-uusername
-
ppassword
databasename
<
backupfile.sql
2.source命令
mysql>source
backupfile.sql
mysql 导入导出数据库以及函数、存储过程的介绍
mysql常用导出数据命令:
1.mysql导出整个数据库
mysqlmp
-hhostname
-uusername
-ppassword
databasename
>
backupfile.sql
mysqlmp
-hlocalhost
-uroot
hqgr>
hqgr.sql
(如果root用户没用密码可以不写-p,当然导出的sql文件你可以制定一个路径,未指定则存放在mysql的bin目录下)
2.mysql导出数据库一个表
mysqlmp
-hhostname
-uusername
-ppassword
database
tablename>
导出的文件名
mysqlmp
-hlocalhost
-uroot
hqgr
t_ug_user>
user.sql
3.mysql导出一个数据库结构
mysqlmp
-hhostname
-uusername
-ppassword
-d
--add-drop-table
databasename>d:hqgrstructure.sql
-d
没有数据
--add-drop-table
在每个create语句之前增加一个drop
table
4.如果需要导出mysql里面的函数或者存储过程
mysqlmp
-hhostname
-uusername
-ppassword
-ntd
-R
databasename
>
backupflie.sql
mysqlmp
-hlocalhost
-uroot
-ntd
-R
hqgr
>
hqgr.sql
其中的
-ntd
是表示导出存储过程;-R是表示导出函数
mysql常用导入数据的命令:
1.mysql命令
mysql
-hhostname
-uusername
-
ppassword
databasename
<
backupfile.sql
2.source命令
mysql>source
backupfile.sql
用Navicat for mysql 创建存储过程
使用Navicat for MySQL工具创建存储过程步骤:
1. 新建函数(选择函数标签 -> 点击新建函数):
2、输入函数的参数个数、参数名、参数类型等:
3、编写存储过程:
4、保存(请输入合法名称):
5、运行存储过程(在结果1,2,3...中可以查询输出信息):
用Navicat for mysql 创建存储过程
使用Navicat for MySQL工具创建存储过程步骤:
1. 新建函数(选择函数标签 -> 点击新建函数):
2、输入函数的参数个数、参数名、参数类型等:
3、编写存储过程:
4、保存(请输入合法名称):
5、运行存储过程(在结果1,2,3...中可以查询输出信息):
在mysql中如何导出指定的存储过程
方法一:从mysql维护的存储过程表(mysql.proc)出:
select body
from mysql.proc
where name = 'simpleproc'
;
更详细一点的:
select name , type , param_list ,returns , body , body_utf8
from mysql.proc
where name = 'simpleproc'
;
方法2:
select ROUTINE_DEFINITION , ROUTINE_TYPE , ROUTINE_NAME from information_schema.ROUTINES
where ROUTINE_NAME = 'simpleproc'
;
如果要导出,可以装到一个表中导出:
create table mp_proc
as
select name, param_list ,returns, body
from mysql.proc
where name = 'simpleproc'
;
然后mp出来.或者 tee出到文件。
如何通过用MySQL怎么创建存储过程?
创建存储过程
CREATE PROCEDURE 存储过程名()
一个例子说明:一个返回产品平均价格的存储过程如下代码:
CREATE PROCEDURE proctpricing()
BEGIN
SELECT Avg(prod_price) AS priceaverage
FROM procts;
END;
//创建存储过程名为proctpricing,如果存储过程需要接受参数,可以在()中列举出来。即使没有参数后面仍然要跟()。BEGIN和END语句用来限定存储过程体,过程体本身是个简单的SELECT语句
如何通过用MySQL怎么创建存储过程?
创建存储过程
CREATE PROCEDURE 存储过程名()
一个例子说明:一个返回产品平均价格的存储过程如下代码:
CREATE PROCEDURE proctpricing()
BEGIN
SELECT Avg(prod_price) AS priceaverage
FROM procts;
END;
//创建存储过程名为proctpricing,如果存储过程需要接受参数,可以在()中列举出来。即使没有参数后面仍然要跟()。BEGIN和END语句用来限定存储过程体,过程体本身是个简单的SELECT语句