Don't you have to grant execute directly on DBMS_PIPE and DBMS_LOCK in order for another procedure to use them? I remember somewhere that privs from a role do not work the same as in a procedure...