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

Problemas con "EXECUTE IMMEDIATE"

Estas en el tema de Problemas con "EXECUTE IMMEDIATE" en el foro de Oracle en Foros del Web. Buenos dias gente forera, Bueno la verdad que estoy como loco intentando ver porque no tira lo que estoy realizando. Os comento, tengo un procedimiento ...
  #1 (permalink)  
Antiguo 08/07/2010, 02:12
 
Fecha de Ingreso: agosto-2006
Mensajes: 174
Antigüedad: 17 años, 8 meses
Puntos: 2
Problemas con "EXECUTE IMMEDIATE"

Buenos dias gente forera,

Bueno la verdad que estoy como loco intentando ver porque no tira lo que estoy realizando. Os comento, tengo un procedimiento PL/SQL en el cual construyo una sentencia de insercion sobre una tabla. Esta sentencia se construye de forma dinamica para despues lanzarla con el EXECUTE INMEDIATE. He comprobado que la construccion de la sentencia de insercion es correcta, ya que lo saco por pantalla y la ejecuto y se ejecuta correctamente. Pero a la hora de lanzar el procedimiento en cuestion, me da el siguiente error:

ORA-00942: la tabla o vista no existe
ORA-06512: en "PRUEBA.PKG_INSERTAR_MENSAJES", línea 225
ORA-06512: en línea 2

La linea 225 es donde se ejecuta la sentencia con el EXECUTE IMMEDIATE va_sql, donde le paso el string de la sentencia construida. Decir que la sentencia de insercion tiene la tabla donde se va a insertar y una secuencia autoincremental. Lo mas curioso es que lo estoy lanzando con el usuario SYSTEM, que en teoria es como Dios, y sigue saliendo ese mensaje. Y otra cosa curiosa, que en otro entorno que tengo, el mismo procedimiento con el mismo usuario que lo lanza (SYSTEM) funciona correctamente.

¿Alguna pista de por donde pueden ir los tiros?

Muchas gracias
  #2 (permalink)  
Antiguo 08/07/2010, 08:33
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Problemas con "EXECUTE IMMEDIATE"

Podrías poner el codigo que utilizas?
El error afirma la no existencia de la tabla mas no del execute immediate.

Hice una pequeña prueba sin fallo alguno.

Código SQL:
Ver original
  1. SQL> CREATE TABLE numeros(num NUMBER);
  2.  
  3. Tabla creada.
  4.  
  5. SQL> SELECT *FROM numeros;
  6.  
  7. ninguna fila seleccionada
  8.  
  9. SQL> CREATE OR REPLACE PROCEDURE prueba_dinamica(tabla IN VARCHAR2,parametro IN NUMBER) IS
  10. sentencia VARCHAR2(100);
  11. BEGIN
  12. sentencia := 'INSERT INTO ' || tabla || ' VALUES('|| parametro || ')';
  13. EXECUTE IMMEDIATE sentencia;
  14. COMMIT;
  15. END;
  16. /  2    3    4    5    6    7    8
  17.  
  18. Procedimiento creado.
  19.  
  20. SQL> EXECUTE prueba_dinamica('numeros',4);
  21.  
  22. Procedimiento PL/SQL terminado correctamente.
  23.  
  24. SQL> SELECT *FROM numeros;
  25.  
  26.        NUM
  27. ----------
  28.          4
  29.  
  30. SQL>

Nos cuentas como te va.

saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #3 (permalink)  
Antiguo 08/07/2010, 08:52
 
Fecha de Ingreso: junio-2007
Mensajes: 891
Antigüedad: 16 años, 10 meses
Puntos: 43
Respuesta: Problemas con "EXECUTE IMMEDIATE"

Debe ser porque en el entorno en que falla pasa, SYSTEM no vé esa tabla, no es que no tenga permisos, que no la ve.

Me explico, SYSTEM es " Como Dios ", pero no es adivino, si pones esto ( Desde SYSTEM ) :

SELECT * FROM TABLA;

Te salta el ORA-0942, pero si haces esto :

SELECT * FROM USUARIO.TABLA;

