[搜集整理]关于Oracle数据库表中列数的限制

Oracle数据库表中列数的限制相关资料搜集整理。

Oracle数据库表的字段个数有限制吗?


1:http://topic.youkuaiyun.com/t/20060216/17/4560021.html

SQL>   BEGIN  
      2           FOR   I   IN   1..999   LOOP  
      3               EXECUTE   IMMEDIATE   'ALTER   TABLE   TEST.TT   ADD   A'   ||   I   ||   '   NUMBER(1)';  
      4           END   LOOP;  
      5     END;  
      6     /  
   
  PL/SQL   过程已成功完成。  
   
  SQL>   SELECT   COUNT(*)   FROM   USER_TAB_COLUMNS   WHERE   TABLE_NAME='TT';  
   
      COUNT(*)  
  ----------  
              1000  
   
  SQL>   ALTER   TABLE   TEST.TT   ADD   C   NUMBER(1);  
  ALTER   TABLE   TEST.TT   ADD   C   NUMBER(1)  
                                                  *  
  ERROR   位于第   1   行:  
  ORA-01792:   表或视图中的最大列数为   1000  
   
   
  ORA-01795   maximum   number   of   expressions   in   a   list   is   1000  
   
  Cause:   More   than   254   columns   or   expressions   were   specified   in   a   list.  
   
  Action:   Remove   some   of   the   expressions   from   the   list.  
   
  Limit   and   conversion   very   long   IN   list   :   WHERE   x   IN   (   ,,,   ...)    


2:http://www.itpub.net/474454.html
oracle 对于超过255个字段的表,将把 一行放到多个block上。 一个block最多只存放255个字段。

至于表能有多少字段,你写个程序测试下就知道了
非常简单

 

create table t (a number);


set  serverout on

begin
for i in 1..1000000 loop
execute  immediate  'alter table t add( col'||  i || ' number' ;


end loop;

exception when  others then

dbms_output.put_line(to_char(sqlcode)||sqlerrm);

end;

3:http://oratip.com/ORA-01792.html
ORA-01792 maximum number of columns in a table or view is 1000
Cause
An attempt was made to create a table or view with more than 1000 columns, or to add more columns to a table or view which pushes it over the maximum allowable limit of 1000. Note that unused columns in the table are counted toward the 1000 column limit.

Action
If the error is a result of a CREATE command, then reduce the number of columns in the command and resubmit. If the error is a result of an ALTER TABLE command, then there are two options:
- If the table contained unused columns, remove them by executing ALTER TABLE DROP UNUSED COLUMNS before adding new columns.
- Reduce the number of columns in the command and resubmit.


---
Related Error Messages to ORA-01792 maximum number of columns in a table or view is 1000
ORA-01787 only one clause allowed per query block


ORA-01788 CONNECT BY clause required in this query block


ORA-01789 query block has incorrect number of result columns.


ORA-01790 expression must have same datatype as corresponding expression


ORA-01791 not a SELECTed expression


ORA-01793 maximum number of index columns is 32


ORA-01794 maximum number of cluster columns is 32.


ORA-01795 maximum number of expressions in a list is 1000


ORA-01796 this operator cannot be used with lists


ORA-01797 this operator must be followed by ANY or ALL


4:http://ningoo.itpub.net/post/2149/265635
Oracle中的table最多支持多少个列?
Oracle中的table的列数有没有限制?如果有,这个限制是多少?

 


版本信息:

NING@ning>select * from v$version;

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Prod
PL/SQL Release 10.2.0.3.0 - Production
CORE 10.2.0.3.0 Production
TNS for 32-bit Windows: Version 10.2.0.3.0 - Production
NLSRTL Version 10.2.0.3.0 - Production

创建以下过程用于测试:

create or replace procedure test_cols(cols number)
as
l_sql dbms_sql.varchar2s;
l_cursor number;
l_rows number;

begin
l_cursor := dbms_sql.open_cursor;

l_sql(1) :='create table cols'||cols||'(';

for i in 2..cols+1 loop
l_sql(i) := 'a' || to_char(i-1) || ' int,';
end loop;

l_sql(cols+1) := 'a' || to_char(cols) || ' int)';

dbms_sql.parse(c=>l_cursor,
statement=>l_sql,
lb=>l_sql.first,
ub=>l_sql.last,
lfflg=>TRUE,
language_flag=>dbms_sql.native);

dbms_sql.close_cursor(l_cursor);
end;
/

过程的参数为欲创建的table的列数,创建的table名则为cols+列数,例如cols10,cols100等。

NING@ning>exec test_cols(10);

PL/SQL procedure successfully completed.

font size="2">NING@ning>exec test_cols(100);

PL/SQL procedure successfully completed.

NING@ning>exec test_cols(1000);

PL/SQL procedure successfully completed.

NING@ning>exec test_cols(1001);
BEGIN test_cols(1001); END;

*
ERROR at line 1:
ORA-01792: maximum number of columns in a table or view is 1000
ORA-06512: at "SYS.DBMS_SYS_SQL", line 1608
ORA-06512: at "SYS.DBMS_SQL", line 33
ORA-06512: at "NING.TEST_COLS", line 18
ORA-06512: at line 1

