oracle 如何修改目标表A中数据类型的大小,使其与源表B中相同列名的数据类型匹配

w8rqjzmb  于 2022-11-03  发布在  Oracle
关注(0)|答案(1)|浏览(188)
Table A(Target) Name Varchar2(40)  
Table B(source) Name Varchar2(60)

我需要一个脚本,其中A和B表应该进行比较,如果数据类型大小不匹配,那么A表中的数据类型大小应该更改为表B的数据类型大小。
测试结果

Table A(Target) Name Varchar2(60)                                      
Table B(source) Name Varchar2(60)
bzzcjhmw

bzzcjhmw1#

它是您要使用的ALTER TABLE
示例表:

SQL> create table table_a (name varchar2(40));

Table created.

SQL> insert into table_a values ('Littlefoot');

1 row created.

如何修改列的大小:

SQL> alter table table_a modify name varchar2(60);

Table altered.

将其设为 larger 没有问题,但是-如果要将其设为 * larger *,而该列中某些数据的长度比所需的目标大小长,则可能会出现问题。在此示例中,'Littlefoot'有10个字母,因此将该列设为小于该值会引发错误:

SQL> alter table table_a modify name varchar2(5);
alter table table_a modify name varchar2(5)
                           *
ERROR at line 1:
ORA-01441: cannot decrease column length because some value is too big

SQL>

如果你想写一些代码来完成这项工作,你必须查询user_tab_columns并使用动态SQL(即execute immediate)。

SQL> create table table_a (id number, name varchar2(40));

Table created.

SQL> create table table_b (id number, name varchar2(60));

Table created.

SQL> begin
  2    for cur_r in (select a.column_name, a.data_length a_len,
  3                                        b.data_length b_len
  4                  from user_tab_columns a join user_tab_columns b on a.column_name = b.column_name
  5                  where a.table_name = 'TABLE_A'
  6                    and b.table_name = 'TABLE_B'
  7                    and a.data_type = 'VARCHAR2'
  8                 )
  9    loop
 10      if cur_r.a_len < cur_r.b_len then
 11         execute immediate 'alter table table_a modify ' || cur_r.column_name || ' varchar2(' ||
 12                           cur_r.b_len ||')';
 13      end if;
 14    end loop;
 15  end;
 16  /

PL/SQL procedure successfully completed.

结果如何?

SQL> desc table_a;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID                                                 NUMBER
 NAME                                               VARCHAR2(60)   --> this

SQL> desc table_b;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID                                                 NUMBER
 NAME                                               VARCHAR2(60)   --> this

SQL>

列的大小匹配。
当然,这种 simple 代码可能需要额外设置(如果您希望影响其他数据类型),但这应该会给您提供一些初步的想法。

相关问题