执行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
相关产品推荐
相关产品推荐

