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 |
Subject: | Re: ReTORNAR UN CONJUNTO SIN RECORD Y SIN REFCURSOR |
Date: | 2007-02-15 21:02:27 |
Message-ID: | 45D4CA63.7090303@renova.com.pe |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-es-ayuda |
Yoel Mc Lennan escribió:
> 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
>
>
> ---------------------------(fin del mensaje)---------------------------
> TIP 6: ¿Has buscado en los archivos de nuestra lista de correo?
>
> http://archives.postgresql.org/pgsql-es-ayuda
>
>
mira ya me salio aunque algo diferente ahi va
CREATE OR REPLACE FUNCTION xxxx()
RETURNS SETOF record AS
$BODY$
DECLARE
resultado record;
begin
create temp sequence OrdenItem start 500;
for resultado in select nextval('OrdenItem') as orden,
aldt_in_idcab,
aldt_in_iddet,
aldt_in_orden,
aldt_ch_doc_corre,
aldt_do_subtotal,
aldt_do_valor_unitario,
aldt_do_cantidad,
arti_in_id
FROM alm_t_detalle
WHERE aldt_ch_id='1192.168.1.178cahUESNotaIng09/02/2007
19:27:20 ' loop
RETURN NEXT resultado;
end loop;
drop sequence OrdenItem;
end;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
este es el type
CREATE TYPE type_xxxx AS (idne int4,
aldt_in_idcab int4,
aldt_in_iddet int4,
aldt_in_orden int4,
aldt_ch_doc_corre char(15),
aldt_do_subtotal numeric(18,4),
aldt_do_valor_unitario numeric(18,4),
aldt_do_cantidad numeric(18,4),
arti_in_id int4);
y esta es la forma en la que pruebo
select * from xxxx() as (idne int8,
aldt_in_idcab int4,
aldt_in_iddet int4,
aldt_in_orden int4,
aldt_ch_doc_corre char(15),
aldt_do_subtotal numeric,
aldt_do_valor_unitario numeric,
aldt_do_cantidad numeric,
arti_in_id int4)
From | Date | Subject | |
---|---|---|---|
Next Message | Raúl Mero Moreira | 2007-02-15 21:12:44 | Re: LATAM postgresql users |
Previous Message | Esteban Osorio | 2007-02-15 20:45:53 | [pgsql-es-ayuda] Probema con codificación de consulta. |