使用单个语句更改多个表中的公共列

时间:2018-08-24 05:36:33

标签: sql oracle alter

因为我们可以在单个查询中更改表的多个列。

反正我们可以在Oracle的单个语句中更改多个表的公共列吗?

2 个答案:

答案 0 :(得分:2)

不完全是单条语句,但是-如果您认为一段PL / SQL代码可能会有所帮助,请举一个例子:有些表包含列名NAME不同的VARCHAR2数据类型长度。我要统一它们到VARCHAR2(10)

SQL> create table t1 (id number(4), name varchar2(5));

Table created.

SQL> create table t2 (id number(4), name varchar2(3));

Table created.

SQL> create table t3 (id number(4), name varchar2(8));

Table created.

SQL> begin
  2    for cur_r in (select table_name from user_tab_columns where column_name = 'NAME') loop
  3      execute immediate 'alter table ' || cur_r.table_name || ' modify name varchar2(10)';
  4    end loop;
  5  end;
  6  /

PL/SQL procedure successfully completed.

SQL> desc t1
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID                                                 NUMBER(4)
 NAME                                               VARCHAR2(10)

SQL> desc t2
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID                                                 NUMBER(4)
 NAME                                               VARCHAR2(10)

SQL> desc t3
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID                                                 NUMBER(4)
 NAME                                               VARCHAR2(10)

SQL>

或者,运行由SELECT组成的ALTER TABLE语句,复制/粘贴并运行它们:

SQL> select 'alter table ' || table_name ||' modify name varchar2(20);' str
  2  from user_tab_columns
  3  where column_name = 'NAME';

STR
--------------------------------------------------------------------
alter table T1 modify name varchar2(20);    --> these 3 lines should be
alter table T2 modify name varchar2(20);    --  copy/pasted (as I did it below)
alter table T3 modify name varchar2(20);    --  and executed

SQL> alter table T1 modify name varchar2(20);

Table altered.

SQL> alter table T2 modify name varchar2(20);

Table altered.

SQL> alter table T3 modify name varchar2(20);

Table altered.

SQL> desc t1
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID                                                 NUMBER(4)
 NAME                                               VARCHAR2(20)

SQL> desc t2
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID                                                 NUMBER(4)
 NAME                                               VARCHAR2(20)

SQL> desc t3
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID                                                 NUMBER(4)
 NAME                                               VARCHAR2(20)

SQL>

答案 1 :(得分:1)

不,您不能这样做。

ALTER TABLE一次只能更改一个表。

如果您看着at the syntax diagram

enter image description here

您将看到无法重复“ schema.table”部分,如果要更改多个表,则必须这样做。