php - Oracle DB,交易中的库存库存量变化
问题描述
我正在为使用 Oracle 的项目开发一些功能。我有两个表Inventory
和Transaction
,其中Inventory
表有项目行,每个项目都有一个ID
和Count
,比如:ID = 'ProductA' Count = 12
该Transaction
表有几行事务,有一个TXID
, ItemID
, ItemQuantity
, 像 :TXID = '00012', ItemID = 'ProductA', ItemQuantity = 5
我需要能够Inventory
在进行新交易时更新项目计数。
我可以用多个语句来做到这一点,
INSERT INTO "TRANSACTION"
(TRANSACTIONID ....
VALUES('00012' .....`
UPDATE INVENTORY
SET Count = Count - ItemQuantity
WHERE ROWID='ProductA'
`
但这似乎不正确,如果出现一些错误并且并非所有语句都执行怎么办。
我应该为这种类型的功能使用什么样的格式?
解决方案
听起来很像您想使用 SQL “事务”。
例如:
-- In Oracle, this begins an implicit transaction
INSERT INTO "TRANSACTION"(TRANSACTIONID ....) VALUES('00012 .....)
UPDATE INVENTORY SET Count = Count - ItemQuantity WHERE ROWID='ProductA'
COMMIT
为此,您需要“ItemQuantity”作为某种变量。我想您正在从 PHP 中读取它:您可以从使用 PHP 变量开始。
更好的是,考虑使用Prepared Statements和/或Stored Procedures。
您还可以考虑将“TRANSACTIONID”配置为Identity Column。
附加信息:
事务是包含一个或多个 SQL 语句的逻辑原子工作单元。
事务对 SQL 语句进行分组,以便它们要么全部提交,这意味着它们被应用到数据库,要么全部回滚,这意味着它们从数据库中撤消。Oracle 数据库为每个事务分配一个唯一标识符,称为事务 ID。
所有 Oracle 事务都遵循数据库事务的基本属性,称为 ACID 属性
事务从第一个可执行的 SQL 语句开始。事务在提交或回滚时结束,可以使用 COMMIT 或 ROLLBACK 语句显式地结束,也可以在发出 DDL 语句时隐式地结束。
推荐阅读
- oracle - GRANT SELECT ON view TO user using script on SQL developer, 而不是 SELECT * FROM SQL Plus 中的那个视图
- java - Android:如何将 ImageView 保存到 SharedPreferences 以进行保存和检索?
- sql - 是否可以在 SUM 函数中使用 COALESCE 函数?
- arrays - 制作宾果游戏:如何检查数组中的元素是否重复并更改其值而不再次与其他元素重复
- excel - VBS 脚本无法将文件上传到共享点
- xamarin.forms - AndroidHUD.AndHUD+<>c__DisplayClass29_0 处的 Android.Views.WindowManagerBadTokenException。
- .htaccess - Next.js SSG 的正确 .htaccess 设置捕获所有路由
- certificate - 来自受信任机构的 EDI AS2 证书
- google-apps-script - 有限制地分享谷歌表格
- arrays - 使用数组条目写入文件(Applescript)