À mon avis, un bloc PL/SQL dynamique est quelque peu obscur. Bien qu'il soit très flexible, il est également difficile à régler, difficile à déboguer et difficile à comprendre. Mon vote va à votre première option,
EXECUTE IMMEDIATE v_query_str INTO v_num_of_employees USING p_job;
Les deux utilisent des variables de liaison, mais d'abord, pour moi, c'est plus recréable et réglable que l'option @jonearles.