Re: ReTORNAR UN CONJUNTO SIN RECORD Y SIN REFCURSOR

From: "Yoel Mc Lennan" <yoelnatanael(at)hotmail(dot)com>
To: "jeferson alvarez" <jalvarez(at)renova(dot)com(dot)pe>, <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: ReTORNAR UN CONJUNTO SIN RECORD Y SIN REFCURSOR
Date: 2007-02-15 17:22:47
Message-ID: BAY129-DAV9D89B868EF30355B42DB5CC960@phx.gbl
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

La unica forma que encontre más o menos "prolija" de hacer essto es
crear una vista, crear una función que retorne el mismo tipo de datos de la
vista, con un for , si no so más de 1000 registros funciona rapido con
asp.net.
cuando es una select simple,la función se define como set of (tabla
consultada).
el ejemplo de la vista es medio compleja ya que usa cuatro tablas
diferentes, pero vale el ejemplo.

Ej:
mi función : (más abajo esta la vista)

CREATE OR REPLACE FUNCTION "public"."fg_listaus_por_emp" (v_id_empresa
integer, v_activo integer) RETURNS SETOF "public"."view_usuarios" AS
$body$
/* New function body
Lista los usuarios segun id de empresa.
devuelve recordset con id_usuario,id_objeto (id_tabla usuarios externos)
*/
declare
mirec record;
begin
for mirec in execute 'select * from view_usuarios where id_empresa=' ||
v_id_empresa || ' and activo=' || v_activo
loop
return next mirec;
end loop;
return;
end
$body$
LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;

mi view :

CREATE VIEW "public"."view_usuarios" (
id_empresa,
activo,
id_usuario,
id_tipo_usuario,
id_objeto,
user,
nombre)
AS
SELECT g_usuarios.id_empresa, g_usuarios.activo, g_usuarios.id_usuario,
g_usuarios.id_tipo_usuario, g_usuarios.id_objeto, g_usuarios."user", (
SELECT CASE WHEN (g_usuarios.id_tipo_usuario = 1) THEN (
SELECT (((leg.apellido)::text || ','::text) || (leg.nombre)::text)
FROM r_legajos leg
WHERE (leg.id_legajo = g_usuarios.id_objeto)
) WHEN (g_usuarios.id_tipo_usuario = 2) THEN (
SELECT (((prof.apellido)::text || ','::text) || (prof.nombre)::text)
FROM l_profesionales prof
WHERE (prof.id_profesional = g_usuarios.id_objeto)
) WHEN (g_usuarios.id_tipo_usuario = 3) THEN ((
SELECT ins.razon_social
FROM l_instituciones ins
WHERE (ins.id_institucion = g_usuarios.id_objeto)
))::text WHEN (g_usuarios.id_tipo_usuario = 4) THEN (
SELECT (((pac.apellido)::text || ','::text) || (pac.nombre)::text)
FROM l_pacientes pac
WHERE (pac.id_paciente = g_usuarios.id_objeto)
) WHEN (g_usuarios.id_tipo_usuario = 5) THEN ((
SELECT g_usuarios."user"
))::text ELSE NULL::text END AS "case"
) AS nombre
FROM g_usuarios;

----- Original Message -----
From: "jeferson alvarez" <jalvarez(at)renova(dot)com(dot)pe>
To: "Yoel Mc Lennan" <yoelnatanael(at)hotmail(dot)com>;
<pgsql-es-ayuda(at)postgresql(dot)org>
Sent: Wednesday, February 14, 2007 12:28 PM
Subject: [pgsql-es-ayuda] ReTORNAR UN CONJUNTO SIN RECORD Y SIN REFCURSOR

ESTUBE PROBANDO CON UN TYPE Y CON RECORD PERO PARA EL RECORD VA UN LOOP
ESLO QUE LE FALTA A ESTA FUNCION PERO A MI LO QUE ME INTERESA ES CON
TYPE O ALGUNA OTRA DONDE NO USE UN LOOP Y TIENE QUE SER CON PLPGSQL
PORQUE HAY MUCHAS MAS INTRUCCIONES QUE AGREGAR A ESTA FUNCION GRACIAS
POR LA AYUDA DE ANTEMANOD SI ALGUIEN NOS DIERA ALGUNAS LUCES

-- RETURNS SETOF record AS
CREATE OR REPLACE FUNCTION alm_t_detalle_Eliminar1(ialdt_ch_id char(50))
RETURNS SETOF Type_alm_t_detalle_Eliminar_obtener AS
$BODY$
DECLARE
resultado record;
BEGIN

select td.arti_in_id,rtrim(a.arti_vc_descripcion) as
arti_vc_descripcion,
rtrim(c.conc_vc_desc) as
conc_vc_desc,td.aldt_do_cantidad,td.aldt_do_valor_unitario,

td.aldt_do_subtotal,td.aldt_ch_id,td.aldt_in_idcab,td.aldt_in_iddet,
td.aldt_ch_doc_corre
from alm_t_detalle td
inner join sgc_m_articulo a on
td.arti_in_id = a.arti_in_id
INNER JOIN sgc_m_conceptos C ON
c.conc_ch_codigo=a.arti_ch_und and c.conc_ch_tipo='UMD'
where aldt_ch_id=$1;

return;

END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;

SELECT * FROM
alm_t_detalle_Eliminar1('11192.168.1.178cahUESNotaIng09/02/2007
15:34:13 1')
AS (orden int4,arti_in_id int4,arti_vc_descripcion
char(350),conc_vc_desc text,
aldt_do_cantidad numeric,aldt_do_valor_unitario
numeric,aldt_do_subtotal numeric,
aldt_ch_id char(50),aldt_in_idcab int4,aldt_in_iddet
int4,aldt_ch_doc_corre char(15))

---------------------------(fin del mensaje)---------------------------
TIP 10: visita nuestro canal de IRC #postgresql-es en irc.freenode.net

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Gabriel Colina 2007-02-15 17:27:11 Re: LATAM postgresql users
Previous Message arturo garcia 2007-02-15 17:15:39 RE: LATAM postgresql users