我现在有一个需求:在数据库端对两个表进行操作,从第一张表中取数据插入第二场表,第二张表有主键,主键冲突不能成功插入,要求返回插入成功的结果集给C程序。存储过程如何写? 用OCI如何调用这个存储过程接受到返回的结果集?

解决方案 »

  1.   

    id为关键字
    结果集
    select id,...... from table1 where id in (select id from table1 minus select id from table2)
    插入语句
    insert into table2(id,......)
    select id,...... from table1 where id in (select id from table1 minus select id from table2)
      

  2.   

    用select * from a where id not in(select id from b)
      

  3.   

    我详细描述一下问题吧。表一和表二只有ID一列。两个表的数据量都很大。我现在从表一种取出id向表二中插入,如果重复的话就不能成功插入。另外删除从表一中取出的数据(不管能否成功插入表二)。用一个存储过程实现,并能够把插入成功的结果集返回给OCI调用。因为数据量很大,所以删除表一中的数据时希望用游标删除,避免用delete语句的where查询。关键在于如何将结果集返回给c程序。
      

  4.   

    MERGE语句用来合并UPDATE和INSERT语句。通过MERGE语句,根据一张表或子查询的连接条件对另外一张表进行查询,连接条件匹配上的进行UPDATE,无法匹配的执行INSERT。这个语法仅需要一次全表扫描就完成了全部工作,执行效率要高于INSERT+UPDATE。 
    MERGE [hint] INTO [schema .] table [t_alias] USING [schema .] 
    { table | view | subquery } [t_alias] ON ( condition ) 
    WHEN MATCHED THEN merge_update_clause 
    WHEN NOT MATCHED THEN merge_insert_clause;
    这样就可以查如表二了;
    至于删除表一中 已经取出的纪录,可以换一个思路,将表一和表二 minus 然后将结果 插入另外一个表中,然后将表一drop,将minus后的表rename为表一,孩子也也可以达到你的目的;
    不知道是否解决了你的问题
      

  5.   


    --大概可以这样写,i就是insert到tabB表的记录数
    create or replace procedure insertToB is
      i integer := 0;
      cursor cur_id is
        select a.id
          from tabA a
         where not exists (select 1 from tabB b where a.id = b.id)
         order by a.id;
    begin
      for line in cur_id loop
        insert into tabB values (line.id);
        delete tabA where id = line.id;
        i := i + 1;
      end loop;
    end insertToB;
      

  6.   

    上面代码中 i := i + 1;后面加个commit;