I'm not sure if this applies to your case or not, but you can always create a procedure(s) with the necessary command(s) and then grant execute to the users that should be able to use those commands.
Example using the parameter "job_queue_processes":
Initial state:
SQL> show parameter job
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
job_queue_processes integer 1000
AND as the "target" User:
SQL> alter system set job_queue_processes=20 scope=both;
alter system set job_queue_processes=20 scope=both
*
ERROR at line 1:
ORA-01031: insufficient privileges
Create procedure as sys:
SQL> CREATE OR REPLACE PROCEDURE setT
2 IS
3 BEGIN
4 EXECUTE IMMEDIATE 'alter system set job_queue_processes=10 scope=both';
5 END;
6 /
Grant execute to user:
SQL> grant execute on setT to XXX;
Grant succeeded.
As user XXX, execute the procedure:
SQL> exec sys.setT;
PL/SQL procedure successfully completed.
Check the value;
SQL> show parameter job
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
job_queue_processes integer 10
Done:
Check direct execution as user XXX:
SQL> alter system set job_queue_processes=20 scope=both;
alter system set job_queue_processes=20 scope=both
*
ERROR at line 1:
ORA-01031: insufficient privileges