使用存储过程在 PostgreSQL 中创建自定义工作流
介绍
PostgreSQL 通过用户定义函数,提供了编写自定义功能以增强和扩展现有内置工作流的能力。函数是一种指定一些输入并产生所需输出的简单方法。但如果您需要创建一个包装在可回滚事务中的自定义工作流,该怎么办?
输入存储过程。
简单来说,存储过程是被赋予了事务功能的函数。它非常强大,因为它允许您定义可以安全提交和回滚的预编译工作流。更不用说,存储过程速度很快,因为它们由数据库引擎可以立即执行的预编译 SQL 组成。
让我们开始吧!
注意:直到 PostgreSQL 版本 11 中才提供存储过程。
创建基本存储过程
首先,让我们回顾一下存储过程的基础知识。存储过程本质上只是用户定义的函数。存储过程和用户定义函数之间的一个主要区别是存储过程没有返回值。您仍然可以使用 RETURN 关键字提前退出过程,但您无法使用此语句实际返回值。
存储过程就像函数一样使用参数。这些参数可以指定为IN或INOUT参数。要从调用存储过程的结果中捕获输出值,您必须将存储过程定义为使用INOUT参数。
让我们创建第一个存储过程。
CREATE OR REPLACE PROCEDURE insert_funds(IN amount INT, IN account_id INT)
BEGIN
-- ...
END;
$ LANGUAGE plpgsql;
上面的 SQL 构成了存储过程的外壳,该存储过程最终将资金插入给定帐户。通过将此更新放入存储过程,您可以将这个非常重要的工作流包装在事务中。要完成此存储过程并创建事务,只需填写过程主体即可。您将在下一节中完成此操作!
提交和回滚事务
现在是时候填写add_funds存储过程的逻辑了。此过程将包括对account表的UPDATE 操作(用于更新帐户总额)和对transaction_history表的INSERT 操作。
CREATE OR REPLACE PROCEDURE add_funds(IN in_amount INT, IN in_account_id INT)
BEGIN
UPDATE account
SET total = total + in_amount
WHERE account_id = in_account_id;
INSERT INTO transaction_history(is_credit, amount, account_id)
VALUES(TRUE, in_amount, in_account_id);
COMMIT;
EXCEPTION WHEN OTHERS THEN
ROLLBACK;
END;
$ LANGUAGE plpgsql;
就是这样!在上面的代码中,首先执行更新和插入语句。然后,使用COMMIT SQL 关键字将插入和更新语句包装在事务中。最后,如果出现任何错误,请确保回滚事务!这是该过程的关键部分,可确保如果对帐户表的更新失败,您不会在transaction_history表中跟踪该事务。
剩下要做的就是执行该过程。要向帐户添加资金,请使用CALL关键字执行过程,如下所示:
CALL add_funds(50000, 118);
结论
在本指南中,您学习了如何使用存储过程创建自定义工作流。您已经了解了存储过程如何提供大量好处,例如:
- 提高执行速度
- 通过交易安全执行
- 模块化
现在,您可以放心创建自己的存储过程,以安全快速地执行自己的工作流程。有关 PostgreSQL 存储过程的更多信息,请查看文档。
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~