最近刚接触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.   

    1、创建一个与表3结构相同的表表4,把表3的旧数据复制到表4;
    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
      

  2.   

    存储过程不是干这种小事的把下面两个语句扔一个事务里执行
    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')
    ;你说的重复没看懂,举个例子吧。
      

  3.   

    比如说表一中MING值为1的有A、B、C、D四个,执行之后,表三中MING值为1的列均为A。
    这个如果表2中的字段值不是固定的怎么更改,因为SGID是主键。
      

  4.   

    比如说表一中MING值为1的有A、B、C、D四个,执行之后,表三中MING值为1的列均为A。
    这个如果表2中的字段值不是固定的怎么更改,因为SGID是主键。看不懂,给出具体的数据吧
      

  5.   


    这是我原来的存储过程执行后的结果。
    表2中的SGID为该表的主键,不是固定的数值。
      

  6.   

    刚刚才发现一楼弄错了,不过现在没法更改了,您看看楼上。其实我想实现的是依据表1和表2MING字段的关联关系,将表1和表2的多对一关系变成一对一,然后再将结果插入到表3里面。
      

  7.   

    刚刚才发现一楼弄错了,不过现在没法更改了,您看看楼上。其实我想实现的是依据表1和表2MING字段的关联关系,将表1和表2的多对一关系变成一对一,然后再将结果插入到表3里面。
    看了下存储过程,只能说你完全没理解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;
    但我不觉得这是你想要的