MySQL存储过程带in和out参数

MySQL支持IN(传递给存储过程)、OUT(从存储过程传出)、INOUT(对存储过程传入和传出)
所有MySQL变量必须以@开始!
 
最简单的例子:
[html]
mysql> DELIMITER $$  //<span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; font-size: 14px; line-height: 25.2000007629395px; background-color: rgb(247, 252, 255);"><span style="line-height: 25.2000007629395px; color: rgb(255, 0, 0);">用delimiter命令来把语句定界符从 ;变为//。</span></span><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; font-size: 14px; line-height: 25.2000007629395px; background-color: rgb(247, 252, 255);">这样就允许在程序体用;定界符传递到服务器,而不是被mysql自己来解释。</span>
mysql> USE test $$  
Databasechanged 
mysql>DROPPROCEDUREIF EXISTS `sp_add`$$  
Query OK, 0 rowsaffected (0.00 sec)  
   
mysql>CREATEPROCEDUREsp_add(a INT, b INT,OUTcINT) 
    ->BEGIN  
    ->SETc=a+ b;  
    ->END$$ 
Query OK, 0 rowsaffected (0.00 sec)  
   
mysql> DELIMITER ;


mysql> CALL sp_add (1,2,@c);  
Query OK, 0 rowsaffected (0.00 sec)</p><p>mysql> SELECT@c; 
+------+ 
| @c   |  
+------+ 
|    3 |  
+------+ 
1 row inset(0.00 sec)

一个稍微复杂的例子:
mysql> show createtablet_BillNo;  
+----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 
|Table   |CreateTable                                                                                                                                                                       | 
+----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 
| t_BillNo | CREATETABLE`t_billno` (  
  `SaleNo`bigint(20)DEFAULTNULL, 
  `bmh`varchar(20)DEFAULTNULL 
) ENGINE=InnoDB DEFAULTCHARSET=utf8 CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC| 
+----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 
1 row inset(0.00 sec)  
   
mysql>select*fromt_BillNo; 
+--------+------+ 
| SaleNo | bmh  |  
+--------+------+ 
|      1 | 2    |  
|      4 | 3    |  
|      4 | 5    |  
|      7 | 7    |  
|     12 | 8    |  
+--------+------+ 
5rowsinset (0.00 sec)  
   
mysql>  
mysql> DELIMITER $$  
mysql> USE test $$  
Databasechanged 
mysql>DROPPROCEDUREIF EXISTS `sp_GetMaxNumber`$$  
Query OK, 0 rowsaffected (0.01 sec)  
   
DELIMITER $$  
USE test $$  
DROPPROCEDUREIF EXISTS `sp_GetMaxNumber`$$  
CREATEPROCEDUREsp_GetMaxNumber (INv_bmhVARCHAR(6),OUTv_MaxNoINT) 
BEGIN 
    STARTTRANSACTION; 
    UPDATEt_BillNo 
    SETSaleNo = IFNULL(SaleNo,0)+1   
    WHEREbmh = v_bmh;  
    IF @@error_count = 0 THEN 
        BEGIN 
          SELECTSalenoINTOv_MaxNoFROMt_BillNoWHEREbmh = v_bmh;  
        COMMIT; 
        END; 
    ELSE 
        BEGIN 
             ROLLBACK; 
             SETv_MaxNo = 0;  
        END; 
    ENDIF; 
END$$ 
DELIMITER ;  
   
mysql>CREATEPROCEDUREsp_GetMaxNumber (INv_bmhVARCHAR(6),OUTv_MaxNoINT) 
    ->BEGIN 
    -> START TRANSACTION; 
    ->UPDATEt_BillNo 
    ->SETSaleNo = IFNULL(SaleNo,0)+1   
    ->WHEREbmh = v_bmh;  
    -> IF @@error_count = 0 THEN 
    ->BEGIN 
    ->  SELECTSalenoINTOv_MaxNoFROMt_BillNoWHEREbmh = v_bmh;  
    ->COMMIT; 
    ->END; 
    ->ELSE 
    ->BEGIN 
    ->     ROLLBACK; 
    ->     SETv_MaxNo = 0;  
    ->END; 
    ->ENDIF; 
    ->END$$ 
Query OK, 0 rowsaffected (0.00 sec)  
   
mysql> DELIMITER ;  
mysql>  
   
mysql> call sp_GetMaxNumber(8,@v_MaxNo);  
Query OK, 0 rowsaffected (0.00 sec)  
   
mysql>select@v_MaxNo; 
+----------+ 
| @v_MaxNo |  
+----------+ 
|       12 |  
+----------+ 
1 row inset(0.00 sec)  


?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值