使用单个语句更改多个表中的公共列
alter a common column in multiple tables using a single statement
因为我们可以在单个查询中更改 table 的多个列。
我们是否可以在 Oracle 中的单个语句中更改多个 table 的公共列?
不,你不能那样做。
ALTER TABLE
一次只能改变一个table。
您会看到 "schema.table" 部分不能重复,如果您想要更改多个 table,那将是必要的。
不完全是 单个语句 ,但是 - 如果您认为一段 PL/SQL 代码可能有帮助,下面是一个示例:有些表包含列具有不同 VARCHAR2
数据类型长度的名称 NAME
。我要统一他们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
个,copy/paste & 运行 它们:
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>
因为我们可以在单个查询中更改 table 的多个列。
我们是否可以在 Oracle 中的单个语句中更改多个 table 的公共列?
不,你不能那样做。
ALTER TABLE
一次只能改变一个table。
您会看到 "schema.table" 部分不能重复,如果您想要更改多个 table,那将是必要的。
不完全是 单个语句 ,但是 - 如果您认为一段 PL/SQL 代码可能有帮助,下面是一个示例:有些表包含列具有不同 VARCHAR2
数据类型长度的名称 NAME
。我要统一他们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
个,copy/paste & 运行 它们:
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>