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>
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>
1条答案
按热度按时间bzzcjhmw1#
它是您要使用的
ALTER TABLE
。示例表:
如何修改列的大小:
将其设为 larger 没有问题,但是-如果要将其设为 * larger *,而该列中某些数据的长度比所需的目标大小长,则可能会出现问题。在此示例中,'Littlefoot'有10个字母,因此将该列设为小于该值会引发错误:
如果你想写一些代码来完成这项工作,你必须查询
user_tab_columns
并使用动态SQL(即execute immediate
)。结果如何?
列的大小匹配。
当然,这种 simple 代码可能需要额外设置(如果您希望影响其他数据类型),但这应该会给您提供一些初步的想法。