MySQL 存储过程传参之in, out, inout 参数用法,mysqlinout
存储过程传参:存储过程的括号里,可以声明参数。 语法是 create procedure p([in/out/inout] 参数名 参数类型 ..) in :给参数传入值,定义的参数就得到了值 out:模式定义的参数只能在过程体内部赋值,表示该参数可以将某个值传递回调用他的过程(在存储过程内部,该参数初始值为 null,无论调用者是否给存储过程参数设置值) inout:调用者还可以通过 inout 参数传递值给存储过程,也可以从存储过程内部传值给调用者如果仅仅想把数据传给 MySQL 存储过程,那就使用“in” 类型参数; 如果仅仅从 MySQL 存储过程返回值,那就使用“out” 类型参数; 如果需要把数据传给 MySQL 存储过程,还要经过一些计算后再传回给我们,此时,要使用“inout” 类型参数。 MySQL 存储过程参数如果不显式指定"in"、"out"、"inout",则默认为"in"。
实例一:存储过程传参 in
DELIMITER $$
CREATE PROCEDURE p1(IN num INT)
BEGIN
DECLARE i INT DEFAULT 0;
DECLARE total INT DEFAULT 0;
WHILE i<=num DO
SET total := i + total;
SET i := i+1;
END WHILE;
SELECT total;
END$$
实例二:存储过程传参 out
CREATE PROCEDURE p2(OUT num INT) BEGIN SELECT num AS num_1; IF (num IS NOT NULL) THEN SET num = num + 1; SELECT num AS num_2; ELSE SELECT 1 INTO num; END IF; SELECT num AS num_3; END$$ SET @num = 10$$ CALL p2(@num)$$ SELECT @num AS num_out$$
实例三:存储过程传参 inout
CREATE PROCEDURE p3(INOUT age INT) BEGIN SET age := age + 20; END$$ set @currage =18$$ call p3(@currage)$$ select @currage$$
mysql> create PROCEDURE sp_GetPageRecord( IN TableName VARCHAR(100), IN Primar
yKey VARCHAR(50), IN Col1 VARCHAR(255) , IN WhereSql VARCHAR(255) , IN Sort V
ARCHAR(200) , IN PageSize INT , IN CurrPage INT, IN IsDesc BIT(1) ) BEGIN END;
Query OK, 0 rows affected (0.00 sec)
当然首先要确认下MySQL版本。MySQL从5.0版本开始支持存储过程
一、VARCHAR类型最多支持255个字符,超过255个字符可以考虑用TEXT变量。TEXT变量支持最大到65536个字节。
二、不支持参数中的DEFAULT值。也就是说 = ...这样的要去掉。
三、必须要有过程体,过程体的开始与结束使用BEGIN与END进行标识。
四、BIT类型支持1-64位的存储。
五、存储过程中SELECT ... INTO var_list中var_list不能用存储过程的参数。
六、下面需要注意的是DELIMITER //和DELIMITER ;两句,DELIMITER是分割符的意思,因为MySQL默认以";"为分隔符,如果我们没有声明分割符,那么编译器会把存储过程当成SQL语句进行处理,则存储过程的编译过程会报错,所以要事先用DELIMITER关键字申明当前段分隔符,这样MySQL才会将";"当做存储过程中的代码,不会执行这些代码,用完了之后要把分隔符还原。
七、存储过程根据需要可能会有输入、输出、输入输出参数,这里有一个输出参数s,类型是int型,如果有多个参数用","分割开。
参数
MySQL存储过程的参数用在存储过程的定义,共有三种参数类型,IN,OUT,INOUT,形式如:
CREATE PROCEDURE([[IN |OUT |INOUT ] 参数名 数据类形...])
IN 输入参数:表示该参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值
OUT 输出参数:该值可在存储过程内部被改变,并可返回
INOUT 输入输出参数:调用时指定,并且可被改变和返回
在mysql命令提示符下逐行输入下面的语句。
delimiter //
create procedure `demo_out_total`(IN tbl_name varchar(255), IN whereClause varchar(255), OUT
total_tbl int)
BEGIN
DECLARE t_status int default 0;
DECLARE v_sql VARCHAR(500);
DECLARE continue HANDLER FOR SQLSTATE '23000' SET t_status = 1;
DECLARE continue HANDLER FOR SQLEXCEPTION SET t_status = 2;
set v_sql = CONCAT('select count(*) into @total from ',tbl_name, ' where ',wher......余下全文>>
1. exec 存储过程名
2. exec 存储过程名 参数1,参数2,参数3......
或者exec 存储过程名 参数1='',参数2='',参数3=''......