zoukankan      html  css  js  c++  java
  • 利用触发器和INSERT INTO ...SELECT...解决Oracle 数据匹配问题

    情况是这样有两个表
    一个是物料表
    CREATE TABLE "MMS_MATERIAL"
       ( "MATE_ID" NVARCHAR2(50) NOT NULL ENABLE,
     "MATE_CODE" NVARCHAR2(50) NOT NULL ENABLE,
     "MATE_TYPE" NVARCHAR2(50) NOT NULL ENABLE,
     "MATE_NAME" NVARCHAR2(50) NOT NULL ENABLE,
     "MANUFACTORY" NVARCHAR2(50) NOT NULL ENABLE,
     "MATE_STYLE" NVARCHAR2(50) NOT NULL ENABLE,
     "MATE_DESC" NVARCHAR2(500) NOT NULL ENABLE,
     "MATE_UOM" NVARCHAR2(20) NOT NULL ENABLE,
     "PRICE" NUMBER(10,2) NOT NULL ENABLE,
     "MATE_CLASS" CHAR(2),
     "MATE_USE" CHAR(2),
     "BUY_STYLE" CHAR(2),
     "MATE_STATE" NUMBER(10,0),
     "EFFECT_BGN_DATE" DATE,
     "EFFECT_END_DATE" DATE,
     "MATE_USE_SUB" CHAR(2)
       )
     
     一个是库存总表
     CREATE TABLE "MMS_INVENTORY"
       ( "INVENTORY_ID" NVARCHAR2(50) NOT NULL ENABLE,
     "MATE_ID" NVARCHAR2(50) NOT NULL ENABLE,
     "QTY" NUMBER(10,0)
       )
    主键都是用GUID。

    我希望在insert一条物料时,同时insert一条QTY为0的物料记录到INVENTORY表,由于程序员一开始没有考虑到这一点,结果导致物料表的一些记录不在库存总表里。但这样,总不是办法,又不想把物料全删了重建。

    后来,想到利用子查询。但库存主键是GUID,于是想到了利用触发器,在PHPBB里看到过。

    触发器如下:
    CREATE OR REPLACE TRIGGER ai_mms_inventory
    BEFORE INSERT ON mms_inventory
    FOR EACH ROW WHEN (
     new.inventory_id IS NULL OR new.inventory_id = 0
    )
    BEGIN
     SELECT SYS_GUID()
     INTO :new.inventory_id
     FROM dual;
    END;

    SQL语句如下:

    INSERT INTO mms_inventory(mate_id, qty) 
    (
    SELECT mate_id, 0 FROM mms_material where mate_id  not in
    (select mate_id from mms_inventory))

    这样就解决于数据匹配的问题。

  • 相关阅读:
    前端如何进阶架构师
    NPOI使用记录
    ArcGis 中空间数据的插入与更新
    (转载).net 缓存处理
    ASP.NET(c#)实现重定向的三种方法的总结
    数据库关联表之间的更新语句
    C#net多线程多文件压缩下载
    关于写文件流的情况
    C# Class获取项目的绝对路径
    C# .net中DatailsView的JS简易版
  • 原文地址:https://www.cnblogs.com/huang/p/634679.html
Copyright © 2011-2022 走看看