sql - 使用单个语句更改多个表中的公共列
问题描述
因为我们可以在单个查询中更改表的多个列。
无论如何,我们可以在 Oracle 的单个语句中更改多个表的公共列吗?
解决方案
不完全是一条语句,但是 - 如果您认为一段 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>
推荐阅读
- php - 如何一一获取 ACF 转发器字段值?
- javascript - 当试图在数组中存储一个值时,它没有被正确添加
- php - 逐步获取查询结果codeigniter
- python - Python - 将不同的变量集成到来自 for 循环的每个用户输入而不使用列表
- mysql - 如何使用 mysql 在 laravel 中为多个用户创建数据库,例如在我的情况下是管理员、用户、代理、国际代理
- python-3.x - 有什么方法可以让 python os.system 模块代码普遍工作?
- prolog - 查找差异列表中的最后一项
- nginx - 配置 nginx 以将 pgadmin 映射到 URI
- python - 无法使用 python 请求登录到 Indeed.com
- parsing - Bison 减少/减少冲突警告