Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Oracle »

pequeño código, gran error :( ?

Estas en el tema de pequeño código, gran error :( ? en el foro de Oracle en Foros del Web. Que tal amigos?, escribo para ver si me pueden ayudar a solucionar mi código. Trato de crear un procedimiento que cada vez que se ejecute, ...
  #1 (permalink)  
Antiguo 27/01/2012, 11:56
 
Fecha de Ingreso: agosto-2011
Mensajes: 20
Antigüedad: 13 años, 3 meses
Puntos: 0
pequeño código, gran error :( ?

Que tal amigos?,
escribo para ver si me pueden ayudar a solucionar mi código.

Trato de crear un procedimiento que cada vez que se ejecute, de "de baja" a todos los usuarios que ya expiró su permiso, quitandoles el permiso al ROl. algo como "REVOKE rol FROM usuario;" pero para todos los usuarios de la tabla.


Código SQL:
Ver original
  1. CREATE OR REPLACE
  2. PROCEDURE FILTRO_PERMISOS AS
  3.  
  4. i NUMBER:= 0;
  5. fecha_actual DATE;
  6. CURSOR expiracion IS SELECT USUARIO, ROL, EXPIRA FROM SYSTEM.CONTROL_PERMISOS ;
  7. v_usuario varchar2(30);
  8. v_rol varchar2(30);
  9. v_expira varchar2(30);
  10.  
  11. BEGIN
  12.  
  13. SELECT SYSDATE INTO fecha_actual FROM DUAL;
  14.  
  15. OPEN expiracion;
  16.  
  17. FOR i IN 1.. expiracion%ROWCOUNT LOOP
  18.  
  19.   FETCH expiracion INTO v_usuario, v_rol, v_expira;
  20.  
  21.   IF v_expira > fecha_actual THEN
  22.  
  23.   --AQUI ESTA EL ERROR
  24.     REVOKE v_rol FROM SYSTEM.CONTROL_PERMISOS;
  25.  
  26.   END IF;
  27.  
  28. END LOOP;
  29.  
  30. END FILTRO_PERMISOS;

Me lanza el siguiente mensaje de error :

Error(23,5): PLS-00103: Se ha encontrado el símbolo "REVOKE" cuando se esperaba uno de los siguientes: ( begin case declare exit for goto if loop mod null pragma raise return select update while with <an identifier> <a double-quoted delimited-identifier> <a bind variable> << continue close current delete fetch lock insert open rollback savepoint set sql execute commit forall merge pipe purge El símbolo "select insertado antes de "REVOKE" para continuar.


no entiendo porque me tira ese error, alguien me puede explicar por favor?
Saludos!
  #2 (permalink)  
Antiguo 27/01/2012, 20:43
Avatar de matanga  
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 17 años
Puntos: 85
Respuesta: pequeño código, gran error :( ?

Para ejecutar sentencias DDL (create table, create user, grant, revoke, etc) dentro de un procedimiento tienes que utilizar SQL dinámico, por ejemplo:

Código:
create procedure p1 as
begin
 execute immediate 'revoke nombre_role from usuario';
end;
/
Saludos
  #3 (permalink)  
Antiguo 30/01/2012, 08:19
 
Fecha de Ingreso: agosto-2011
Mensajes: 20
Antigüedad: 13 años, 3 meses
Puntos: 0
Respuesta: pequeño código, gran error :( ?

Edito:

la sintaxys correcta es:

Código SQL:
Ver original
  1. consulta := 'revoke ' ||v_rol || ' from ' || v_usuario;
  2. EXECUTE IMMEDIATE consulta ;

Saludos!

Cita:
Iniciado por matanga Ver Mensaje
Para ejecutar sentencias DDL (create table, create user, grant, revoke, etc) dentro de un procedimiento tienes que utilizar SQL dinámico, por ejemplo:

Código:
create procedure p1 as
begin
 execute immediate 'revoke nombre_role from usuario';
end;
/
Saludos
Muchas gracias!
solo me queda una duda; como puedo hacer ese REVOKE de forma dinamica?

Código SQL:
Ver original
  1. EXECUTE immediate 'revoke VAR_1 from VAR_2';


lo que acabo de ponerno me funciona..tambien intento con
Código SQL:
Ver original
  1. EXECUTE immediate 'revoke'.VAR1 .'from'. VAR2;
y tampoco nada...


ojala me puedas ayudar, de todas maneras..
muchas gracias por tu ayuda, me fue muy util!
saludos!

Última edición por leo_star; 30/01/2012 a las 12:33

Etiquetas: insert, select, sql, tabla, usuarios
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 20:25.