Mysql调试存储过程最简单的方法
以前同事告诉我用临时表插入变量数据来查看,但是这种方法过于麻烦,而且Mysql没有比较好的调试存储过程的工具。今天google了下发现可以用select + 变量名的方法来调试。。。真是让我汗颜啊。
具体方法:
在你的存储过程中加入如下语句:
SELECT 变量1,变量2;
然后用mysql自带的cmd程序进入mysql> 下。
call 你的存储过程名(输入参数1,@输出参数);(注:这里帮助下新同学,如果你的存储过程有输出变量,那么在这里只需要加 @ 然后跟任意变量名即可);
即可发现你的变量值被打印到了cmd下,简单吧?
========
创建mysql中的“存储过程”及创建后调试该“存储过程”的方法
1.创建一个名为“p_buyByCash1”的存储过程,创建如下:
CREATE DEFINER=`3dmodelbaseadmin`@`%` PROCEDURE `p_buyBycash1`(
in p_cMEMID INT UNSIGNED,
in p_curTotal DECIMAL(10,2),
in p_cMIDGroup varchar(6000),
in p_lDateTime DATETIME,
in p_transactionID char(100),
in p_orderID char(100),
in p_remarks char(100),
in p_transactionID_site char(100),
in p_remarks_site char(100),
in p_sellerID INT UNSIGNED,
in p_royalty float,
in p_translation float,
in p_loginName_site varchar(50))
BEGIN
DECLARE p_cMEMID_site INT;
DECLARE p_balance_site DECIMAL(10,2);
DECLARE p_balance DECIMAL(10,2);
set p_cMEMID_site=(select cMEMID from m_member where cLoginName=p_loginName_site);
UPDATE m_MemberMoney SET cMoney=cMoney-p_curTotal,
cDownModelTotal=cDownModelTotal+1 WHERE cMEMID=p_cMEMID;
UPDATE m_memberMoney SET cMoney= cMoney+p_curTotal WHERE cMEMID = p_cMEMID_site;
set p_balance_site = (select cMoney from m_memberMoney where cMEMID=p_cMEMID_site);
set p_balance = (select cMoney from m_memberMoney where cMEMID=p_cMEMID);
INSERT INTO cashDetail(transactionID,orderID,transactionTime,direction,remarks,income,expense,balance,cMEMID)
values(p_transactionID,p_orderID,p_lDateTime,1,p_remarks,0,p_curTotal,p_balance,p_cMEMID);
INSERT INTO cashDetail(transactionID,orderID,transactionTime,direction,remarks,income,expense,balance,cMEMID)
values(p_transactionID_site,p_orderID,p_lDateTime,0,p_remarks_site,p_curTotal,0,p_balance_site,p_cMEMID_site);
INSERT INTO l_MemberDownLog(cMEMID,lState,lIntegral,lMoney,lDateTime,cMIDGroup,orderID,sellerID,royalty,
translation,cashOrPoints,endTime,refundTime,evaluation,comments,commentTime,commentState)
values(p_cMEMID,0,0,p_curTotal,p_lDateTime,p_cMIDGroup,p_orderID,p_sellerID,p_royalty,
p_translation,0,NULL,NULL,0,NULL,NULL,0);
END
注:declare声明需放在sql操作(insert、select等)的最前面;
2.创建之后怎样验证创建的存储过程是否正确,下面提供一种调试方法:
通过mysql的控制台:“MySQL Command Line Client”,进行调试。
直接 select 变量; 就可用在控制台输出。
在p_buyByCash存储过程中添加几个select 变量,来查看变量的输出是否正确,修改后如下:
CREATE DEFINER=`3dmodelbaseadmin`@`%` PROCEDURE `p_buyBycash1`(
in p_cMEMID INT UNSIGNED,
in p_curTotal DECIMAL(10,2),
in p_cMIDGroup varchar(6000),
in p_lDateTime DATETIME,
in p_transactionID char(100),
in p_orderID char(100),
in p_remarks char(100),
in p_transactionID_site char(100),
in p_remarks_site char(100),
in p_sellerID INT UNSIGNED,
in p_royalty float,
in p_translation float,
in p_loginName_site varchar(50))
BEGIN
DECLARE p_cMEMID_site INT;
DECLARE p_balance_site DECIMAL(10,2);
DECLARE p_balance DECIMAL(10,2);
set p_cMEMID_site=(select cMEMID from m_member where cLoginName=p_loginName_site);
select p_cMEMID_site;
UPDATE m_MemberMoney SET cMoney=cMoney-p_curTotal,
cDownModelTotal=cDownModelTotal+1 WHERE cMEMID=p_cMEMID;
UPDATE m_memberMoney SET cMoney= cMoney+p_curTotal WHERE cMEMID = p_cMEMID_site;
set p_balance_site = (select cMoney from m_memberMoney where cMEMID=p_cMEMID_site);
set p_balance = (select cMoney from m_memberMoney where cMEMID=p_cMEMID);
select p_balance_site;
select p_balance;
INSERT INTO cashDetail(transactionID,orderID,transactionTime,direction,remarks,income,expense,balance,cMEMID)
values(p_transactionID,p_orderID,p_lDateTime,1,p_remarks,0,p_curTotal,p_balance,p_cMEMID);
INSERT INTO cashDetail(transactionID,orderID,transactionTime,direction,remarks,income,expense,balance,cMEMID)
values(p_transactionID_site,p_orderID,p_lDateTime,0,p_remarks_site,p_curTotal,0,p_balance_site,p_cMEMID_site);
INSERT INTO l_MemberDownLog(cMEMID,lState,lIntegral,lMoney,lDateTime,cMIDGroup,orderID,sellerID,royalty,
translation,cashOrPoints,endTime,refundTime,evaluation,comments,commentTime,commentState)
values(p_cMEMID,0,0,p_curTotal,p_lDateTime,p_cMIDGroup,p_orderID,p_sellerID,p_royalty,
p_translation,0,NULL,NULL,0,NULL,NULL,0);
END
然后进入命令行:
执行 call "这儿写数据库的名字".p_buyByCash1(20,0.85,'20111012','2011-6-20 10:09:56','20201012','10151012','buy the goods','4567891012','buyer buy',20,0.16,0,'article');即可
下面是我执行的结果:
创建mysql中的“存储过程”及创建后调试该“存储过程”的方法
3.下面再给出一个可以自己测试的小例子:
小测试:
CREATE PROCEDURE `test`()
begin
declare a varchar(10);
set a = "test";
select a;
select a;
end;
然后进入命令行:
执行 call test();即可
========
MySQL存储过程调试工具
工具官网地址:http://www.devart.com/dbforge/mysql/studio/
对于某些存储过程很多且复杂的SQL的应用,在短时间内要使得所有MySQL存储过程和函数正常运行,那么如果能找到一个比较好的调试工具,就可以事半功倍, 这里介绍的是dbForge Studio for MySQL。
1. 首先说明dbForge Studio for MySQL具有存储过程调试功能的版本是收费的,但有30天调用期,我想足以满足你的要求。
2安装部分省略,直接官网下载安装,没有依赖包,直接简单
3,调试存储过程,建议调试在测试环境下进行。
3.1 为存储过程,生成调试信息:右击要调试的过程--"Debug"--"Compile for Debugging', 操作如下
3.2 为存储过程设置断点:打开存储过程的代码, 在你要设置断点的行上双击便可
3.3 调试存储过程,单步执行,并查看每个变量的值。
右击存储过程---"Debug"--"Step Into", 如下图
先择"Stop Into"后,如果你的存储过程有参数,则为弹出窗体提示输入参数值,如果没有,则不直接运行;
存储过程会从"begin"开始执行,然后点又上角的"step over"(F10), 单步执行。
查看变量值:选中变量,点右键,选择"Add Wath", 这个变量就会在"Watches"这个视图区出现,如果你单步运行到这个变量值,则可以看见了,这样就可以调试,变量值是否正确,有错误没,循环次数等。
调试和Eclipse差不多,粗略作个说明,方便自己以后查找,没用过的同学按步骤折腾一下就知道如何用了。
========