最简单的例子:
mysql> DELIMITER $$mysql> USE test $$Database changedmysql> 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 |+----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------<p>本文来源gao!%daima.com搞$代*!码$网9</p>----------------------+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 changedmysql> 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 '<pre>';print_r($array);
但是在PB中调用,报错如下(来自itpub的网友的例子),有类似经历的朋友请分享下经验啊:
在PB W_MAIN窗体的CB_1.CLICK事件中:
string ls_bmh, ls_errtextint li_maxnols_bmh = '0901'sp_GetMaxNumber(ls_bmh, li_maxno)ls_errtext = sqca.sqlerrtextmessagebox('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.
以上就是MySQL 存储过程带in和out参数以及PHP,PB如何调用的小例子的内容,更多相关内容请关注搞代码(www.gaodaima.com)!