NING@ning>select count(*) from all_tab_columns where owner=user and table_name='COLS10';

COUNT(*)
----------
10

NING@ning>select count(*) from all_tab_columns where owner=user and table_name='COLS100';

COUNT(*)
----------
100

NING@ning>select count(*) from all_tab_columns where owner=user and table_name='COLS1000';

COUNT(*)
----------
1000

根据测试结果可知,oracle中table的列数最多只能为1000。

5:http://www.oracle.com.cn/viewthread.php?tid=51100&extra=page%3D28
请问各位大侠,在oracle 的表中最多可以有多少字段?
请问各位大侠,在oracle 的表中最多可以有多少字段?
我需要创建一个有1350个字段的表。

你的设计不合理, Oracle最多支持1000个字段^_^.
引用:
SQL> declare
  2    query varchar2(20000) := 'create table t01(';
  3  begin
  4    for i in 1..1001 loop
  5      query := query||'col'||i||' int,';
  6    end loop;
  7    query := query||'colx int)';
  8    execute immediate query;
  9  end;
10  /
declare
*
ERROR at line 1:
ORA-01792: maximum number of columns in a table or view is 1000
ORA-06512: at line 8


SQL>

6:http://bbs.51cto.com/thread-421919-1-1.html
Oracle的最大列数是1000,能不能无限制?

因为我们的数据比较特殊,表需要设置很多字段,但是oracle提示字段数不能超过1000。
不知有没有方法能让字段数量无限制?
谢谢!

mingjie1116x  2007-9-4 08:55
 
有没有具体报错信息提示?

mingjie1116x  2007-9-4 09:25
 
刚才查实,ORACLE字段不能超过1000,是不能改的!
Columns Per table 1000 columns maximum

liuyycici  2007-9-5 05:00
 
建表的时候,错误提示是“ORA-01792: 表或视图中的最大列数为 1000”

真遗憾,能没有限制就好了
? 

7:http://blog.chinaunix.net/u1/57759/showart_548414.html

Oracle10.2限制(取自官方文档)

8:http://technet.microsoft.com/zh-cn/library/ms143432.aspx
SQL Server 2005 最大容量规范

