MySQL存储过程与触发器教程:深入了解数据库编程(续)

4.存储过程
存储过程是一组预编译的SQL语句,封装在一个过程中,以便在需要时重复使用。它们允许你创建自定义的功能,如计算、数据验证和业务逻辑。存储过程在数据库中执行,并接受参数、返回值以及操作数据。
4.1创建存储过程
创建存储过程的语法如下:

CREATE  PROCEDURE存储过程名称  (
参数1数据类型,
参数2数据类型,
...
)
BEGIN
语句1
...
END;

4.2调用存储过程
调用存储过程的方法有以下几种:

  1. 使用CALL语句直接调用存储过程:
CALL存储过程名称(参数1,参数2,...);
  1. 在SQL语句中使用存储过程:
SELECT存储过程名称(参数1,参数2,...)  FROM  ...;
  1. 在应用程序中调用存储过程:
    使用编程语言(如Python、Java等)调用存储过程,如下所示:
import  mysql.connector
#连接数据库
cnx  =  mysql.connector.connect(user='username',  password='password',  host='localhost',  database='testdb')
cursor  =  cnx.cursor()
#调用存储过程
cursor.callproc('存储过程名称',  args=('参数1',  '参数2',  ...))
#获取存储过程的结果
for  result  in  cursor.stored_results():
print(result.fetchall())
#关闭游标和连接
cursor.close()
cnx.close()

4.案例:创建一个存储过程,用于计算两个数字的和

CREATE  PROCEDURE  sum_calculation(IN  num1  INT,  IN  num2  INT,  OUT  result  INT)
BEGIN
SET  result  =  num1  +  num2;
END;

调用存储过程:

CALL  sum_calculation(10,20,  @result);
SELECT  @result;

5.触发器
触发器是一种与表相关的预编译SQL语句,当表的数据发生变化时自动执行。它们用于维护数据的完整性和一致性。触发器可以分为插入、更新和删除触发器。
5.1创建触发器
创建触发器的语法如下:

CREATE  TRIGGER触发器名称
触发事件  ON表名称
FOR  EACH  ROW
BEFORE  INSERT  OR  UPDATE  OR  DELETE
执行语句;

5.2触发器案例
1.插入触发器:
当向tcommodity表中插入数据时,更新tstock表中的库存数量。

CREATE  TRIGGER  after_insert_commoditystock
AFTER  INSERT  ON  tcommodity  FOR  EACH  ROW
BEGIN
UPDATE  tstock  SET  finQuantity  =  finQuantity  +1  WHERE  fpurchaseNumber  =  NEW.fpurchaseNumber  AND  fgoodsId  =  NEW.fgoodsId;
END;

2.更新触发器:
当更新tdistribution表中的fflag字段为“已作废”时,更新tstocktotal表中的库存数量。

CREATE  TRIGGER  after_update_distribution
AFTER  UPDATE  ON  tdistribution  FOR  EACH  ROW
BEGIN
IF  NEW.fflag  =  'INVALID'  THEN
UPDATE  tstocktotal  SET  fquantity  =  fquantity  -  NEW.fdistQuantity  WHERE  fgoodsId  =  NEW.fgoodsId  AND  fwarehouseCode  =  OLD.fwarehouseCode;
END  IF;
END;

3.删除触发器:
当删除tdistribution表中的数据时,更新tstock表中的库存数量。
```
CREATE TRIGGER after_delete_distribution
AFTER DELETE ON tdistribution FOR EACH ROW
BEGIN
UPDATE tstock SET finQuantity = finQuantity + OLD.fdistQuantity WHERE fpurchaseNumber = OLD.fpurchaseNumber AND fgoodsId = OLD.fgoodsId;
END;

dawei

【声明】:连云港站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。