MySQL 存储过程带in和out参数以及PHP,PB如何调用的小例子

来源:互联网 发布:电子音乐相册软件 编辑:程序博客网 时间:2024/04/29 08:11


最简单的例子:

  1. mysql> DELIMITER $$  
  2. mysql> USE test $$  
  3. Database changed  
  4. mysql> DROP PROCEDURE IF EXISTS `sp_add`$$  
  5. Query OK, 0 rows affected (0.00 sec)  
  6.   
  7. mysql> CREATE PROCEDURE sp_add(a INT, b INT,OUT c INT)  
  8.     -> BEGIN   
  9.     -> SET c=a+ b;  
  10.     -> END$$  
  11. Query OK, 0 rows affected (0.00 sec)  
  12.   
  13. mysql> DELIMITER ;  
  1. <p>mysql> CALL sp_add (1,2,@c);  
  2. Query OK, 0 rows affected (0.00 sec)</p><p>mysql> SELECT @c;  
  3. +------+  
  4. | @c   |  
  5. +------+  
  6. |    3 |  
  7. +------+  
  8. 1 row in set (0.00 sec)</p><p>mysql> </p>  


一个稍微复杂的例子:

  1. mysql> show create table t_BillNo;  
  2. +----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+  
  3. | Table    | Create Table                                                                                                                                                                        |  
  4. +----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+  
  5. | t_BillNo | CREATE TABLE `t_billno` (  
  6.   `SaleNo` bigint(20) DEFAULT NULL,  
  7.   `bmh` varchar(20) DEFAULT NULL  
  8. ENGINE=InnoDB DEFAULT CHARSET=utf8 CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC |  
  9. +----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+  
  10. 1 row in set (0.00 sec)  
  11.   
  12. mysql> select * from t_BillNo;  
  13. +--------+------+  
  14. | SaleNo | bmh  |  
  15. +--------+------+  
  16. |      1 | 2    |  
  17. |      4 | 3    |  
  18. |      4 | 5    |  
  19. |      7 | 7    |  
  20. |     12 | 8    |  
  21. +--------+------+  
  22. 5 rows in set (0.00 sec)  
  23.   
  24. mysql>   
  25. mysql> DELIMITER $$  
  26. mysql> USE test $$  
  27. Database changed  
  28. mysql> DROP PROCEDURE IF EXISTS `sp_GetMaxNumber`$$  
  29. Query OK, 0 rows affected (0.01 sec)  
  30.   
  31. DELIMITER $$  
  32. USE test $$  
  33. DROP PROCEDURE IF EXISTS `sp_GetMaxNumber`$$  
  34. CREATE PROCEDURE sp_GetMaxNumber (IN v_bmh VARCHAR(6), OUT v_MaxNo INT)  
  35. BEGIN  
  36.     START TRANSACTION;  
  37.     UPDATE t_BillNo  
  38.     SET SaleNo = IFNULL(SaleNo,0)+1   
  39.     WHERE bmh = v_bmh;  
  40.     IF @@error_count = 0 THEN  
  41.         BEGIN  
  42.           SELECT Saleno INTO v_MaxNo FROM t_BillNo WHERE bmh = v_bmh;  
  43.         COMMIT;  
  44.         END;  
  45.     ELSE  
  46.         BEGIN  
  47.              ROLLBACK;  
  48.              SET v_MaxNo = 0;  
  49.         END;  
  50.     END IF;  
  51. END$$  
  52. DELIMITER ;  
  53.   
  54. mysql> CREATE PROCEDURE sp_GetMaxNumber (IN v_bmh VARCHAR(6), OUT v_MaxNo INT)  
  55.     -> BEGIN  
  56.     -> START TRANSACTION;  
  57.     -> UPDATE t_BillNo  
  58.     -> SET SaleNo = IFNULL(SaleNo,0)+1   
  59.     -> WHERE bmh = v_bmh;  
  60.     -> IF @@error_count = 0 THEN  
  61.     -> BEGIN  
  62.     ->   SELECT Saleno INTO v_MaxNo FROM t_BillNo WHERE bmh = v_bmh;  
  63.     -> COMMIT;  
  64.     -> END;  
  65.     -> ELSE  
  66.     -> BEGIN  
  67.     ->      ROLLBACK;  
  68.     ->      SET v_MaxNo = 0;  
  69.     -> END;  
  70.     -> END IF;  
  71.     -> END$$  
  72. Query OK, 0 rows affected (0.00 sec)  
  73.   
  74. mysql> DELIMITER ;  
  75. mysql>   
  76.   
  77. mysql> call sp_GetMaxNumber(8,@v_MaxNo);  
  78. Query OK, 0 rows affected (0.00 sec)  
  79.   
  80. mysql> select @v_MaxNo;  
  81. +----------+  
  82. | @v_MaxNo |  
  83. +----------+  
  84. |       12 |  
  85. +----------+  
  86. 1 row in set (0.00 sec)  


如何在php中调用MySQL的存储过程?本人没有测试过,从朋友那里借鉴过实例,如下:

$sql = "call test.sp_GetMaxNumber(8,@c);";
mysql_query($sql);//调用sp_GetMaxNumber的存储过程
$result = mysql_query('select @c;');
$array = mysql_fetch_array($result);
echo '<pre>';print_r($array);


 

但是在PB中调用,报错如下(来自itpub的网友的例子),有类似经历的朋友请分享下经验啊:

在PB W_MAIN窗体的CB_1.CLICK事件中:

string ls_bmh, ls_errtext
int li_maxno
ls_bmh = '0901'

sp_GetMaxNumber(ls_bmh, li_maxno)
ls_errtext = sqca.sqlerrtext
messagebox('Error',string(li_maxno)+' ' +sqlca.sqlerrtext)

但PB显示显示错误:
0 SQLSTATE = 37000
[MYSQL] [ODBC 5.1 DRIVER]YOU HAVE AN ERROR IN YOUR SQL SYNTAX;CHECK THE MANUAL THAT CORRESPONDS TO YOUR MYSQL SERVER VERSION FOR THE RIGHT SYNTAX TO USE NEAR '?=CALL SP_GetMaxNumber(0,_GBK'0901') AT LINE 1.

0 0