【问题标题】:Problem with translating mysql command to oracle command - triggers将 mysql 命令转换为 oracle 命令时出现问题 - 触发器
【发布时间】:2020-12-20 19:10:00
【问题描述】:

我在将以下命令转换为 oracle 命令时遇到了问题。 如果您能提供帮助,我会很高兴!

Create Trigger sales_stock_reduction
On SalesMovements
After insert
as
Declare @ProductId int
Declare @Piece int
Select @ProductId=ProductId, @Piece=Piece from inserted
Update Uruns set stock=stock - @Piece  where ProductId=@ProductId

在这段代码中,当进行销售时,产品表中的库存数量通过销售移动表减少。 我无法在 oracle 中编写此代码。想知道如何在Oracle中编写

【问题讨论】:

  • 请将您的代码放在问题中,而不是链接它的屏幕截图,因为这样我们更容易理解。另外,如果有任何问题,请在您的问题中添加更多详细信息。

标签: oracle plsql triggers oraclecommand


【解决方案1】:

你可以这样转换

CREATE OR REPLACE TRIGGER sales_stock_reduction
AFTER INSERT ON SalesMovements
FOR EACH ROW
DECLARE
  v_ProductId inserted.ProductId%type;
  v_Piece     inserted.Piece%type;
BEGIN
  BEGIN
    SELECT ProductId, Piece
      INTO v_ProductId, v_Piece
      FROM inserted;
   EXCEPTION WHEN NO_DATA_FOUND THEN NULL;   
  END;
  
  UPDATE Uruns
     SET stock=stock - v_Piece  
   WHERE ProductId=v_ProductId;
     
END;
/

在甲骨文中:

  • 每当需要编辑触发器时使用OR REPLACE 子句
  • 局部变量可能被定义为具有 表格内
  • 每个单独的语句都以分号结尾
  • 添加了NO_DATA_FOUND 的异常处理,因为最多假定一个 行从当前查询返回的 inserted 表没有 一个WHERE 条件来限制结果集

【讨论】:

  • 我理解你写的很好,但它说oracle插入的表不存在。我猜插入的命令对于 sql server 来说是特殊的。
  • 谢谢! @Barbaros Özhan
  • 不客气@anyone 你能跑吗?
  • 好的,我会尽力感谢您的帮助@Barbaros Özhan
  • satis_stok_azalt 和 sales_stock_reduction 是相同的触发器吗?顺便说一句,您不应该在系统或系统模式中创建对象。 inserted 表是否包含不止一行? @anyone 如果是这种情况,那么添加一个具有合适条件的 WHERE 并将 no_data_found 替换为 others。
猜你喜欢
  • 2019-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-12
  • 2021-07-25
相关资源
最近更新 更多