Предполагая, что вам не нужна процедура B для запуска в том же сеансе, что и A, вы можете запланировать выполнение задания асинхронно, т.е.
CREATE OR REPLACE PROCEDURE a( p_cur_out OUT SYS_REFCURSOR )
AS
l_jobno pls_integer;
BEGIN
OPEN p_cur_out
FOR SELECT cast( null as varchar2(64) ) empname,
cast( null as integer ) empid
FROM dual;
dbms_job.submit( l_jobno,
'BEGIN B(); END;' );
commit;
END a;
Вы вернетесь из A, и сразу будет запланировано задание на выполнение процедуры B в отдельном сеансе (обратите внимание, что задание не запустится, пока не завершится текущий сеанс, поэтому я добавил здесь коммит - если ваш код будет фиксироваться в другом месте, вы можете устранить это). Все, что делает dbms_job.submit - это создает задание - задание не начнет выполняться до тех пор, пока процедура не вернется.
Если B принимает аргументы, вам нужно динамически построить блок PL / SQL. Так что, если B принимает два параметра NUMBER
CREATE OR REPLACE PROCEDURE a( p_cur_out OUT SYS_REFCURSOR )
AS
l_jobno pls_integer;
l_param1 pls_integer;
l_param2 pls_integer;
BEGIN
OPEN p_cur_out
FOR SELECT cast( null as varchar2(64) ) empname,
cast( null as integer ) empid
FROM dual;
dbms_job.submit( l_jobno,
'BEGIN B(' || to_char( l_param1 ) || ', ' ||
to_char( l_param2 ) || '); END;' );
commit;
END a;