日期:2014-05-17  浏览次数:20787 次

请教怎样将表字段横向列出来,并找出差异?
如下面有个表synd_stmt,表结构如下
--   Create   table
create   table   SYND_STMT
(
    TABLE_ID               NUMBER(4)   not   null,
    OPERATION_TYPE   VARCHAR2(1)   not   null,
    SEQ                         NUMBER(4)   not   null,
    STMT                       VARCHAR2(2048)   not   null,
    NAME                       VARCHAR2(50),
    SYND_DESC             VARCHAR2(100),
    OUT_ID                   NUMBER(4)
)
tablespace   idx_base
    pctfree   10
    initrans   1
    maxtrans   255
    storage
    (
        initial   64
        minextents   1
        maxextents   unlimited
    );
请问用什么办法可以将表字段横向列出来;
结果如下:
    TABLE_ID,OPERATION_TYPE,SEQ,STMT,NAME,SYND_DESC,OUT_ID

做这个的主要目的是我想比较两个系统中两个表字段的差异,因为现在环境中两个表结构不一致或者字段名称不一样;具体统计出来方便一些;大概几百个表吧!

不知大家有没有遇到过这种情况,如果有脚本的话,能不能共享一下;


------解决方案--------------------
只是想看两个表字段一样不一样吗?
select column_name from all_tab_columns where table_name= 'A1 '
minus
select column_name from all_tab_columns where table_name= 'A2 ';
比较A1和A2表,如果能选出值,A1和A2表结构就不一样.
------解决方案--------------------
--函数
create or replace function sum_string(v_sql varchar2)
return varchar2
as
type cur_alldata is ref cursor;
l_alldata cur_alldata;
v_row varchar2(99);
v_sum varchar2(3999);
begin
open l_alldata for v_sql;
loop
fetch l_alldata into v_row;
exit when l_alldata%notfound;
v_sum := v_sum|| ', '||v_row;
end loop;
v_sum := substr(v_sum,2);
close l_alldata;
return v_sum;
end;
--执行查询
select
sum_string( 'select column_name from user_tab_columns where table_name= ' 'SYND_STMT ' ' ')
from dual;

--查询结果
TABLE_ID,OPERATION_TYPE,SEQ,STMT,NAME,SYND_DESC,OUT_ID

------解决方案--------------------
比较字段差别并不需要把字段横向列出来,直接用关联或minus进行比较即可
------解决方案--------------------
只要查询一下USER_TAB_COLUMNS即可
------解决方案--------------------
楼主的意思是,都列出来的话,哪些一样哪些不一样就很清楚能看见了~
不知道理解的对不?
------解决方案--------------------
创建一个函数:
create or replace function uf_GetTabCols
(
TableName_ varchar2
)
return varchar2
is
Count_ integer;
Col_ User_Tab_Cols.Column_Name%type;
Cols_ varchar2(4000) := ' ';
begin

--校验表名是否有效,如果无效,返回空串
select count(1) into Count_ from User_All_Tables where Table_Name = upper(TableName_);

if Count_ = 0 then
return( ' ');
end if;

--返回列的组合串
declare cursor cur is
select Column_Name from User_Tab_Cols where Table_Name = upper(TableName_)