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

Procedimientos..

Estas en el tema de Procedimientos.. en el foro de PostgreSQL en Foros del Web. Hola compañeros mientras me estaba adentrado mas y mas en el manejo del PostgreSQL me encontre con un inconveniente.. Basicamente tengo unos procedimientos almacenados con ...
  #1 (permalink)  
Antiguo 03/09/2008, 16:47
 
Fecha de Ingreso: agosto-2008
Mensajes: 28
Antigüedad: 16 años, 4 meses
Puntos: 0
Procedimientos..

Hola compañeros mientras me estaba adentrado mas y mas en el manejo del PostgreSQL me encontre con un inconveniente..

Basicamente tengo unos procedimientos almacenados con parametros de entrada y salida tipo:

Código:
CREATE OR REPLACE FUNCTION consulta_parametros(IN float8, IN float8, OUT out_propietario "varchar", OUT out_tipo "varchar", OUT out_unidad "varchar") AS.......
bueno lo que sucede es que cuando accedo desde php a este procedimiento, el resultado es una sola cadena y no un registro como es comun.. x ejemplo:

Código:
SELECT 	(consulta_parametros('$posx','$posy')) 
$resultado=pg_query($conn,$sql);
$final=pg_fetch_array($resultado,0);
$respuesta_propietario=$final['out_propietario'];
Entonces en $respuesta_propietario no tengo nada pero si uso:
$respuesta_propietario=$final[0,1,etc];
Comienzo a obtener los primeros caracteres de las cadenas el lugar de la columna correspondiente..

Probablemente el problema este en el uso del pg_fetch_array o pg_fetch_result que tambien lo he probado pero no he conseguido solucionar este problema..

En vista de esto al momento he aplicado esta solucion que no precisamente es lo mas optimo pero me sirve para el apuro:


Código:
	
SELECT 	(consulta_parametros('$posx','$posy')).out_propietario,
		(consulta_parametros('$posx','$posy')).out_tipo,
		(consulta_parametros('$posx','$posy')).out_unidad



Bueno espero de su ayuda..

Saludos!!
  #2 (permalink)  
Antiguo 04/09/2008, 02:07
 
Fecha de Ingreso: febrero-2007
Mensajes: 1.292
Antigüedad: 17 años, 10 meses
Puntos: 13
Respuesta: Procedimientos..

Asi que tienes un problema de php....

Que tal si llamas a la funcion como la tienes declarada, es decir, con 5 parametros
Código:
select consulta_parametros($posx, $posy,  $respuesta_propietario, $respuesta_tipo, $respuesta_unidad)
Comenta si funciona...

Salu2
  #3 (permalink)  
Antiguo 04/09/2008, 14:22
 
Fecha de Ingreso: agosto-2008
Mensajes: 28
Antigüedad: 16 años, 4 meses
Puntos: 0
Respuesta: Procedimientos..

No la funcion solo recibe los parametros de entrada definidos con IN... los OUT son los de salida...

Saludos...
  #4 (permalink)  
Antiguo 05/09/2008, 01:17
 
Fecha de Ingreso: febrero-2007
Mensajes: 1.292
Antigüedad: 17 años, 10 meses
Puntos: 13
Respuesta: Procedimientos..

Lo has probado?
  #5 (permalink)  
Antiguo 06/09/2008, 08:12
 
Fecha de Ingreso: agosto-2008
Mensajes: 28
Antigüedad: 16 años, 4 meses
Puntos: 0
Respuesta: Procedimientos..

mm.. bueno eso es lo q sta funcionando realmente... envio los parametros correspondientes, pero x ejemplo tengo otro procedimiento:

Código:
CREATE OR REPLACE FUNCTION consulta_ubicacion (
		IN varchar,
		OUT out_x float8,
		OUT out_y float8,
		OUT out_time timestamp, 
		OUT out_ruta varchar, 
		OUT out_chofer varchar, 
		OUT out_contacto varchar, 
		OUT out_principal varchar, 
		OUT out_secundaria varchar, 
		OUT out_parroquia varchar
	) AS
$BODY$..........
Y si lo ejecuto normalmente

$sql="SELECT consulta_ubicacion('$unidad')";
$resultado=pg_query($conn,$sql);
$final=pg_fetch_array($resultado,0);
$respuesta_x=$final['out_x'];

El resultado es una cadena vacia pero si utilizo

$respuesta_x=$final[0];

tengo el primer caracter de la cadena resultado q es un parentesis, entonces mi cadena resultado ejemplo es:

(-12,23132,32132,"12-12-2008 12:12:12",.......)

Y finalmente como dije antes, el resultado de este procedimiento esta algo asi como un arreglo de caracteres y no un registro x columnas donde si utilizo el nombre de una columna podria obtener lo q necesito.

Espero en realidad me de una mano..
Saludos...
  #6 (permalink)  
Antiguo 08/09/2008, 02:12
 
Fecha de Ingreso: febrero-2007
Mensajes: 1.292
Antigüedad: 17 años, 10 meses
Puntos: 13
Respuesta: Procedimientos..

Si quieres ayuda, muestra el codigo del procedimiento, porque sino va a estar dificil.

