aqui esta el codigo completo, las variables priv en la aplicacion son checkbox para saber cuales hay que retirar. El nombre del usuario lo tomo de un dropdownlist que esta lleno con los usuarios que estan activos, y vuelvo a recalcar que desde la consola al realizar el for desde un bloque anonimo si funciona
CREATE OR REPLACE PROCEDURE usp_quita_priv
(nombre varchar2,
priv1 NUMBER,
priv2 NUMBER,
priv3 NUMBER,
priv4 NUMBER,
proc NUMBER,
borrar NUMBER,
sesion NUMBER
)
IS
privilegios varchar2(512);
BEGIN
IF borrar > 0 THEN
EXECUTE immediate 'Drop user '||nombre||' cascade';
elsif sesion > 0 THEN
EXECUTE immediate 'Revoke create session FROM '||nombre;
END IF;
IF priv1 > 0 THEN
privilegios:='INSERT';
END IF;
IF priv2 > 0 AND privilegios IS NOT NULL THEN
privilegios:=privilegios||','||' UPDATE';
END IF;
IF priv2 > 0 AND privilegios IS NULL THEN
privilegios:='UPDATE';
END IF;
IF priv3 > 0 AND privilegios IS NOT NULL THEN
privilegios:=privilegios||','||' DELETE';
END IF;
IF priv3 > 0 AND privilegios IS NULL THEN
privilegios:='DELETE';
END IF;
IF priv4 > 0 AND privilegios IS NOT NULL THEN
privilegios:=privilegios||','||' SELECT';
END IF;
IF priv4> 0 AND privilegios IS NULL THEN
privilegios:='SELECT';
END IF;
----------------------------------------
IF privilegios IS NOT NULL THEN
FOR x IN (SELECT TABLE_NAME nombre FROM user_tables)
LOOP
---dbms_output.put_line(x.nombre);
--EXECUTE IMMEDIATE 'GRANT SELECT ON ' || x.table_name || ' TO <<someone>>';
--execute immediate 'GRANT '||privilegios||' on '||'"'||user||'"'||'.'||'"'||x.nombre||'"'||' to '||usuario_;
EXECUTE immediate 'Revoke '||privilegios||' on '||'"'||user||'"'||'.'||'"'||x.nombre||'"'||' from '||nombre;
END LOOP;
END IF;
IF proc > 0 THEN
FOR x IN (SELECT DISTINCT name nombre, TYPE FROM USER_SOURCE WHERE TYPE IN ('PROCEDURE'))
LOOP
--execute immediate 'GRANT EXECUTE on '||'"'||user||'"'||'.'||'"'||x.nombre||'"'||' to '||usuario_;
EXECUTE immediate 'Revoke execute on '||'"'||user||'"'||'.'||'"'||x.nombre||'"'||' from '||nombre;
END LOOP;
END IF;
---borrar > 0
END;