视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
实例解析MySQL中的存储过程及存储过程的调用方法
2020-11-09 20:49:29 责编:小采
文档


mysql在5.1之后增加了存储过程的功能, 存储过程运行在mysql内部,语句都已经编译好了,速度比sql更快. 存储过程与mysql相当于shell和linux系统。如果你是程序员的话,那我告诉你存储过程实际上是一个方法,你只要调用这个方法,并且输入它设置好的参数就可以获取或者执行你想要的操作了. 看了如下存储过程实例,你会发现mysql存储过程和shell很像.
下面存储过程内容为:调用存储过程,并且传入用户名,密码参数。存储过程会将这她们存储到process_test表里面.看实例

一,创建数据库

mysql>create database db_proc;

二,创建表

mysql>CREATE TABLE `proc_test` (
 `id` tinyint(4) NOT NULL AUTO_INCREMENT, #ID,自动增长
 `username` varchar(20) NOT NULL, #用户名
 `password` varchar(20) NOT NULL, #密码
 PRIMARY KEY (`id`) #主键
 ) ENGINE=MyISAM AUTO_INCREMENT=50 DEFAULT CHARSET=utf8; #设置表引擎和字符集

三、创建存储过程

create procedure mytest(in name varchar(20),in pwd varchar(20))#定义传入的参数
 begin
 insert into proc_test(username,password) values(name,pwd);
#把传进来的参数name和pwd插入表中,别忘记分号
 end; #注意这个分号别忘记了

create procedure mytest(in name varchar(20),in pwd varchar(20))#定义传入的参数
 begin
 insert into proc_test(username,password) values(name,pwd);
#把传进来的参数name和pwd插入表中,别忘记分号
 end; #注意这个分号别忘记了

四、测试调用存储过程
用法:call 存储过程名称(传入的参数)
call proc_test("绝心是凉白开","www.gxlcms.com")
username为”绝心是凉白开“传入数据库中,密码”www.gxlcms.com“

五、查看数据库中有无加入的数据

select * from proc_test where username=‘绝心是凉白开';#如果有内容说明成功了

六、删除存储过程

drop procdure 存储过程名;

七、通用分页存储过程代码及调用

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), /*排序条件(包含ORDER关键字,可为空)*/ 
 IN p_where_string VARCHAR(1024), /*WHERE条件(包含WHERE关键字,可为空)*/ 
 OUT p_out_rows INT /*
输出记录总数*/ ) NOT DETERMINISTIC SQL SECURITY DEFINER COMMENT '分页存储过程' BEGIN /*定义变量*/ DECLARE m_begin_row INT DEFAULT 0; DECLARE m_limit_string CHAR(); /*构造语句*/ 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;

1.取记录调用:

call pr_pager('表名', '*', 25, 1, '', '', @count_rows); 
call pr_pager('user', '*', 15, 2, '', 'where id>3', @count_rows); 
call pr_pager('user', '*', 15, 1, 'group by password order by id desc', '', @count_rows); 

2.调用1后再取条数调用:

select @count_rows; 
select @MAIN_STRING //select sql 
select @COUNT_STRING //seelct count sql 

支持多表级联 ,分组 :

代码如下:

call pr_pager('job j left join enter_job ej on j.job_no=ej.job_no','j.*,ej.*','25','1','group by ej.put_away_user order by ej.put_away_user desc','where j.job_table="enter"',@p_out_rows);

<?php 
function dump_single_form41report($sys_report_id) { 
 $this->dbConn->setFetchMode(DB_FETCHMODE_ASSOC); 
 //SET @a=1;CALL dbpi_report.simpleproc(@a);SELECT @a; 
 $sql = "CALL dbpi_temp.dumpSingleReportForm41($sys_report_id);"; 
 $result = $this->dbConn->query($sql); 
 if (mysql_error()) { 
 die (mysql_error().'<b>:</b> dump_single_form41report(...)['.__LINE__.'];<br>'.$sql); 
 } 
 return $result; 
} 
 
function initQueuePool($sys_report_id, $username){ 
 $this->dbConn->setFetchMode(DB_FETCHMODE_ASSOC); 
 $this->checkPreviousThread($sys_report_id, $username); 
 
 $temptablename = "_".$username."_".$sys_report_id; 
 $sql = "SET @a=".$sys_report_id.";"; 
 $this->dbConn->query($sql); 
 $sql = "SET @b='".DB_REPORT.".".$temptablename."';"; 
 $this->dbConn->query($sql); 
 $sql = "SET @c='".DB_PREPRODUCT."';"; 
 $this->dbConn->query($sql); 
 $sql = "CALL ".DB_REPORT.".fm41_simpleproc(@a,@b,@c);"; 
 $this->dbConn->query($sql); 
} 

 
普通的查询,只返回一个结果集,而存储过程却返回至少两个结果集,其中一个就是存储过程的执行状态。我们必须要清除了这个执行状态以后,才可能再次调用另外一个存储过程 。

<?php 
$rs=mysql_query("call pr_pager('change_monitor','*',10,1,'','',@p_out_rows)"); 
while($rows=mysql_fetch_array($rs)){ 
 echo $rows[Schedule]; 
} 
$query=mysql_query("select @p_out_rows"); 
$v=mysql_fetch_array($query); 
can't return a result set in the given context

需要php调用存储过程,返回一个结果集,发现很困难,找了半天,终于在老外的论坛上找到解决方案,这里本地化一下。
关键就是两点:
1.

define('CLIENT_MULTI_RESULTS', 131072);

2.

$link = mysql_connect("127.0.0.1", "root", "",1,CLIENT_MULTI_RESULTS) or die("Could not connect: ".mysql_error());

您可能感兴趣的文章:

  • mysql 存储过程中变量的定义与赋值操作
  • mysql存储过程详解
  • mysql存储过程 游标 循环使用介绍
  • MySQL存储过程例子(包含事务,输出参数,嵌套调用)
  • MySql存储过程与函数详解
  • mysql 查询数据库中的存储过程与函数的语句
  • MySQL 有输入输出参数的存储过程实例
  • Mysql存储过程和函数区别介绍
  • MySQL 存储过程中执行动态SQL语句的方法
  • mysql存储过程中使用游标的实例
  • Mysql存储过程循环内嵌套使用游标示例代码
  • mysql存储过程用法实例分析
  • 下载本文
    显示全文
    专题