最近刚接触oracle数据库,想实现如图的效果。忘了补充了,表2中的SGID为外键键,是表3的外键。另外MING字段约束条件为唯一值。
通过网上查资料,自己写了一个存储过程+动态游标的方法来实现。结果发现不仅新插入的值只会重复插入表1的第一列,连以前表2存在内容也一起重复同步了。
我的代码如下,求大神指点一下如何改进,不胜感激。
CREATE OR REPLACE PROCEDURE P_TEST
IS-- 1. 游标获得 table_1 表数据 CURSOR T1_CURSOR
IS SELECT T.MEMBER,T.MING FROM table_1 T; -- 2. 游标获得 获得table_2 表数据 CURSOR T2_CURSOR
IS SELECT T.SGID,T.MING FROM table_2 T;BEGIN -- 3. 嵌套循环获得需要处理的数据FOR FOR_T2_CURSOR IN T2_CURSOR LOOP
FOR FOR_T1_CURSOR IN T1_CURSOR LOOP -- 4. 判断 IF FOR_T1_CURSOR.MING = FOR_T2_CURSOR.MING THEN -- 5. 插入数据 INSERT INTO table_3 (MEMBER,MING,SGID) VALUES(FOR_T1_CURSOR.MEMBER,,FOR_T1_CURSOR.MING,FOR_T2_CURSOR.SGID); END IF; END LOOP; END LOOP;--6. 结束
END P_TEST;
通过网上查资料,自己写了一个存储过程+动态游标的方法来实现。结果发现不仅新插入的值只会重复插入表1的第一列,连以前表2存在内容也一起重复同步了。
我的代码如下,求大神指点一下如何改进,不胜感激。
CREATE OR REPLACE PROCEDURE P_TEST
IS-- 1. 游标获得 table_1 表数据 CURSOR T1_CURSOR
IS SELECT T.MEMBER,T.MING FROM table_1 T; -- 2. 游标获得 获得table_2 表数据 CURSOR T2_CURSOR
IS SELECT T.SGID,T.MING FROM table_2 T;BEGIN -- 3. 嵌套循环获得需要处理的数据FOR FOR_T2_CURSOR IN T2_CURSOR LOOP
FOR FOR_T1_CURSOR IN T1_CURSOR LOOP -- 4. 判断 IF FOR_T1_CURSOR.MING = FOR_T2_CURSOR.MING THEN -- 5. 插入数据 INSERT INTO table_3 (MEMBER,MING,SGID) VALUES(FOR_T1_CURSOR.MEMBER,,FOR_T1_CURSOR.MING,FOR_T2_CURSOR.SGID); END IF; END LOOP; END LOOP;--6. 结束
END P_TEST;
2、删除表三的数据;
3、Insert into 表3(SGID,MING,MEMBER) select b.SGID,B.ming,B.MEMBER from 表1 a,表2 b where a.MING = b.MING;
4、把表4的数据复制到表3
insert into tab2(sgid, ming) values('ab', '1');
insert into tab3(sgid, ming, member)
select t2.sgid, t2.ming, t1.member from tab1 t1, tab2 t2
where t1.ming = t2.ming
and not exists(select*from tab3 t3 where t3.sgid = 'ab' and t3.ming = '1')
;你说的重复没看懂,举个例子吧。
这个如果表2中的字段值不是固定的怎么更改,因为SGID是主键。
这个如果表2中的字段值不是固定的怎么更改,因为SGID是主键。看不懂,给出具体的数据吧
这是我原来的存储过程执行后的结果。
表2中的SGID为该表的主键,不是固定的数值。
看了下存储过程,只能说你完全没理解sql能做什么首先,5楼的图确实是你想要的结果么?
table3的逻辑具体再描述一下
按你现在的逻辑, CURSOR T1_CURSOR
IS SELECT T.MEMBER,T.MING FROM table_1 T;这句必须要加上排序,否则即使输入一样的数据也可能得出不一样的结果。你现在的存储过程就相当于这句
insert into tab3(sgid, ming, member)
select t2.sgid, t2.ming, first_value(t1.member) over(order by t1.rowid)
from tab1 t1, tab2 t2
where t1.ming = t2.ming;
但我不觉得这是你想要的