Ejecutar funciones en PHP que retornan Refcursor desde Postgres

From: ALFONSO REYES <alfonsoreyescruz(at)hotmail(dot)com>
To: lista ayuda postgres <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Ejecutar funciones en PHP que retornan Refcursor desde Postgres
Date: 2009-06-25 02:56:07
Message-ID: SNT116-W439FFE95537346C5621250DF340@phx.gbl
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda


Buenas nochres Estimada Lista
Agradecería si alguien me puede indicar como ejecutar funcionesque retornan refcursos en postgres desde PHP eje:
Cualquier idea o comentario es bienbenido
Gracias de antemano por su ayuda.
Esta es la que no funciona refcursor
codigo postgres
CREATE OR REPLACE FUNCTION "danmaf"."gen_sp_obt_bancos" (pp_id_empresa integer, p_id_persona integer, p_id_banco integer, p_identificacion varchar, p_nombre varchar, p_tipo_banco varchar, p_cur_resultado "pg_catalog"."refcursor") RETURNS "pg_catalog"."refcursor" AS
$body$
DECLARE
v_existe INTEGER:=0;
BEGIN

SELECT count(1)
into v_existe
from "danmaf".vw_bancos vb
where vb.id_empresa=pp_id_empresa
and (vb.id_banco=p_id_banco or p_id_banco is null)
and (vb.identificacion=p_identificacion or p_identificacion is null)
and ((vb.nombre like '%'||upper(p_nombre)||'%') or p_nombre is null)
and (vb.id_persona =p_id_persona or p_id_persona is null)
and (vb.tipo_banco =p_tipo_banco or p_tipo_banco is null);

if v_existe = 0 then
open p_cur_resultado
FOR select '-1' as codigo,'Banco no registrado'as descripcion;
return p_cur_resultado;

else
open p_cur_resultado
FOR
SELECT *
from "danmaf".vw_bancos vb
where vb.id_empresa=pp_id_empresa
and (vb.id_banco=p_id_banco or p_id_banco is null)
and (vb.identificacion=p_identificacion or p_identificacion is null)
and ((vb.nombre like '%'||upper(p_nombre)||'%') or p_nombre is null)
and (vb.id_persona =p_id_persona or p_id_persona is null)
and (vb.tipo_banco =p_tipo_banco or p_tipo_banco is null);

return p_cur_resultado;
end if;

END;
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER
COST 100;
codigo php que no se como hacer para que funcione
<?php
// Conexion, seleccion de base de datos
$conexion_bd = pg_connect("host=localhost dbname=danmaf user=danmaf password=danmaf")
or die('No pudo conectarse: ' . pg_last_error());

pg_query('begin') or die('Consulta fallida: ' . pg_last_error());
pg_query('SELECT gen_sp_obt_bancos( 4, null, null, null,null, null, 'p_cur_resultado')') or die('Consulta fallida: ' . pg_last_error());
pg_query('fetch all in "p_cur_resultado"') or die('Consulta fallida: ' . pg_last_error());
pg_query('commit') or die('Consulta fallida: ' . pg_last_error());

de esta forma tampoco funionó

//$resultado =pg_exec ($conexion_bd,"begin SELECT gen_sp_obt_bancos( 4, null, null, null,null, null, 'p_cur_resultado') fetch all in "p_cur_resultado" commit");

// Impresion de resultados en HTML
echo "<table>\n";
while ($linea = pg_fetch_array($resultado, null, PGSQL_ASSOC)) {
echo "\t<tr>\n";
foreach ($linea as $valor_col) {
echo "\t\t<td>$valor_col</td>\n";
}
echo "\t</tr>\n";
}
echo "</table>\n";

// Liberar conjunto de resultados
pg_free_result($resultado);

// Cerrar conexion
pg_close($conexion_bd);

?>

Ejecución de una funcion set of record esta si funciona:
codigo postgres
CREATE OR REPLACE FUNCTION "danmaf"."gen_obt_estab_punto" (pp_id_empresa integer, pp_unidad_adm varchar, p_documento varchar, p_fecha_trx date) RETURNS SETOF "danmaf"."ty_gen_obt_estab_punto" AS
$body$
DECLARE

v_rec_salida danmaf.ty_gen_obt_estab_punto;

BEGIN

for v_rec_salida in
SELECT fa.establecimiento,fa.punto,fa.autorizacion
FROM danmaf.gen_documento gd,danmaf.fac_autorizaciones fa
WHERE gd.id_documento=fa.id_documento
and gd.nombre=UPPER(p_documento)
and gd.id_empresa=pp_id_empresa
and fa.cod_unidad=pp_unidad_adm
and p_fecha_trx >= fa.fecha_emision
and p_fecha_trx <=fa.fecha_caducidad
loop
return next v_rec_salida;
end loop;
if v_rec_salida.establecimiento is not null THEN
return ;
else
for v_rec_salida in
select '-01' as codigo ,'No hay autorizacion' as descripcion
loop
return next v_rec_salida;
end loop;
return;
end if;

END;
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER
COST 100 ROWS 1000;

codigo php
<?php
// Conexion, seleccion de base de datos
$conexion_bd = pg_connect("host=localhost dbname=danmaf user=danmaf password=danmaf")
or die('No pudo conectarse: ' . pg_last_error());

// Realizar una consulta SQL

$resultado =pg_exec ($conexion_bd,"SELECT * from gen_obt_estab_punto( null, null, null, null)");

// Impresion de resultados en HTML
echo "<table>\n";
while ($linea = pg_fetch_array($resultado, null, PGSQL_ASSOC)) {
echo "\t<tr>\n";
foreach ($linea as $valor_col) {
echo "\t\t<td>$valor_col</td>\n";
}
echo "\t</tr>\n";
}
echo "</table>\n";

// Liberar conjunto de resultados
pg_free_result($resultado);

// Cerrar conexion
pg_close($conexion_bd);

?>

_________________________________________________________________
Show them the way! Add maps and directions to your party invites.
http://www.microsoft.com/windows/windowslive/products/events.aspx

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Nicolás Domínguez Florit 2009-06-25 16:15:34 Cambios volátiles por usuario...
Previous Message José Fermín Francisco Ferreras 2009-06-25 02:43:05 RE: archivo .pgpass