You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

执行DBMS_PARALLEL_EXECUTE的CREATE_CHUNKS_BY_ROWID时遇ORA-29491错误

使用DBMS_PARALLEL_EXECUTE.create_chunks_by_rowid触发ORA-29491错误

执行步骤

CONN / AS SYSDBA
GRANT CREATE JOB TO test;  
/        
CONN test/test
/
DROP TABLE test_tab;
/
CREATE TABLE test_tab (
 id          NUMBER,
 description VARCHAR2(50),
 num_col     NUMBER,
 session_id  NUMBER,
 CONSTRAINT test_tab_pk PRIMARY KEY (id)
    );
    /
INSERT /*+ APPEND */ INTO test_tab
 SELECT level,
 'Description for ' || level,
  CASE
  WHEN MOD(level, 5) = 0 THEN 10
  WHEN MOD(level, 3) = 0 THEN 20
      ELSE 30
        END,
       NULL
  FROM   dual
  CONNECT BY level <= 500000;
  COMMIT;
    /
EXEC DBMS_STATS.gather_table_stats(USER, 'TEST_TAB', cascade => TRUE);
 /
 BEGIN
  DBMS_PARALLEL_EXECUTE.create_task (task_name => 'test_task');
 END;
/

触发错误的语句

BEGIN
DBMS_PARALLEL_EXECUTE.create_chunks_by_rowid(task_name   => 'test_task',
                                             table_owner => 'TEST',
                                             table_name  => 'TEST_TAB',
                                             by_row      => TRUE,
                                             chunk_size  => 10000);
END;
/

错误信息

ORA-29491: invalid table for chunking
ORA-06512: at "SYS.DBMS_PARALLEL_EXECUTE", line 28
ORA-01403: no data found
ORA-06512: at "SYS.DBMS_PARALLEL_EXECUTE", line 14
ORA-06512: at "SYS.DBMS_PARALLEL_EXECUTE", line 126
ORA-06512: at line 2
29491. 00000 - "invalid table for chunking"
*Cause: 尝试按ROWID对表进行分块,但该表不是物理表或是索引组织表(IOT)。
*Action: 使用具有物理ROWID的表。

解决方法

1. 确认表类型

执行SQL检查目标表是否为堆组织表(非IOT):

SELECT table_name, table_type, iot_type 
FROM user_tables 
WHERE table_name = 'TEST_TAB';
  • 若iot_type显示为IOT,说明该表是索引组织表,不符合create_chunks_by_rowid要求,需重建为普通堆组织表。
  • 若iot_type为NULL,说明是堆组织表,继续下一步排查。

2. 清理残留任务

如果任务已存在且状态异常,先删除任务再重新创建:

-- 检查任务状态
SELECT task_name, status 
FROM user_parallel_execute_tasks 
WHERE task_name = 'TEST_TASK';

-- 删除任务
BEGIN
  DBMS_PARALLEL_EXECUTE.drop_task('test_task');
END;
/

-- 重新创建任务并分块
BEGIN
  DBMS_PARALLEL_EXECUTE.create_task (task_name => 'test_task');
END;
/

BEGIN
DBMS_PARALLEL_EXECUTE.create_chunks_by_rowid(task_name   => 'test_task',
                                             table_name  => 'TEST_TAB',
                                             by_row      => TRUE,
                                             chunk_size  => 10000);
END;
/

3. 避免table_owner参数的大小写问题

当前用户为test时,可省略table_owner参数(默认使用当前用户),避免因用户名大小写不匹配导致的查询失败:

BEGIN
DBMS_PARALLEL_EXECUTE.create_chunks_by_rowid(task_name   => 'test_task',
                                             table_name  => 'TEST_TAB',
                                             by_row      => TRUE,
                                             chunk_size  => 10000);
END;
/

4. 确认权限

确保test用户拥有CREATE JOB权限(已授予),且具备EXECUTE权限访问DBMS_PARALLEL_EXECUTE(默认PUBLIC已被授予该权限)。

内容的提问来源于stack exchange,提问作者Bob

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 00:14:51