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;