La va a ver.

O tienes otra opción :

CREATE ( PUBLIC ) SYNONYM ( SYSTEM.) TABLA FOR USUARIO.TABLA;

Y entonces : SELECT * FROM TABLA; te funcionará.
  #4 (permalink)  
Antiguo 09/07/2010, 02:15
 
Fecha de Ingreso: agosto-2006
Mensajes: 174
Antigüedad: 17 años, 8 meses
Puntos: 2
Respuesta: Problemas con "EXECUTE IMMEDIATE"

Si eso fue lo primero que vi. Pero el tema es que, dicho procedimiento, me construye la sentencia de insercion de forma dinamica "insert into esquema.nombre_table values (val1, val2, val3)'. Dicha sentencia la saco a atraves del dbms_output.putline, y tal cual esta, la ejecuto y se ejecuta correctamente. Si en el execute inmediate me da el error de que la tabla o vista no existe, si la lanzo a pelo, tambien me lo deberia de dar, y en este caso no da dicho error.
  #5 (permalink)  
Antiguo 09/07/2010, 02:28
 
Fecha de Ingreso: agosto-2006
Mensajes: 174
Antigüedad: 17 años, 8 meses
Puntos: 2
Respuesta: Problemas con "EXECUTE IMMEDIATE"

Aqui os dejo el codigo que utilizo:

PROCEDURE INSERTAR_MENSAJE (va_mensaje IN varchar2,
va_fecha_inicio in varchar2,
va_fecha_fin in varchar2,
va_tipo IN number)
IS

va_sql_msj varchar2(1000);

BEGIN

va_sql_msj := 'insert into CIUDADES.TABLA_MENSAJES values (CIUDADES.SEQ_TABLA_MENSAJES.nextval, '''
|| va_mensaje || ''', TO_DATE(''' || va_fecha_inicio || ''', ''DD/MM/YYYY HH24:MI:SS'')'
|| ', TO_DATE(''' || va_fecha_fin || ''', ''DD/MM/YYYY HH24:MI:SS''), ' || va_tipo || ')';

EXECUTE IMMEDIATE va_sql_msj;
COMMIT;

--dbms_output.put_line(va_sql_msj);

END INSERTAR_MENSAJE;

Casualmente dentro del mismo paquete tengo otro procedimiento que hace mas o menos lo mismo pero en otra tabla, y con ese proceduimineto si que funciona perfectamente.
  #6 (permalink)  
Antiguo 09/07/2010, 08:22
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Problemas con "EXECUTE IMMEDIATE"

Mira este post.

En especial la parte donde el experto afirma:
Cita:
Ejemplo:
El usuario A es propietario de la tabla_1 y la tabla_2
El usuario B va a crear un procedimiento que accede a dichas tablas.
Para ello el usuario A le concede permisos sobre la tabla_1 directamente asignados sobre el usuario B.
También le concede permisos al usuario B sobre la tabla_2, pero a través del role_B al que pertenece el usuario B.

Cuando el usuario B compila el procedimiento, le da un error en el acceso a la tabla_2, aunque si hace un select * from USUARIO_A.TABLA_2, le funciona.

El problema le está dando porque el permiso está concedido a través del role. El problema se soluciona concediendo los permisos directamente al usuario_B
Se parece mucho a tu problema, en el sentido que si imprimes la sentencia se ejecuta correctamente pero le es imposible ejecutarla desde el paquete. No se si utilices roles para otorgar permisos a los usuarios sobre las tablas.

saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #7 (permalink)  
Antiguo 09/07/2010, 08:54
 
Fecha de Ingreso: junio-2007
Mensajes: 891
Antigüedad: 16 años, 10 meses
Puntos: 43
Respuesta: Problemas con "EXECUTE IMMEDIATE"

Los roles sobre las tablas no deberían de dar problemas, sobre los paquetes si que los dan.

En cualquier caso, como bien apunta el compi Huesos, prueba lo que te dice y así acotamos el problema.

Ya nos contarás.

Buen finde a todo el foro "Oraclero"

Etiquetas: Ninguno
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 00:56.