<think>首先,用户的问题是基于之前的引用内容:用户想统计Oracle数据库中各的记录数,并获取前20个。引用内容提供了几种方法来实现这个目标,包括使用PL/SQL脚本、存储过程等。 关键点: - 用户需要统计当前用户下所有的记录数。 - 然后,从这些中取记录数最多的前20个。 - 引用中提到了几种方法,如使用游标遍历、执行动态SQL、使用user_tables视图等。 从引用中: - 引用[1]:使用PL/SQL块遍历user_tables,执行SELECT COUNT(*)来获取记录数,并汇总。 - 引用[2]:类似,使用存储过程输出每个的记录数。 - 引用[3]:生成一个SQL脚本,使用UNION ALL来查询所有的记录数。 - 引用[4]:提到使用user_tables视图,但num_rows可能不准,需要先收集统计信息。 - 引用[5]:存储过程遍历dba_tables,但需要DBA权限;用户可能没有,所以应该用user_tables。 用户是当前用户,所以应该使用user_tables或类似视图。user_tables中的num_rows列可以提供记录数,但如果不准确,需要先分析。 步骤: 1. **确保统计信息准确**:如果使用num_rows,先执行分析命令来更新统计信息。 2. **查询记录数**:然后,可以直接查询user_tables获取num_rows,并排序取前20。 3. **或者使用动态SQL**:如果用户不信任num_rows,可以用PL/SQL动态查询每个的count(*),然后排序。 更高效的方式是使用num_rows,因为它避免了对每个执行count(*),但前提是统计信息是最新的。 用户说“统计各记录数并取前20”,所以输出应该是一个列,显示名和记录数,按记录数降序排序,取前20。 基于引用,建议的方法: - 方法1:使用user_tables视图,先收集统计信息,然后查询。 - 方法2:使用PL/SQL动态查询每个,存储结果,然后排序输出。 方法1更简单,但num_rows可能不是实时的;方法2更准确但更慢。 在回答中,我应该提供清晰的步骤。 回答结构: 1. **介绍**:简要解释如何统计记录数并取前20。 2. **方法选择**:推荐使用num_rows,因为它更快,但提醒需要更新统计信息。 3. **步骤**: a. 更新统计信息(可选,但推荐)。 b. 查询user_tables,按num_rows降序排序,取前20。 4. **代码示例**:提供SQL或PL/SQL代码。 5. **注意事项**:如果很多或很大,动态查询可能更好,但更慢。 6. **相关问题**:根据系统指令,生成相关问题。 系统指令: - 使用$...$ for inline math, $$...$$ for block math。但在这个上下文中,可能没有数学,所以可能不需要。 - 使用中文回答。 - 生成相关问题。 - 引用的末尾添加引用标识,如[^1]。 在回答中,引用来自提供的文本,所以我应该引用[^1], [^2], 等等。 用户的问题是基于引用,所以我需要参考它们。 最终输出: - 回答用户的问题。 - 生成相关问题。 相关问题想法: 1. 如何更新Oracle的统计信息? 2. 除了记录数,如何获取其他统计信息? 3. 如何优化大的记录数统计? 4. 什么是Oracle的user_tables视图? 5. 如何在没有DBA权限的情况下统计所有? 现在,构建回答。</think>### Oracle数据库统计各记录数并取前20个的方法 在Oracle数据库中,统计当前用户下所有的记录数并获取前20个记录数最多的,可以通过以下步骤实现。Oracle提供了系统视图(如`user_tables`)来存储的元数据,其中`num_rows`列记录了的行数。但`num_rows`可能不准确,如果未及时更新统计信息(例如,数据频繁变更)。因此,推荐先更新统计信息,再查询视图,以确保结果可靠。以下是两种常用方法,基于您提供的引用内容[^1][^2][^4]。 #### 方法1: 使用`user_tables`视图(推荐,高效) 这种方法直接查询系统视图`user_tables`,速度快,但需要先更新统计信息以确保`num_rows`准确。适用于数量多或数据量大的场景。 1. **更新统计信息**:运行PL/SQL块分析所有,刷新`num_rows`值。 ```sql BEGIN FOR idx IN (SELECT table_name FROM user_tables) LOOP EXECUTE IMMEDIATE 'ANALYZE TABLE ' || idx.table_name || ' COMPUTE STATISTICS'; END LOOP; END; / ``` - 执行后,Oracle会重新计算每个的行数并更新`user_tables`[^1][^4]。 2. **查询记录数并取前20个**:直接查询`user_tables`,按`num_rows`降序排序,取前20行。 ```sql SELECT table_name, num_rows FROM user_tables ORDER BY num_rows DESC NULLS LAST FETCH FIRST 20 ROWS ONLY; ``` - `FETCH FIRST 20 ROWS ONLY` 是Oracle 12c及以上版本的语法,用于限制结果集。如果使用旧版本,可用`ROWNUM`替代: ```sql SELECT * FROM ( SELECT table_name, num_rows FROM user_tables ORDER BY num_rows DESC NULLS LAST ) WHERE ROWNUM <= 20; ``` - 输出示例:名和记录数列,如`EMPLOYEES: 10000`。 **优点**:速度快,只需执行一个查询。 **缺点**:如果未更新统计信息,`num_rows`可能不实时[^1][^4]。 #### 方法2: 使用PL/SQL动态查询(准确但较慢) 如果无法更新统计信息或需要实时计数(例如,数据频繁变化),可以使用PL/SQL存储过程动态执行`SELECT COUNT(*)`。这种方法更准确,但遍历所有可能较慢,尤其对大。 1. **创建存储过程统计记录数并输出前20个**: ```sql CREATE OR REPLACE PROCEDURE get_top20_tables AS v_table_name VARCHAR2(100); v_count INTEGER; TYPE result_type IS RECORD (table_name VARCHAR2(100), row_count INTEGER); TYPE result_table IS TABLE OF result_type; v_results result_table := result_type(); BEGIN -- 遍历所有,动态查询记录数 FOR idx IN (SELECT table_name FROM user_tables) LOOP v_table_name := idx.table_name; EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM ' || v_table_name INTO v_count; v_results.EXTEND; v_results(v_results.LAST) := result_type(v_table_name, v_count); END LOOP; -- 按记录数降序排序,取前20个 SELECT * BULK COLLECT INTO v_results FROM TABLE(v_results) ORDER BY row_count DESC FETCH FIRST 20 ROWS ONLY; -- 输出结果 FOR i IN 1..v_results.COUNT LOOP DBMS_OUTPUT.PUT_LINE(v_results(i).table_name || ': ' || v_results(i).row_count); END LOOP; END; / ``` 2. **执行存储过程**: ```sql SET SERVEROUTPUT ON; -- 启用输出 EXEC get_top20_tables; ``` - 在SQL*Plus或PL/SQL Developer中运行,`DBMS_OUTPUT`窗口会显示结果,如`ORDERS: 5000`[^2]。 **优点**:结果实时准确。 **缺点**:性能较低,每个都需执行全扫描;多时可能超时,建议分批处理[^2][^5]。 #### 注意事项 - **权限问题**:确保当前用户有`SELECT`权限和`ANALYZE ANY TABLE`权限(用于更新统计信息)。如果无权限,方法2更安全[^5]。 - **性能优化**:对于大数据库,优先使用方法1。如果数据变化少,可跳过更新统计信息步骤。 - **结果差异**:方法1的`num_rows`是近似值,方法2的`COUNT(*)`是精确值。测试中,两者在更新后应一致[^1]。 - **错误处理**:添加异常处理(如`EXCEPTION WHEN OTHERS THEN ...`)来跳过无效。 #### 示例输出 无论使用哪种方法,输出格式类似: ``` ORDERS: 15000 EMPLOYEES: 10000 PRODUCTS: 8000 ... (共20行) ``` ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值