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

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

黄舟
黄舟asal
2017-02-17 11:50:151751semak imbas

 

最简单的例子:

mysql> DELIMITER $$
mysql> USE test $$
Database changed
mysql> DROP PROCEDURE IF EXISTS `sp_add`$$
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE PROCEDURE sp_add(a INT, b INT,OUT c INT)
    -> BEGIN 
    -> SET c=a+ b;
    -> END$$
Query OK, 0 rows affected (0.00 sec)

mysql> DELIMITER ;
mysql> CALL sp_add (1,2,@c);
Query OK, 0 rows affected (0.00 sec)mysql> SELECT @c;
+------+
| @c   |
+------+
|    3 |
+------+
1 row in set (0.00 sec)mysql>


一个稍微复杂的例子:

mysql> show create table t_BillNo;
+----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table    | Create Table                                                                                                                                                                        |
+----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| t_BillNo | CREATE TABLE `t_billno` (
  `SaleNo` bigint(20) DEFAULT NULL,
  `bmh` varchar(20) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC |
+----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> select * from t_BillNo;
+--------+------+
| SaleNo | bmh  |
+--------+------+
|      1 | 2    |
|      4 | 3    |
|      4 | 5    |
|      7 | 7    |
|     12 | 8    |
+--------+------+
5 rows in set (0.00 sec)

mysql> 
mysql> DELIMITER $$
mysql> USE test $$
Database changed
mysql> DROP PROCEDURE IF EXISTS `sp_GetMaxNumber`$$
Query OK, 0 rows affected (0.01 sec)

DELIMITER $$
USE test $$
DROP PROCEDURE IF EXISTS `sp_GetMaxNumber`$$
CREATE PROCEDURE sp_GetMaxNumber (IN v_bmh VARCHAR(6), OUT v_MaxNo INT)
BEGIN
	START TRANSACTION;
	UPDATE t_BillNo
	SET SaleNo = IFNULL(SaleNo,0)+1 
	WHERE bmh = v_bmh;
	IF @@error_count = 0 THEN
		BEGIN
		  SELECT Saleno INTO v_MaxNo FROM t_BillNo WHERE bmh = v_bmh;
		COMMIT;
		END;
	ELSE
		BEGIN
		     ROLLBACK;
		     SET v_MaxNo = 0;
		END;
	END IF;
END$$
DELIMITER ;

mysql> CREATE PROCEDURE sp_GetMaxNumber (IN v_bmh VARCHAR(6), OUT v_MaxNo INT)
    -> BEGIN
    -> START TRANSACTION;
    -> UPDATE t_BillNo
    -> SET SaleNo = IFNULL(SaleNo,0)+1 
    -> WHERE bmh = v_bmh;
    -> IF @@error_count = 0 THEN
    -> BEGIN
    ->   SELECT Saleno INTO v_MaxNo FROM t_BillNo WHERE bmh = v_bmh;
    -> COMMIT;
    -> END;
    -> ELSE
    -> BEGIN
    ->      ROLLBACK;
    ->      SET v_MaxNo = 0;
    -> END;
    -> END IF;
    -> END$$
Query OK, 0 rows affected (0.00 sec)

mysql> DELIMITER ;
mysql> 

mysql> call sp_GetMaxNumber(8,@v_MaxNo);
Query OK, 0 rows affected (0.00 sec)

mysql> select @v_MaxNo;
+----------+
| @v_MaxNo |
+----------+
|       12 |
+----------+
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 &#39;<pre class="brush:php;toolbar:false">&#39;;print_r($array);


 

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

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

string ls_bmh, ls_errtext
int li_maxno
ls_bmh = &#39;0901&#39;
sp_GetMaxNumber(ls_bmh, li_maxno)
ls_errtext = sqca.sqlerrtext
messagebox(&#39;Error&#39;,string(li_maxno)+&#39; &#39; +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 &#39;?=CALL SP_GetMaxNumber(0,_GBK&#39;0901&#39;) AT LINE 1.

 以上就是MySQL 存储过程带in和out参数以及PHP,PB如何调用的小例子的内容,更多相关内容请关注PHP中文网(www.php.cn)! 


Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn