急求了,高手们。
现有两张表,其中的一张表A的结构是固定的,另外一张表B的结构是不固定的。现在要将表B合并到表A。
只知道两张表的表名,所以通过select COLUMN_NAME,DATA_TYPE,DATA_LENGTH from user_tab_columns where table_name='表名',就可以得到字段名称、字段类型以及类型的长度,现在要做的就是依次将字段插入到表A即可,就是插入的过程中出了问题,因为有的字段的类型没有长度(如NUMBER型),有的又有长度(如VARCHAR型),所以用什么类型的变量去取得类型不确定的长度呢?
还是有更简单的方法,不用取得上述的信息,直接合并起来?
现有两张表,其中的一张表A的结构是固定的,另外一张表B的结构是不固定的。现在要将表B合并到表A。
只知道两张表的表名,所以通过select COLUMN_NAME,DATA_TYPE,DATA_LENGTH from user_tab_columns where table_name='表名',就可以得到字段名称、字段类型以及类型的长度,现在要做的就是依次将字段插入到表A即可,就是插入的过程中出了问题,因为有的字段的类型没有长度(如NUMBER型),有的又有长度(如VARCHAR型),所以用什么类型的变量去取得类型不确定的长度呢?
还是有更简单的方法,不用取得上述的信息,直接合并起来?
让后drop掉a表,把c表名字给为a表
select * from tablea,tableb where 条件。
drop table tablea;
alter table tablec rename to tablea;
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型的数字,怎么解决这个问题呢???
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型的数字,怎么解决这个问题呢???
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型的数字,怎么解决这个问题呢???
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>
在这一步的时候根据自己的业务逻辑进行处理