4.存储过程
存储过程是一组预编译的SQL语句,封装在一个过程中,以便在需要时重复使用。它们允许你创建自定义的功能,如计算、数据验证和业务逻辑。存储过程在数据库中执行,并接受参数、返回值以及操作数据。
4.1创建存储过程
创建存储过程的语法如下:
CREATE  PROCEDURE存储过程名称  (
参数1数据类型,
参数2数据类型,
...
)
BEGIN
语句1
...
END;
4.2调用存储过程
调用存储过程的方法有以下几种:
- 使用
CALL语句直接调用存储过程: 
CALL存储过程名称(参数1,参数2,...);
- 在SQL语句中使用存储过程:
 
SELECT存储过程名称(参数1,参数2,...)  FROM  ...;
- 在应用程序中调用存储过程:
使用编程语言(如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;