MySQL存储过程解析
(4). 变量 Ⅰ. 变量定义 DECLARE variable_name[,variable_name...] datatype [DEFAULT value]; 其中,datatype为MySQL的数据类型,如:int, float, date,varchar(length) 例如: DECLARE l_int int unsigned default 4000000; DECLARE l_numeric number(8,2) DEFAULT 9.95; DECLARE l_date date DEFAULT '1999-12-31'; http://www.bianceng.cn DECLARE l_datetime datetime DEFAULT '1999-12-31 23:59:59'; DECLARE l_varchar varchar(255) DEFAULT 'This will not be padded'; Ⅱ. 变量赋值 SET 变量名 = 表达式值 [,variable_name = expression...] Ⅲ. 用户变量 ⅰ. 在MySQL客户端使用用户变量 mysql > SELECT 'Hello World' into @x; mysql > SELECT @x; +-------------+ | @x | +-------------+ | Hello World | +-------------+ mysql > SET @y='Goodbye Cruel World'; mysql > SELECT @y; +---------------------+ | @y | +---------------------+ | Goodbye Cruel World | +---------------------+ mysql > SET @z=1+2+3; mysql > SELECT @z; +------+ | @z | +------+ | 6 | +------+ ⅱ. 在存储过程中使用用户变量 mysql > CREATE PROCEDURE GreetWorld( ) SELECT CONCAT(@greeting,' World'); mysql > SET @greeting='Hello'; mysql > CALL GreetWorld( ); +----------------------------+ | CONCAT(@greeting,' World') | +----------------------------+ | Hello World | +----------------------------+ ⅲ. 在存储过程间传递全局范围的用户变量 mysql> CREATE PROCEDURE p1() SET @last_procedure='p1'; mysql> CREATE PROCEDURE p2() SELECT CONCAT('Last procedure was ',@last_proc); mysql> CALL p1( ); mysql> CALL p2( ); +-----------------------------------------------+ | CONCAT('Last procedure was ',@last_proc | +-----------------------------------------------+ | Last procedure was p1 | +-----------------------------------------------+ 注意: ①用户变量名一般以@开头 ②滥用用户变量会导致程序难以理解及管理 (5). 注释 MySQL存储过程可使用两种风格的注释 双模杠:-- 该风格一般用于单行注释 c风格: 一般用于多行注释 例如: mysql > DELIMITER // mysql > CREATE PROCEDURE proc1 --name存储过程名 -> (IN parameter1 INTEGER) -> BEGIN -> DECLARE variable1 CHAR(10); -> IF parameter1 = 17 THEN -> SET variable1 = 'birds'; -> ELSE -> SET variable1 = 'beasts'; -> END IF; -> INSERT INTO table1 VALUES (variable1); -> END -> // mysql > DELIMITER ; 4. MySQL存储过程的调用 用call和你过程名以及一个括号,括号里面根据需要,加入参数,参数包括输入参数、输出参数、输入输出参数。具体的调用方法可以参看上面的例子。 5. MySQL存储过程的查询 我们像知道一个数据库下面有那些表,我们一般采用showtables;进行查看。那么我们要查看某个数据库下面的存储过程,是否也可以采用呢?答案是,我们可以查看某个数据库下面的存储过程,但是是令一钟方式。 我们可以用 select namefrom mysql.proc where db=’数据库名’; 或者 selectroutine_name from information_schema.routines whereroutine_schema='数据库名'; 或者 show procedurestatus where db='数据库名'; 进行查询。 如果我们想知道,某个存储过程的详细,那我们又该怎么做呢?是不是也可以像操作表一样用describe表名进行查看呢? 答案是:我们可以查看存储过程的详细,但是需要用另一种方法: SHOW CREATEPROCEDURE 数据库.存储过程名; 就可以查看当前存储过程的详细。 6. MySQL存储过程的修改 ALTER PROCEDURE 更改用CREATE PROCEDURE建立的预先指定的存储过程,其不会影响相关存储过程或存储功能。 7. MySQL存储过程的删除 删除一个存储过程比较简单,和删除表一样: DROPPROCEDURE 从MySQL的表格中删除一个或多个存储过程。 8. MySQL存储过程的控制语句 (1).变量作用域 内部的变量在其作用域范围内享有更高的优先权,当执行到end。变量时,内部变量消失,此时已经在其作用域外,变量不再可见了,应为在存储 过程外再也不能找到这个申明的变量,但是你可以通过out参数或者将其值指派 给会话变量来保存其值。 mysql > DELIMITER // mysql > CREATE PROCEDURE proc3() -> begin -> declare x1 varchar(5) default 'outer'; -> begin -> declare x1 varchar(5) default 'inner'; -> select x1; -> end; -> select x1; -> end; -> // mysql > DELIMITER ; (2). 条件语句 Ⅰ. if-then-else语句 mysql > DELIMITER // mysql > CREATE PROCEDURE proc2(IN parameter int) -> begin -> declare var int; -> set var=parameter+1; -> if var=0 then -> insert into t values(17); -> end if; -> if parameter=0 then -> update t set s1=s1+1; -> else -> update t set s1=s1+2; -> end if; -> end; -> // mysql > DELIMITER ; Ⅱ. case语句: mysql > DELIMITER // mysql > CREATE PROCEDURE proc3 (in parameter int) -> begin -> declare var int; -> set var=parameter+1; -> case var -> when 0 then -> insert into t values(17); -> when 1 then -> insert into t values(18); -> else -> insert into t values(19); -> end case; -> end; -> // mysql > DELIMITER ; (3).循环语句 Ⅰ. while ···· endwhile: mysql > DELIMITER // mysql > CREATE PROCEDURE proc4() -> begin -> declare var int; -> set var=0; -> while var<6 do -> insert into t values(var); -> set var=var+1; -> end while; -> end; -> // mysql > DELIMITER ; (编辑:PHP编程网 - 黄冈站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |