Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 从不同的表创建触发器_Sql_Oracle_Database Trigger - Fatal编程技术网

Sql 从不同的表创建触发器

Sql 从不同的表创建触发器,sql,oracle,database-trigger,Sql,Oracle,Database Trigger,我有一个名为M\u InventoryLine M_InventoryLine M_Product_ID || QtyEntered 101 || 50 M_Replenish M_Product_ID || Level_Min 101 || 20 VW_DaftarBarang_Available M_Product_ID || Available 101 || 35 QtyEntered不能超过

我有一个名为
M\u InventoryLine

      M_InventoryLine
M_Product_ID  || QtyEntered
101           || 50

        M_Replenish
M_Product_ID  || Level_Min
101           || 20


VW_DaftarBarang_Available
M_Product_ID || Available
101          || 35
QtyEntered
不能超过
可用的
+
级别_Min
因此,我需要
在触发器中引发应用程序错误

我试过这样扣扳机:

CREATE OR REPLACE TRIGGER SAVE_ERROR
BEFORE INSERT OR UPDATE ON M_INVENTORYLINE
FOR EACH ROW
DECLARE 
    AVAILABLE_ST NUMBER;
    MIN_LEVEL NUMBER;
BEGIN

  SELECT AVAILABLE INTO AVAILABLE_ST
    FROM vw_daftarbarang_available 
   where m_product_id = :new.m_product_id;

  SELECT LEVEL_MIN INTO MIN_LEVEL
    FROM M_REPLENISH
   WHERE M_PRODUCT_ID = :NEW.M_PRODUCT_ID;

  IF :NEW.QTYENTERED > :OLD.AVAILABLE + :OLD.MIN_LEVEL THEN
    RAISE_APPLICATION_ERROR(-20000,'QUANTITY IS NOT ENOUGH');
  END IF;
END;

但它不起作用。有任何使触发器成功的建议吗?

编辑您的触发器:

  CREATE OR REPLACE TRIGGER SAVE_ERROR
  BEFORE INSERT OR UPDATE ON M_INVENTORYLINE
  FOR EACH ROW
  DECLARE 
      AVAILABLE_ST NUMBER;
      MIN_LEVEL NUMBER;
  BEGIN

  SELECT AVAILABLE INTO AVAILABLE_ST FROM vw_daftarbarang_available 
  where m_product_id = :new.m_product_id;

  SELECT LEVEL_MIN INTO MIN_LEVEL FROM M_REPLENISH
  WHERE M_PRODUCT_ID = :NEW.M_PRODUCT_ID;

  IF :NEW.QTYENTERED > AVAILABLE_ST  + MIN_LEVEL
  THEN RAISE_APPLICATION_ERROR(-20000,'QUANTITY IS NOT ENOUGH');
  END IF;
  END;

你有什么错误吗?您是否插入了调试打印以查看正在执行的语句?我已经通过SQLPlus运行了它,它显示表或视图不存在。。但是我已经制作了所有的表和视图。“插入调试打印”是什么意思?很抱歉我是新手…谢谢@Vance成功创建了触发器。但是,当我执行的时候,它表示错误如下:
ORA-01422:exact fetch返回的行数超过请求的行数。
我如何找到错误原因并解决它?这意味着从vw\u daftarbarang\u AVAILABLE/M\u Refuncy表中提取的可用或级别\u MIN不止一个,并且插入了新的M\u PRODUCT\u ID。在你们的表格中是否有一个可用的和LEVEL_MIN可以存在不止一次的情况?啊,我明白了<应根据
M\u fully
VW\u DaftarBarang\u Available
中的
M\u Warehouse\u ID
选择code>M\u Product\u ID
,以使其具有一条记录。我的触发器位于
M\u库存行
同时
M\u仓库ID
位于
M\u库存
<代码>M_Inventory
M_Inventory line
通过
M_Inventory\u ID
连接,如何修改触发器,以便可以在带有M_Warehouse\u ID的触发器中添加
位置
?您要将M_Warehouse\u ID设置在哪里?我的意思是,如果where子句中的m_product_id依赖于:NEW.m_product_id,那么m_Warehouse_id依赖于什么?