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差不多,粗略作个说明,方便自己以后查找,没用过的同学按步骤折腾一下就知道如何用了。


========