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

[SOLUCIONADO] Procedure y Tablas Temporales

Estas en el tema de Procedure y Tablas Temporales en el foro de Mysql en Foros del Web. Buenas Tardes! Tengo una duda sobre un procedure y una tabla temporal. Intente hacerlo y por algún motivo la base de datos me dice que ...
  #1 (permalink)  
Antiguo 07/12/2014, 17:09
Abigail913
Invitado
 
Mensajes: n/a
Puntos:
Pregunta Procedure y Tablas Temporales

Buenas Tardes!

Tengo una duda sobre un procedure y una tabla temporal. Intente hacerlo y por algún motivo la base de datos me dice que bloquea estas tablas temporales creadas, y por ende no hace la consulta como se espera.

Les dejo un bosquejo de lo que hice, y agradecida de antemano las pistas que me puedan dar.

Saludos

Código SQL:
Ver original
  1. CREATE PROCEDURE xxx
  2.  
  3. SELECT * FROM tablax WHERE condicion1
  4. INTO temp tablax0
  5.  
  6. SELECT * FROM tablax1 WHERE condicion2 IN (SELECT * FROM  tablax0 WHERE condiocion3)
  7. INTO temp tablaz0
  8.  
  9. IF (valor >5);
  10.   condiocnes
  11. END IF
  12.  
  13. DROP TABLE tablax0;
  14. DROP TABLE tablaz0;
  15.  
  16. END PROCEDURE;

Última edición por gnzsoloyo; 07/12/2014 a las 17:36
  #2 (permalink)  
Antiguo 07/12/2014, 17:46
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Procedure y Tablas Temporales

Bueno, por lo pronto, toda esa sintaxis está mal para ser MySQL. Te debería disparar errores de sintaxis o ejecución.
Vamos a ver:
- Los Sp de más de una linea o sentencia deben forzosamente poner su código dentro de un bloque BEGIN/END, cosa que no se cumple en tu ejemplo.
- No terminan en END PROCEDURE, eso es sintaxis de Oracle.
- Toda sentencia debe si o si terminar en un punto y coma (;). de lo contrario generarán errores.
- El controlador de flujo IF requiere THEN. Lo pusiste mal escrito.
- El DROP TABLE sólo funciona si la tabla se crea, y no se vé donde está.
- Las tablas TEMPORARY, si son creadas dentro de un SP no tienen persistencia fuera de él. Es decir, desaparecen en forma automática. Físicamente.
- Si una tabla TEMPORARY se crea fuera del SP, es invisible dentro de él, a menos que la instancia de conexión sea la misma.
- Las tablas MEMORY permanecen fuera de la ejecución, pero los datos que contienen se borran al terminar el SP.

En definitiva, para cumplir aproximadamente con lo que quieres, la sintaxis más cercana podría ser:
Código MySQL:
Ver original
  1.  
  2.  
  3.   CREATE TEMPORARY TABLE tablax0
  4.   AS
  5.   SELECT * FROM tablax WHERE condicion1;
  6.  
  7.   CREATE TEMPORARY TABLE tablaz0
  8.   AS
  9.   SELECT *
  10.   FROM tablax1
  11.   WHERE condicion2 IN (SELECT * FROM  tablax0 WHERE condiocion3);
  12.  
  13.   # Esto no tiene sentido. No se ve de donde se obtiene "valor"
  14.  
  15.   IF (valor >5) THEN
  16.          ...
  17.   END IF;
  18.  
  19. END ;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 08/12/2014, 07:14
Abigail913
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Procedure y Tablas Temporales

Gracias por responder gnzsoloyo;

Si bien no es sql, necesito investigar y crear una idea para este caso,

este si es el codigo original;


CREATE PROCEDURE "informix".c_actv_dias18034(i_id_grupo INTEGER,i_t_actv INTEGER, i_dia INTEGER) RETURNING INTEGER;
DEFINE i_cant INTEGER;
DEFINE i_dur INTERVAL DAY TO DAY;
DEFINE i_t_actv2 INTEGER;

SELECT * FROM ACTIVIDAD WHERE fe_fin IS NULL
INTO TEMP ACT0;

SELECT * FROM TIPO_ACTIVIDAD WHERE t_actv IN (SELECT t_actv FROM ACT0)
INTO TEMP TIPO_ACT0;

SELECT * FROM HIST_ASIGNACION WHERE id_actv IN (SELECT id_actv FROM ACT0)
INTO TEMP HIST_ASIGN0;

IF (i_dia < 5) THEN
SELECT COUNT(*),a.t_actv,(EXTEND(CURRENT,YEAR TO DAY) - EXTEND(a.fe_ini,YEAR TO DAY))
INTO i_cant,i_t_actv2,i_dur
FROM ACT0 a, TIPO_ACT0 ta, HIST_ASIGN0 h, usuario u, personal p
WHERE a.fe_fin IS NULL
AND ta.t_Actv=a.t_Actv
AND ta.t_actv=i_t_actv
AND h.id_actv=a.id_actv
AND u.nu_carn=p.nu_carn
AND h.id_usr=u.id_usr
AND p.id_grupo_asg=i_id_grupo
AND (EXTEND(CURRENT,YEAR TO DAY) - EXTEND(a.fe_ini,YEAR TO DAY)) >= i_dia UNITS DAY
AND (EXTEND(CURRENT,YEAR TO DAY) - EXTEND(a.fe_ini,YEAR TO DAY)) < (i_dia+1) UNITS DAY
GROUP BY 2,3;
ELSE
SELECT COUNT(*),a.t_actv
INTO i_cant,i_t_actv2
FROM ACT0 a, TIPO_ACT0 ta, HIST_ASIGN0 h, usuario u, personal p
WHERE a.fe_fin IS NULL
AND ta.t_Actv=a.t_Actv
AND ta.t_actv=i_t_actv
AND h.id_actv=a.id_actv
AND u.nu_carn=p.nu_carn
AND h.id_usr=u.id_usr
AND p.id_grupo_asg=i_id_grupo
AND (EXTEND(CURRENT,YEAR TO DAY) - EXTEND(a.fe_ini,YEAR TO DAY)) >= i_dia UNITS DAY
GROUP BY 2;
END IF;

IF i_cant IS NULL THEN
LET i_cant=0;
END IF;
RETURN i_cant;

DROP TABLE ACT0;
DROP TABLE TIPO_ACT0;
DROP TABLE HIST_ASIGN0;

END PROCEDURE;
  #4 (permalink)  
Antiguo 08/12/2014, 07:55
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Procedure y Tablas Temporales

Perdón, pero... ¿estás trabajando con Informix, Oracle, MySQL, SQL Server, PostgreSQL, o con qué?
Te recuerdo que no existe un lenguaje procedural estándar, por lo que la sintaxis y recursos de cada DBMS es incompatible con el resto. No puedes pasar de uno a otro sin reescribirlo todo, y este subforo es exclusivamente de MySQL.

Para ser directo, lo que muestras no sirve en MySQL.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: bases-de-datos, procedure
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 14:00.