Salu2
  #7 (permalink)  
Antiguo 09/09/2008, 10:26
 
Fecha de Ingreso: agosto-2008
Mensajes: 28
Antigüedad: 16 años, 4 meses
Puntos: 0
De acuerdo Respuesta: Procedimientos..

Mi procedimiento:

Código:
CREATE OR REPLACE FUNCTION consulta_ubicacion(IN "varchar", OUT out_x float8, OUT out_y float8, OUT out_time "timestamp", OUT out_ruta "varchar", OUT out_chofer "varchar", OUT out_contacto "varchar", OUT out_principal "varchar", OUT out_secundaria "varchar", OUT out_parroquia "varchar") AS
$BODY$
DECLARE

reg_unidad	RECORD;
reg_principal	RECORD;
reg_secundaria	RECORD;

BEGIN
	SELECT  re.codigo_uni,
		re.the_geom,
		x(transform(the_geom,4236)), 
		y(transform(the_geom,4236)), 
		time, 
		r.descripcion, 
		c.apellido || ' ' || c.nombre AS nombre, 
		c.telefono
	
	INTO 	reg_unidad
	FROM 	recorrido re,
		unidades u,
		chofer c,
		rutas r
	WHERE	re.estado = 'V'
	AND 	re.codigo_uni = $1
	AND 	re.codigo_uni = u.codigo_uni 
	AND	u.codigo_chofer = c.codigo_chofer  
	AND	u.codigo_ruta = r.codigo_ruta
	ORDER BY codigo_uni;


	SELECT DISTANCE(the_geom, reg_unidad.the_geom), 
		nombre_ape, 
		parroquia
	INTO	reg_principal
	FROM 	vias
	WHERE	nombre_ape IS NOT NULL
	ORDER BY distance LIMIT 5;


	SELECT 	DISTANCE(the_geom, reg_unidad.the_geom), 
		nombre_ape
	INTO 	reg_secundaria
	FROM 	vias
	WHERE 	nombre_ape IS NOT NULL
	AND reg_principal.nombre_ape <> nombre_ape
	ORDER BY distance LIMIT 7;

	out_x 		= reg_unidad.x;
	out_y 		= reg_unidad.y;
	out_time 	= reg_unidad.time;
	out_ruta 	= reg_unidad.descripcion;
	out_chofer 	= reg_unidad.nombre;
	out_contacto 	= reg_unidad.telefono;
	out_principal 	= reg_principal.nombre_ape;
	out_secundaria 	= reg_secundaria.nombre_ape;
	out_parroquia 	= reg_principal.parroquia;


END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE;
ALTER FUNCTION consulta_ubicacion(IN "varchar", OUT out_x float8, OUT out_y float8, OUT out_time "timestamp", OUT out_ruta "varchar", OUT out_chofer "varchar", OUT out_contacto "varchar", OUT out_principal "varchar", OUT out_secundaria "varchar", OUT out_parroquia "varchar") OWNER TO postgres;

Desde php:

Código PHP:

<?php
$unidad
=$_GET[getunidad];    

$conn pg_pconnect("dbname=publicaciones user=postgres password=postgres");
if (!
$conn
{
  echo 
"ERROR: No se pudo conectar co.\n";
  exit;
}

$sql="
    SELECT    (consulta_ubicacion('$unidad')).out_x, 
        (consulta_ubicacion('$unidad')).out_y, 
        (consulta_ubicacion('$unidad')).out_time, 
        (consulta_ubicacion('$unidad')).out_ruta, 
        (consulta_ubicacion('$unidad')).out_chofer, 
        (consulta_ubicacion('$unidad')).out_contacto, 
        (consulta_ubicacion('$unidad')).out_principal, 
        (consulta_ubicacion('$unidad')).out_secundaria, 
        (consulta_ubicacion('$unidad')).out_parroquia
      "
;
$resultado=pg_query($conn,$sql);
$final=pg_fetch_array($resultado,0);

$respuesta_x=$final['out_x'];
$respuesta_y=$final['out_y'];
$respuesta_time=$final['out_time'];
$respuesta_ruta=$final['out_ruta'];
$respuesta_chofer=$final['out_chofer'];
$respuesta_contacto=$final['out_contacto'];
$respuesta_principal=$final['out_principal'];
$respuesta_secundaria=$final['out_secundaria'];
$respuesta_parroquia=$final['out_parroquia'];


 

$prueba "{
        \"datos\":
            [{
                \"junidad\":\"$unidad\" , 
                \"jx\":\"$respuesta_x\" , 
                \"jy\":\"$respuesta_y\" , 
                \"jtime\":\"$respuesta_time\" , 
                \"jruta\":\"$respuesta_ruta\" , 
                \"jchofer\":\"$respuesta_chofer\" , 
                \"jcontacto\":\"$respuesta_contacto\" , 
                \"jprincipal\":\"$respuesta_principal\" , 
                \"jsecundaria\":\"$respuesta_secundaria\" , 
                \"jparroquia\":\"$respuesta_parroquia\" 

            }]
      }"
;

echo 
$prueba;

?>
Saludos...
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 12:27.