急求了,高手们。
  现有两张表,其中的一张表A的结构是固定的,另外一张表B的结构是不固定的。现在要将表B合并到表A。
  只知道两张表的表名,所以通过select COLUMN_NAME,DATA_TYPE,DATA_LENGTH from user_tab_columns where table_name='表名',就可以得到字段名称、字段类型以及类型的长度,现在要做的就是依次将字段插入到表A即可,就是插入的过程中出了问题,因为有的字段的类型没有长度(如NUMBER型),有的又有长度(如VARCHAR型),所以用什么类型的变量去取得类型不确定的长度呢?
   还是有更简单的方法,不用取得上述的信息,直接合并起来?
   

解决方案 »

  1.   

    create table c as select * from a,b
    让后drop掉a表,把c表名字给为a表
      

  2.   

    create tablec as
    select * from tablea,tableb where 条件。
    drop table tablea;
    alter table tablec rename to tablea;
      

  3.   

    比如 表A 结构如下:字段名称 字段类型 字段长度
    OID NUMBER 10
    AREA NUMBER
    ADD NUMBER 5比如 表B1 结构如下:
    字段名称 字段类型 字段长度
    FID NUMBER 10
    LENGTH  NUMBER
    CODE    NUMBER 5
    NAME NUMBER 表B2或者如下:字段名称 字段类型 字段长度
    FID NUMBER 10
    LENGTH  NUMBER
    WEI NUMBER 现在要把表B的所有记录都合并到表A中,其中,表A的OID与表B的FID的所有记录都是完全相同的,但是可能顺序不同,由于表B的结构不固定,所以不能用 select column1,column2,column3……from B,只能通过以下三步得到结果:
    1.得到表B的列名、列的类型,列的类型的长度,由select COLUMN_NAME,DATA_TYPE,DATA_LENGTH from user_tab_columns where table_name=B得到,分别用Mname,Mtype,Mlen这三个变量得到具体的值。
    2.将新的列加到表A中 alter table A add  Mname Mtype(Mlen);
    3.将表B的每一列的记录更新到表A新增的相应的字段中去
    update mf1967 set Mname=(select Mname from B where B.FID=A.OID) where exists (select 1 from B where B.FID=A.OID)现在出现的问题是,有表B1,B2可以看出Mname,Mtype是一定有值的,是VARCHAR类型,而Mlen不知道设定为什么类型,因为长度有时为空,有时又是一个int型的数字,怎么解决这个问题呢???
      

  4.   

    比如 表A 结构如下:字段名称 字段类型 字段长度
    OID NUMBER 10
    AREA NUMBER
    ADD NUMBER 5比如 表B1 结构如下:
    字段名称 字段类型 字段长度
    FID NUMBER 10
    LENGTH  NUMBER
    CODE    NUMBER 5
    NAME NUMBER 表B2或者如下:字段名称 字段类型 字段长度
    FID NUMBER 10
    LENGTH  NUMBER
    WEI NUMBER 现在要把表B的所有记录都合并到表A中,其中,表A的OID与表B的FID的所有记录都是完全相同的,但是可能顺序不同,由于表B的结构不固定,所以不能用 select column1,column2,column3……from B,只能通过以下三步得到结果:
    1.得到表B的列名、列的类型,列的类型的长度,由select COLUMN_NAME,DATA_TYPE,DATA_LENGTH from user_tab_columns where table_name=B得到,分别用Mname,Mtype,Mlen这三个变量得到具体的值。
    2.将新的列加到表A中 alter table A add  Mname Mtype(Mlen);
    3.将表B的每一列的记录更新到表A新增的相应的字段中去
    update mf1967 set Mname=(select Mname from B where B.FID=A.OID) where exists (select 1 from B where B.FID=A.OID)现在出现的问题是,有表B1,B2可以看出Mname,Mtype是一定有值的,是VARCHAR类型,而Mlen不知道设定为什么类型,因为长度有时为空,有时又是一个int型的数字,怎么解决这个问题呢???
      

  5.   

    比如 表A 结构如下:字段名称 字段类型 字段长度
    OID NUMBER 10
    AREA NUMBER
    ADD NUMBER 5比如 表B1 结构如下:
    字段名称 字段类型 字段长度
    FID NUMBER 10
    LENGTH  NUMBER
    CODE    NUMBER 5
    NAME NUMBER 表B2或者如下:字段名称 字段类型 字段长度
    FID NUMBER 10
    LENGTH  NUMBER
    WEI NUMBER 现在要把表B的所有记录都合并到表A中,其中,表A的OID与表B的FID的所有记录都是完全相同的,但是可能顺序不同,由于表B的结构不固定,所以不能用 select column1,column2,column3……from B,只能通过以下三步得到结果:
    1.得到表B的列名、列的类型,列的类型的长度,由select COLUMN_NAME,DATA_TYPE,DATA_LENGTH from user_tab_columns where table_name=B得到,分别用Mname,Mtype,Mlen这三个变量得到具体的值。
    2.将新的列加到表A中 alter table A add  Mname Mtype(Mlen);
    3.将表B的每一列的记录更新到表A新增的相应的字段中去
    update mf1967 set Mname=(select Mname from B where B.FID=A.OID) where exists (select 1 from B where B.FID=A.OID)现在出现的问题是,有表B1,B2可以看出Mname,Mtype是一定有值的,是VARCHAR类型,而Mlen不知道设定为什么类型,因为长度有时为空,有时又是一个int型的数字,怎么解决这个问题呢???
      

  6.   

    前提,你的两个表没相同名字的字段。
    SQL> select * from tb1;
     
    F1         F2      de
    ---------- ----------
    a          aaa
     
    SQL> desc t1
    Name Type       Nullable Default Comments 
    ---- ---------- -------- ------- -------- 
    OID  NUMBER(10) Y                         
    AREA NUMBER(10) Y                         
    ADD  NUMBER(5)  Y                         
     
    SQL> desc t2
    Name   Type       Nullable Default Comments 
    ------ ---------- -------- ------- -------- 
    FID    NUMBER(10) Y                         
    LENGTH NUMBER(10) Y                         
    CODE   NUMBER(5)  Y                         
    NAME   NUMBER(10) Y                         
     
    SQL> 
    SQL> create or replace procedure proc_test_combine IS
      2   v_sql VARCHAR2(1000);
      3  begin
      4    v_sql:='create table t3 as select * from t1 ,t2 where 1=0';
      5    EXECUTE IMMEDIATE v_sql;
      6    v_sql:='drop table t1 purge';
      7    EXECUTE IMMEDIATE v_sql;
      8    v_sql:='alter table t3 rename to t1';
      9    EXECUTE IMMEDIATE v_sql;
     10  end proc_test_combine;
     11  /
     
    Procedure created
     
    SQL> exec proc_test_combine;
     
    PL/SQL procedure successfully completed
     
    SQL> desc t1
    Name   Type       Nullable Default Comments 
    ------ ---------- -------- ------- -------- 
    OID    NUMBER(10) Y                         
    AREA   NUMBER(10) Y                         
    ADD    NUMBER(5)  Y                         
    FID    NUMBER(10) Y                         
    LENGTH NUMBER(10) Y                         
    CODE   NUMBER(5)  Y                         
    NAME   NUMBER(10) Y                         
     
    SQL> desc t2
    Name   Type       Nullable Default Comments 
    ------ ---------- -------- ------- -------- 
    FID    NUMBER(10) Y                         
    LENGTH NUMBER(10) Y                         
    CODE   NUMBER(5)  Y                         
    NAME   NUMBER(10) Y                         
     
    SQL> desc t3
    Object t3 does not exist.
     
    SQL> 
      

  7.   

     4    v_sql:='create table t3 as select * from t1 ,t2 where 1=0';
    在这一步的时候根据自己的业务逻辑进行处理