(1)入参,出参不带@,out写在前面。 (2)不能return,得定义一个label,然后leave,如: ExitLabel:BEGIN ..... ....LEAVE ExitLabel; ... (3)declare 变量要集中放在begin后面,不能随便放。 declare 变量也不用@,后面用时也不带@
(4)in变量,貌似引用时,可以带@,能取到值。
(5)out变量,别带@,带了@,存储过程外面看不到这个值。
(6)set @aa=0;这种变量直接用即可,不用事先delare,
带@就永远带@,记住@aa和aa是两个变量。
(7)select的影响行数使用FOUND_ROWS(), DECLARE aff INT; /* SQL 影响记录条数 */ ..select... SELECT FOUND_ROWS() INTO aff;
不过debug时,经常没数据,还返回1,贼奇怪。
(8)select字段into变量,多个时,是这样写: select xx字段,yy字段,zz字段 into v_xx,v_yy,v_zz .... 否则报yy字段不存在。
(9)最郁闷的是变量名不能和字段名重名,真TM变态,~~
(10)if ...then.. ...elseif ...then ...elseif ...then ...else ...end if;
(11)异常处理
DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN RETURN 0; END; 这个是个function,所以能return, 这个是exit处理,就是出sql异常时,直接exit了。 还可以是continue处理什么的。
(12)事务处理
DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN ROLLBACK; END;
START TRANSACTION; ...update...什么的
DROP PROCEDURE IF EXISTS `sptbUnit_ValidatedUnitAndUnitAlias`; DELIMITER //
create PROCEDURE sptbUnit_ValidatedUnitAndUnitAlias( v_fdUnit varchar(64), v_fdUnitAlias varchar(64), v_fdUpdateID varchar(32), v_fdUpdateName varchar(32), out fdReturnCode int ) ExitLabel:BEGIN DECLARE aff INT; /* SQL 影响记录条数 */
declare v_fdBasicUnit varchar(64); declare v_fdState int; declare v_fdType int; declare v_fdKind varchar(64); declare v_fdFactor float; select fdState,fdType,fdFactor,fdBasicName into v_fdState,v_fdType,v_fdFactor,v_fdBasicUnit from tbUnit where fdName=@v_fdUnit; SELECT FOUND_ROWS() INTO aff; if aff=0 then set fdReturnCode=100; elseif v_fdState<>1 then set fdReturnCode=103; elseif v_fdType=1 or v_fdType=2 then select fdState,fdType into v_fdState,v_fdType from tbUnit where fdName=@v_fdUnitAlias; SELECT FOUND_ROWS() INTO aff; if aff=0 then set fdReturnCode=400; elseif v_fdState<>1 then set fdReturnCode=403; elseif v_fdType<>0 then set fdReturnCode=401; else update tbUnit set fdShowName=@v_fdUnit,fdType=3,fdFactor=v_fdFactor, fdBasicName=v_fdBasicUnit, fdUpdateTime=now() where fdName=@v_fdUnitAlias; end if; else set fdReturnCode=102; end if; END // DELIMITER ;
|