Skip to Main Content

Oracle Database Discussions

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

dbms_parallel_execute stuck

AntiLopaApr 5 2016 — edited Apr 10 2016

Hi,

I got a stuck process and I having trough identify why and where the process stuck.

It got stuck on procedures that takes hours (4-7h) and when I run it on procedure that runs few minutes it finish successfully.

When I say stuck I mean that by user_parallel_execute_task it finished but the call 'exec update_a;' is still running...

create or replace procedure UPDATE_A(in_proc_name in varchar2 default 'UPDATE_A_INNR', in_chunked_table_name in varchar2 default 'A') as

l_task VARCHAR2(30);

l_status NUMBER;

l_try number;

l_sql_stmt varchar2(4000);

l_chunk_size number := 5000 ;

l_parallel_level number;

l_username VARCHAR2(100);

BEGIN

select user

into l_username

from dual;

select display_value - 2

into l_parallel_level

from v$parameter where name='cpu_count';

SELECT to_char(sysdate, 'YYMMDDHHMISS') || '_PRLL_TSK'

into l_task

FROM DUAL;

DBMS_PARALLEL_EXECUTE.create_task (task_name => l_task);

DBMS_PARALLEL_EXECUTE.create_chunks_by_rowid(task_name => l_task,

           table\_owner => l\_username,

           table\_name  => in\_chunked\_table\_name,

           by\_row      => TRUE,

           chunk\_size  => l\_chunk\_size);             

l_sql_stmt := 'BEGIN '||in_proc_name||'(:start_id, :end_id , '||l_chunk_size||' ); END;';

DBMS_PARALLEL_EXECUTE.run_task(task_name => l_task,

     sql\_stmt => l\_sql\_stmt,

     language\_flag => DBMS\_SQL.NATIVE,

     parallel\_level => l\_parallel\_level);

-- If there is error, RESUME it for at most 2 times.

DBMS_OUTPUT.put_line('1 - '||l_status);

l_try := 0;

l_status := DBMS_PARALLEL_EXECUTE.task_status(l_task);

DBMS_OUTPUT.put_line('2 - '||l_status);

WHILE(l_try < 2 and l_status != DBMS_PARALLEL_EXECUTE.FINISHED)

Loop

l_try := l_try + 1;

DBMS_PARALLEL_EXECUTE.resume_task(l_task);

l_status := DBMS_PARALLEL_EXECUTE.task_status(l_task);

END LOOP;

--DBMS_PARALLEL_EXECUTE.drop_task(l_task);

EXCEPTION

when OTHERS then

dbms\_output.put\_line('The error occured in  procedure ,details : '||SQLERRM);

 rollback;

END;

/

create or replace PROCEDURE UPDATE_A_INNR (in_start_rowid rowid, in_end_rowid rowid, in_limit_bulk IN NUMBER DEFAULT 100) AS

BEGIN

DBMS_OUTPUT.ENABLE(10000000);

DBMS_OUTPUT.put_line(to_char(sysdate,'ddMMyyyy-hh24miss'));

-- here i have usually update by select

update A

set name='1'

where a.rowid between in_start_rowid AND in_end_rowid;

DBMS_OUTPUT.put_line(to_char(sysdate,'ddMMyyyy-hh24miss'));

EXCEPTION

when OTHERS then

dbms\_output.put\_line('The error occured in  procedure ,details : '||SQLERRM);

 rollback;

END;

/

Untitled.jpg

Thank you!

This post has been answered by AntiLopa on Apr 10 2016
Jump to Answer
Comments
Locked Post
New comments cannot be posted to this locked post.
Post Details
Locked on May 8 2016
Added on Apr 5 2016
5 comments
548 views