jeferson alvarez escribió:
> 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)
>
>
> ---------------------------(fin del mensaje)---------------------------
> TIP 4: No hagas 'kill -9' a postmaster
>
lo anteriro escrito funciona en el query del pgadmin pero solo una vez
cuando lo vuelvo a correr me sale el siguiente error
ERROR: could not open relation with OID 25337
CONTEXT: PL/pgSQL function "xxxx" line 7 at for over select rows
ahi si que toy perdido que significa eso y como debo solucionarlo
mientras espero su respuesta iire buscando informacion sobre oid que no
se ques gracias de antemano