将表的所有列的数据类型与plsql中的一个配置表进行比较

将表的所有列的数据类型与plsql中的一个配置表进行比较,sql,oracle,plsql,Sql,Oracle,Plsql,我有一个表CONFIG_PRAM,其中包含colname、datatype等列,以及更多现有表的详细信息 范例 CREATE TABLE CONFIG_PRAM ( colname varchar(40), datatype varchar(40) ); 我必须将CONFIG_PRAM表中的列和数据类型与现有表中的列进行比较 示例:我在数据库中有一个现有的表test1 create table test1 ( employee_id NUMBER(6),

我有一个表CONFIG_PRAM,其中包含colname、datatype等列,以及更多现有表的详细信息

范例

CREATE TABLE CONFIG_PRAM 
(   colname varchar(40),  
   datatype varchar(40)  
 );
我必须将CONFIG_PRAM表中的列和数据类型与现有表中的列进行比较

示例:我在数据库中有一个现有的表test1

create table test1 ( employee_id   NUMBER(6),
                     sal    NUMBER(6,8));
如果我发现任何不匹配,我需要用正确的数据类型更新CONFIG_PRAM表

对于配置表中的上述一项,我们有sal编号 但实际上它是表中的数字6,8,所以我必须用精确的数据类型更新CONFIG_PRAM表

我试过这样做:

select distinct colname , datatype 
from CONFIG_PRAM , all_tab_columns
where upper(column_name)=upper(colname )
and data_type=datatype 
and table_name in ('TEST1') 
但是假设表A有数字6,8 和CONFIG_PRAM表只包含数字 那么它就不能给出正确的结果。 问题是此查询并没有精确比较十进制值。您能在sql/PLSQL中提供解决方案吗?

包含的列比数据类型多得多。您还需要比较最短的数据长度、数据精度和数据比例


您的联接也缺少表名和所有者,最好使用ANSI联接语法。

此查询根据列名将您的表联接到所有列。这意味着它只有在CONFIG_PRAM只有一个表的条目时才能正常工作。也许它还需要一列作为表的名称

select cp.colname 
       , cp.datatype as config_datatype
       , atc.data_type as actual_datatype
       , atc.data_length as actual_length
       , atc.data_precision as actual_precision
       , atc.data_scale as actual_scale
from CONFIG_PRAM cp
     join all_tab_columns atc
     on atc.column_name = cp.colname
where atc.owner = user 
and atc.table_name in ('TEST1')
and upper(cp.datatype) != case 
       when atc.data_type = 'VARCHAR2' 
            then atc.data_type||'('||atc.data_length||')'
       when atc.data_type = 'NUMBER' 
            and instr(cp.datatype, ',') = 0
            and atc.data_scale = 0 
            then atc.data_type||'('||atc.data_precision||')'
       when atc.data_type = 'NUMBER' 
            then atc.data_type||'('||atc.data_precision||','||atc.data_scale||')'
       else atc.data_type
       end 
;
WHERE子句将数据类型列与组合的数据类型字符串进行比较。显然,潜在的数据类型比此查询处理的数据类型更多。您需要根据需要扩展它。此外,数据类型字符串格式的变化将产生误报。因此,您应该正确考虑CONFIG_PRAM表的结构:在插入或更新时应用的规则越宽松,在选择要使用的配置表时需要做的工作就越多


这是。

我已经尝试过这个方法-从配置中选择*其中cname不在从配置c中选择不同的cname,“TEST1”和nvlSubstrc.dtname中的所有列,其中uppercolumn\u name=uppercname,data\u type=dtname-和table\u name,8,1,0=NVLDATA\u PRECISION,0和nvlSubstrc.dtname,10,1,0=NVLDATA\u SCALE,0;但是我不想硬编码这个Substrc.dtname,10,1,0。有其他选择吗?请将此添加到您的问题中,因为这样的评论不可读。此外,您还需要使用表别名,如来自所有选项卡列tc。非常感谢!!我将检查更多的场景。