利用触发器和INSERT INTO ...SELECT...解决Oracle 数据匹配问题
2007-01-30 14:59
741 查看
情况是这样有两个表
一个是物料表
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))
这样就解决于数据匹配的问题。
一个是物料表
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))
这样就解决于数据匹配的问题。
相关文章推荐
- oracle 通过查询灵活插入数据 insert into ...select..
- MySql中利用insert into select 准备数据uuid主键冲突
- oracle 通过查询灵活插入数据 insert into ...select..
- 优化用SQL语句INSERT INTO … SELECT插入数据时锁全表的问题
- [Oracle] “表中有数据,但select count(*)的结果为0”问题的解决办法
- oracle insert中文数据,查询出现乱码问题解决
- 如何优化用SQL语句INSERT INTO … SELECT插入数据时锁全表的问题
- 基于Oracle数据如何解决数据并发select以及update问题?
- MySql中利用insert into select 准备数据uuid主键冲突
- 创建表结构相同的表,表结构相同的表之间复制数据,Oracle 中 insert into XXX select from 的用法
- 问题:oracle select into;结果:oracle SELECT INTO 和 INSERT INTO SELECT 两种表复制语句详解
- 如何优化用SQL语句INSERT INTO … SELECT插入数据时锁全表的问题
- 在MySql中建立存储过程和解决insert into select 中主键冲突的问题
- 利用oracle快照dblink解决数据库表同步问题
- insert中加入where条件判断,解决插入重复数据的问题
- 利用oracle快照dblink解决数据库表同步问题
- Oracle 通过触发器 来创建 同步临时表 及处理 通过 自治事务 来解决 查询 基表的问题
- MYSQL INSERT INTO SELECT 不插入重复数据
- oracle 11g 多次业务用户被锁定 library cache lock导致数据hang住问题解决
- 复制数据select into from 与 insert into select 区别鉴赏