sql - 关于如何在 Oracle Express - SQL 中创建。更新列的触发器
问题描述
我有一张product
桌子和一张sales
桌子。在product
我拥有(product_id, p_desc, qty_stock)
的sales
表格中,我有(sale_id, producto_id, sale_p_qty)
客户sale_p_qty
从某种产品购买的数量。
问题是如何触发更新表qty_stock
中的列值product
(该值将是股票)?我做不到。我可以做一个递减的触发器,但一次只能减少一个值。正确的方法是获取sale_p_qty
表sales
和减量,qty_stock
但我不能这样做。你能帮我一把吗?
我的尝试就此停止(我没有做任何程序,我不知道您是否需要在这种情况下):
CREATE OR REPLACE TRIGGER trg_stock_ai AFTER INSERT OR UPDATE ON sale
FOR EACH ROW
declare
new_stock NUMBER (4);
--SELECT sale_p_qty INTO new_stock FROM sale
--SET new_stock = (SELECT sale_p_qty FROM sale);
BEGIN
SELECT sale_p_qty INTO new_stock FROM sale;
UPDATE product
SET qty_stock = qty_stock - new_stock
WHERE product.product_id =: NEW.product_id;
END;
解决方案
您可以分两步执行此操作:
CREATE OR REPLACE TRIGGER trg_stock_ai AFTER INSERT OR UPDATE ON sale
FOR EACH ROW
BEGIN
UPDATE product
SET qty_stock = (qty_stock - :NEW.sale_p_qty)
WHERE p.product_id = :NEW.product_id;
UPDATE product
SET qty_stock = (qty_stock + :OLD.sale_p_qty)
WHERE p.product_id = :OLD.product_id;
END;
This should work for both inserts and updates, even when product_id
changes.
推荐阅读
- c++ - 模板参数列表中参数 3 的类型/值不匹配
- asciidoc - 为 ASCII 文档创建索引页面
- ubuntu - 安装 Odoo 的最佳服务器
- search - Autosuggest Solr 的改进
- markdown - Docsify / Collapse (sub) - 侧边栏中的文件
- android - 班次更改期间 Android SQLite 条件失败
- android - 当我们有一个活动的(HFP)蓝牙 SCO 连接时,强制 Android A2DP 配置文件工作
- vuejs2 - 无法访问过滤器中的方法 - Vue.js 2.0
- android - Android RecyclerView 避免滚动
- spring-boot - 如何在 Spring Boot 应用程序中添加迎风报告 Java 引擎?