我想实现这样一个功能:
每从表test01 (A表)中读取一条记录时,将其复制到test02 (B表)中,其中AB表结构一致。
于是写了一个测试语句如下,假设A表有2条记录,运行完毕B应该也有2条记录,但是运行后发现,B表中有了4条记录!
再测试发现,如果A中有3条记录,则生成B表有9条记录,我对游标运用不熟悉,没想出所以然,求指点——
declare
cursor cc is select * from test01;
ccrec cc%rowtype;
rec_ind number;
begin
Execute immediate 'truncate table test02';for ccrec in cc loop
Execute immediate'
insert into test02
select
usr_nbr
,cnt
,vc_begin_cnt
,vc_begin_cnt
,vc__desc from test01
';
commit;end loop;
end;

解决方案 »

  1.   

    因为你每次运行都是全部插入的,并没有条件限制,所以假设数据为n条,则你插入B表为n*n条
      

  2.   


    感谢,呵呵,又是你哦。我现在知道是全部插入,但跟我所理解的意思并不同。
    是这样我说一下我对这语句的理解,游标变量ccrec每从cc中读取一条记录时,作一次循环,就是把它插到B表,然后再读取下一条,再做一次循环——A二条记录,全部读取完成后就退出循环。这样理解是哪里错了呢?
      

  3.   

    哦!我想我知道了,我应该再加一个条件,把里面的插入语句再取一个字段跟读取出来的CCREC中的某字段相同,这样就保证唯一了!
    是吧?我去试试
      

  4.   


    --你都取出来了,你可以这样写
    declare
    cursor cc is select * from test01;
    ccrec cc%rowtype;
    rec_ind number;
    begin
    Execute immediate 'truncate table test02';for ccrec in cc 
    loop
    Execute immediate '
            begin 
    insert into test02 
    select '''||ccrec.usr_nbr
    ||''','''||ccrec.cnt
    ||''','''||vc_begin_cnt
    ||''','''||vc_begin_cnt--此处我怎么感觉你的列有问题,重复了
    ||''','''||ccrec.vc__desc
    ||''' from dual; 
    end;';
    end loop;
    commit;
    end;
    /
      

  5.   


    --还可以这样写
    declare
    cursor cc is select * from test01;
    ccrec cc%rowtype;
    rec_ind number;
    begin
    Execute immediate 'truncate table test02';for ccrec in cc 
    loop
    Execute immediate 'insert into test02 
    select :1,:2,:3,:4,:5 from dual'
    using ccrec.usr_nbr,ccrec.cnt,ccrec.vc_begin_cnt,ccrec.vc_begin_cnt,ccrec.vc__desc;
    end loop;
    commit;
    end;
    /
      

  6.   

    这个我写错了,应ccrec.vc_begin_cnt前面少了个ccrec,自已改了试下
      

  7.   

    恩,已经解决,如果没有唯一列还有个办法,可以先生成一个ROWNUM再进行操作。至于那个重复的列,其实是没意义的,这只是个雏形,我的本意是通过二次循环实现另一个目的。
    谢谢谢谢。