请教怎样将表字段横向列出来,并找出差异?
如下面有个表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_)