在 Oracle 23ai 中,表的最大列数(MAX_COLUMNS)是由初始化参数 MAX_COLUMNS
控制的,默认值为 STANDARD
,即表最多只能定义 1 000 列。当业务场景中确实需要超过此限制时,我们可以通过修改 MAX_COLUMNS
参数,将其取值调整为 EXTENDED
,从而将最大列数扩展至 1500 列。
在一些极端场景下,为了满足数据模型的扩展性或兼容历史系统的需求,可能会遇到以下问题:
创建列数为 1000 的表 T1:
declare
l_col_count number := 1000;
l_str clob;
begin
execute immediate 'drop table if exists t1 purge';
l_str := 'create table t1 (';
for i in 1 .. l_col_count loop
l_str := l_str || 'col' || to_char(i) || ' number, ';
end loop;
l_str := substr(l_str, 1, length(l_str)-2);
l_str := l_str || ')';
execute immediate l_str;
end;
/
desc t1
SQL> desc t1
Name Null? Type
----------------------------------------- -------- ----------------------------
COL1 NUMBER
COL2 NUMBER
COL3 NUMBER
... 省略部分字段 ...
COL998 NUMBER
COL999 NUMBER
COL1000 NUMBER
SQL>
创建列数为 1001 的表 T2:
declare
l_col_count number := 1001;
l_str clob;
begin
execute immediate 'drop table if exists t2 purge';
l_str := 'create table t2 (';
for i in 1 .. l_col_count loop
l_str := l_str || 'col' || to_char(i) || ' number, ';
end loop;
l_str := substr(l_str, 1, length(l_str)-2);
l_str := l_str || ')';
execute immediate l_str;
end;
/
declare
*
ERROR at line 1:
ORA-01792: maximum number of columns in a table or view is 1000
ORA-06512: at line 14
SQL>
可以看到 T2 表创建失败,表或视图中的最大列数为1000。
参数名称 | 取值 | 含义 |
---|---|---|
STANDARD | 默认值 | 表最大列数:1 000 |
EXTENDED | 可选值 | 表最大列数:4 096 |
三、在 PDB 中开启 EXTENDED 模式
查看一下 MAX_COLUMNS 参数原始值:
show parameters max_columns
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
max_columns string STANDARD
SQL>
ALTER SYSTEM SET
或在 PDB 的 spfile 中修改,必须使用 SCOPE=SPFILE
。alter system set max_columns=EXTENDED scope=spfile;
shutdown immediate;
startup;
在开启 EXTENDED
模式后,便可创建多达 1500 列的表。例如,我们尝试创建一个包含 1500 列的表:
declare
l_col_count number := 1500;
l_str clob;
begin
execute immediate 'drop table if exists t2 purge';
l_str := 'create table t2 (';
for i in 1 .. l_col_count loop
l_str := l_str || 'col' || to_char(i) || ' number, ';
end loop;
l_str := substr(l_str, 1, length(l_str)-2);
l_str := l_str || ')';
execute immediate l_str;
end;
/
SQL> desc t2
Name Null? Type
----------------------------------------- -------- ----------------------------
COL1 NUMBER
COL2 NUMBER
COL3 NUMBER
... 省略部分字段 ...
COL1498 NUMBER
COL1499 NUMBER
COL1500 NUMBER
SQL>
随后可通过 USER_TAB_COLUMNS
视图验证列数:
SELECT COUNT(*) AS COL_COUNT
FROM USER_TAB_COLUMNS
WHERE TABLE_NAME = 'T2';
一旦在 PDB 中启用了 EXTENDED
模式,并且创建了列数大于 1000 的表,就 无法 将 MAX_COLUMNS
参数回退为 STANDARD
。尝试修改会报如下错误:
alter system set max_columns=STANDARD scope=spfile;
alter system set max_columns=STANDARD scope=spfile
*
ERROR at line 1:
ORA-32017: failure in updating SPFILE
ORA-60471: max_columns can not be set to STANDARD as there are one or more objects with more than
1000 columns
SQL>
drop table if exists t2 purge;
alter system set max_columns=STANDARD scope=spfile;
shutdown immediate;
startup;
MAX_COLUMNS
。USER_TAB_COLUMNS
,避免误创建过宽表。