各位用户为了找寻关于实例解析MySQL中的存储过程及存储过程的调用方法的资料费劲了很多周折。这里教程网为您整理了关于实例解析MySQL中的存储过程及存储过程的调用方法的相关资料,仅供查阅,以下为您介绍关于实例解析MySQL中的存储过程及存储过程的调用方法的详细内容
mysql在5.1之后增加了存储过程的功能, 存储过程运行在mysql内部,语句都已经编译好了,速度比sql更快. 存储过程与mysql相当于shell和linux系统。如果你是程序员的话,那我告诉你存储过程实际上是一个方法,你只要调用这个方法,并且输入它设置好的参数就可以获取或者执行你想要的操作了. 看了如下存储过程实例,你会发现mysql存储过程和shell很像. 下面存储过程内容为:调用存储过程,并且传入用户名,密码参数。存储过程会将这她们存储到process_test表里面.看实例
一,创建数据库
? 1mysql>
create
database
db_proc;
二,创建表
? 1 2 3 4 5 6mysql>
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; #设置表引擎和字符集
三、创建存储过程
? 1 2 3 4 5 6 7 8 9 10 11create
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.zzvips.com") username为”绝心是凉白开“传入数据库中,密码”www.zzvips.com“
五、查看数据库中有无加入的数据
? 1select
*
from
proc_test
where
username=‘绝心是凉白开';#如果有内容说明成功了
六、删除存储过程
? 1drop
procdure 存储过程名;
七、通用分页存储过程代码及调用
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38DROP
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
(64);
/*构造语句*/
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.取记录调用:
? 1 2 3call 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后再取条数调用:
? 1 2 3select
@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);
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
<?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
);
}
普通的查询,只返回一个结果集,而存储过程却返回至少两个结果集,其中一个就是存储过程的执行状态。我们必须要清除了这个执行状态以后,才可能再次调用另外一个存储过程 。
? 1 2 3 4 5 6 7 8<?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.
? 1define(
'CLIENT_MULTI_RESULTS'
, 131072);
2.
? 1$link = mysql_connect(
"127.0.0.1"
,
"root"
,
""
,1,CLIENT_MULTI_RESULTS)
or
die(
"Could not connect: "
.mysql_error());