Na minha opinião, um bloco PL/SQL dinâmico é um tanto obscuro. Embora seja muito flexível, também é difícil de ajustar, difícil de depurar e difícil de descobrir o que está acontecendo. Meu voto vai para sua primeira opção,
EXECUTE IMMEDIATE v_query_str INTO v_num_of_employees USING p_job;
Ambos usam variáveis de vinculação, mas primeiro, para mim, é mais resgatável e ajustável do que a opção @jonearles.