insert into tbname select * from table1 where....;
能说的具体一些么?
对记录格式进行确认?字段类型相同么?

解决方案 »

  1.   

    定义一个游标
    确认
    insert
      

  2.   

    举个例子,就是在源表某条记录的某个字段里发现不符合要求的(字符位数不够),报错并显示原因之类的,然后停止继续执行下一条记录。
    是不是loop 全部记录,然后在记录里逐个进行检查?脑子里想的是一套,写不出来,咳。帮忙,谢谢!
      

  3.   

    注:我的pl/sql连最基本的语句都不明白,希望高手们耐心点教我。
    sql我懂一些。
      

  4.   

    --自己改改,昨天写的.
    create table table_added
    (tablename  varchar2(30) primary key
    );create table table_modified 
    (tablename  varchar2(30),
     sql_modified  varchar2(100)
    );CREATE OR REPLACE PROCEDURE wffz_struct
    as 
    cursor c1 is
      select TABLE_NAME,COLUMN_NAME,DATA_TYPE,DATA_LENGTH
        from user_tab_columns@wffz_new
        where substr(TABLE_NAME,1,1) <> 'V'
        order by TABLE_NAME,COLUMN_NAME;
    ps_TABLE_NAME varchar2(30);
    ps_COLUMN_NAME varchar2(30);
    ps_DATA_TYPE   varchar2(30);
    pn_DATA_LENGTH number;
    ps_rowid    VARCHAR2(30);
    ps_temp     VARCHAR2(250);
    pi_tmp      integer;
    pi_tmp0     integer;
    pi_count    integer := 0;
    begin
      open c1;
        fetch c1 into ps_TABLE_NAME,ps_COLUMN_NAME,ps_DATA_TYPE,pn_DATA_LENGTH;
        loop
        exit when c1%notfound;
        select count(*) into pi_tmp from user_tab_columns@wffz_old
          where TABLE_NAME = ps_TABLE_NAME;
        if pi_tmp = 0 then --新增表
           pi_count := pi_count + 1;
           begin
             insert into table_added values(ps_TABLE_NAME);
             commit;
           exception when others then
             null;
           end;
        else
           select count(*) into pi_tmp from user_tab_columns@wffz_old
     where TABLE_NAME = ps_TABLE_NAME and 
           COLUMN_NAME = ps_COLUMN_NAME;
           if pi_tmp = 0 then --新增字段
              pi_count := pi_count + 1;
              begin
                insert into table_modified values(ps_TABLE_NAME,
                  'alter table '||ps_TABLE_NAME||' add ('||ps_COLUMN_NAME||' '||ps_DATA_TYPE||'('||pn_DATA_LENGTH||'))');
                commit;
              exception when others then
                null;
              end;
           else
              select count(*) into pi_tmp from user_tab_columns@wffz_old
        where TABLE_NAME = ps_TABLE_NAME and 
              COLUMN_NAME = ps_COLUMN_NAME and 
              DATA_TYPE = ps_DATA_TYPE and
                  DATA_LENGTH <> pn_DATA_LENGTH;
              if pi_tmp > 0 then
                 pi_count := pi_count + 1;
                 begin
                   insert into table_modified values(ps_TABLE_NAME,
                     'alter table '||ps_TABLE_NAME||' modify ('||ps_COLUMN_NAME||' '||ps_DATA_TYPE||'('||pn_DATA_LENGTH||'))');
                   commit;
                 exception when others then
                   null;
                 end;
              end if;
           end if;
        end if;
    --dbms_output.put_line(ps_TABLE_NAME||':'||ps_COLUMN_NAME||':'||ps_DATA_TYPE||':'||pn_DATA_LENGTH);
    /*  where rowid = chartorowid(ps_rowid);
        exception when others then
        end ;
    */
        fetch c1 into ps_TABLE_NAME,ps_COLUMN_NAME,ps_DATA_TYPE,pn_DATA_LENGTH;
        end loop;
      close c1;
      dbms_output.put_line('pi_count:'||pi_count);
    end;
    /
      

  5.   

    CREATE OR REPLACE PROCEDURE Procdemo AS
    t_1 tbname%rowtype;  
    cursor c_1 is select * from tbname;
    BEGIN
    for tran_container in c_1 loop
     if length(tran_container.col1)<>8 then
    ...end if;
    if.... then
    ...
    end if; 
    end loop;
    ....
    insert into tb2 values..;
    END Procdemo;
    /