实例解析MySQL中的存储过程及存储过程的调用方法
mysql在5.1之后增加了存储过程的功能,存储过程运行在mysql内部,语句都已经编译好了,速度比sql更快.存储过程与mysql相当于shell和linux系统。如果你是程序员的话,那我告诉你存储过程实际上是一个方法,你只要调用这个方法,并且输入它设置好的参数就可以获取或者执行你想要的操作了.看了如下存储过程实例,你会发现mysql存储过程和shell很像.
下面存储过程内容为:调用存储过程,并且传入用户名,密码参数。存储过程会将这她们存储到process_test表里面.看实例
一,创建数据库
mysql>createdatabasedb_proc;
二,创建表
mysql>CREATETABLE`proc_test`( `id`tinyint(4)NOTNULLAUTO_INCREMENT,#ID,自动增长 `username`varchar(20)NOTNULL,#用户名 `password`varchar(20)NOTNULL,#密码 PRIMARYKEY(`id`)#主键 )ENGINE=MyISAMAUTO_INCREMENT=50DEFAULTCHARSET=utf8;#设置表引擎和字符集
三、创建存储过程
createproceduremytest(innamevarchar(20),inpwdvarchar(20))#定义传入的参数 begin insertintoproc_test(username,password)values(name,pwd); #把传进来的参数name和pwd插入表中,别忘记分号 end;#注意这个分号别忘记了 createproceduremytest(innamevarchar(20),inpwdvarchar(20))#定义传入的参数 begin insertintoproc_test(username,password)values(name,pwd); #把传进来的参数name和pwd插入表中,别忘记分号 end;#注意这个分号别忘记了
四、测试调用存储过程
用法:call存储过程名称(传入的参数)
callproc_test("绝心是凉白开","www.nhooo.com")
username为”绝心是凉白开“传入数据库中,密码”www.nhooo.com“
五、查看数据库中有无加入的数据
select*fromproc_testwhereusername=‘绝心是凉白开';#如果有内容说明成功了
六、删除存储过程
dropprocdure存储过程名;
七、通用分页存储过程代码及调用
DROPPROCEDUREIFEXISTSpr_pager; CREATEPROCEDUREpr_pager( INp_table_nameVARCHAR(1024),/*表名*/ INp_fieldsVARCHAR(1024),/*查询字段*/ INp_page_sizeINT,/*每页记录数*/ INp_page_nowINT,/*当前页*/ INp_order_stringVARCHAR(128),/*排序条件(包含ORDER关键字,可为空)*/ INp_where_stringVARCHAR(1024),/*WHERE条件(包含WHERE关键字,可为空)*/ OUTp_out_rowsINT/*输出记录总数*/ ) NOTDETERMINISTIC SQLSECURITYDEFINER COMMENT'分页存储过程' BEGIN /*定义变量*/ DECLAREm_begin_rowINTDEFAULT0; DECLAREm_limit_stringCHAR(64); /*构造语句*/ SETm_begin_row=(p_page_now-1)*p_page_size; SETm_limit_string=CONCAT('LIMIT',m_begin_row,',',p_page_size); SET@COUNT_STRING=CONCAT('SELECTCOUNT(*)INTO@ROWS_TOTALFROM',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); /*预处理*/ PREPAREcount_stmtFROM@COUNT_STRING; EXECUTEcount_stmt; DEALLOCATEPREPAREcount_stmt; SETp_out_rows=@ROWS_TOTAL; PREPAREmain_stmtFROM@MAIN_STRING; EXECUTEmain_stmt; DEALLOCATEPREPAREmain_stmt; END;
1.取记录调用:
callpr_pager('表名','*',25,1,'','',@count_rows); callpr_pager('user','*',15,2,'','whereid>3',@count_rows); callpr_pager('user','*',15,1,'groupbypasswordorderbyiddesc','',@count_rows);
2.调用1后再取条数调用:
select@count_rows; select@MAIN_STRING//selectsql select@COUNT_STRING//seelctcountsql
支持多表级联,分组:
callpr_pager('jobjleftjoinenter_jobejonj.job_no=ej.job_no','j.*,ej.*','25','1','groupbyej.put_away_userorderbyej.put_away_userdesc','wherej.job_table="enter"',@p_out_rows);