RE: Ayuda Por Favor, Me hechan del Trabajo

From: "Jose Stragnari" <jose(at)mulleryasociados(dot)com(dot)ar>
To: <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: RE: Ayuda Por Favor, Me hechan del Trabajo
Date: 2005-05-06 11:37:38
Message-ID: DAB36061289D474F8FDB2EBB373294730571F3@server2000.dominio1.local
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

No debes retornar un setof de tu tipo de dato, solo debes retornar tu tipo de dato y no usar un return next, sino un return nada más.

-----Mensaje original-----
De: P(at)blo Villad@ [mailto:andresv50(at)hotmail(dot)com]
Enviado el: Jueves, 05 de Mayo de 2005 08:39 p.m.
Para: Jose Stragnari
Asunto: [pgsql-es-ayuda] Ayuda Por Favor, Me hechan del Trabajo

>From: "Jose Stragnari" <jose(at)mulleryasociados(dot)com(dot)ar>
>To: "P(at)blo Villad@" <andresv50(at)hotmail(dot)com>
>Subject: RE: [pgsql-es-ayuda] Ayuda Por Favor, Me hechan del Trabajo
>Date: Thu, 5 May 2005 17:43:12 -0300
>
>Pablo, yo también estuve con ese problema hoy y con los datos que me
>pasaron lo resolví de la siguiente manera:
>
>Como en SQL Server se pueden crear variables de tipo tabla, pensé que en
>Postgres también, pero se debe hacer de manera diferente.
>
>1 - Crea un tipo de datos compuesto con la estructura de lo que necesitas
>que salga de la función:
>
>Por ejemplo
>
>CREATE TYPE "public"."type_mi_tipo" AS (
> "campo1" INTEGER,
> "campo2" TEXT,
> "campo3" TIMESTAMP(0) WITHOUT TIME ZONE
>);
>
>2 - Crea la función y como tipo de dato de retorno ponés
>"public"."type_mi_tipo":
>
>
>CREATE OR REPLACE FUNCTION "public"."mi_funcion" (nidempleado integer)
>RETURNS "public"."type_mi_tipo" AS
>$body$
>DECLARE mi_variable "public"."type_mi_tipo";
>BEGIN
> SELECT INTO mi_variable e.idempleado, p.nombre, p.fecnac
> FROM empleados e INNER JOIN personas p
> ON e.idpersona = p.idpersona
> WHERE e.idempleado = nidempleado;
>
> RETURN mi_variable;
>END;
>$body$
>LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;
>
>3 - Luego está listo para que realices select sobre la función:
>
>SELECT * FROM mi_funcion(1)
>
>Espero te sirva y saludos
>
>
>-----Mensaje original-----
>De: P(at)blo Villad@ [mailto:andresv50(at)hotmail(dot)com]
>Enviado el: Jueves, 05 de Mayo de 2005 05:05 p.m.
>Para: pgsql-es-ayuda(at)postgresql(dot)org
>Asunto: [pgsql-es-ayuda] Ayuda Por Favor, Me hechan del Trabajo
>
>
>
>Hola....
>
>Estoy trabajando con procedimientos almacenados, y me gustaría saber
>cómo puedo devolver un record pero que tenga la estructura de una
>tabla,
>¿cómo podría hacer ésto?.
>
>ME encantaría que me ayudasen cuanto antes, ya que me corre bastante
>prisa conocer la respuesta.
>
>Tengo la siguiente funcion :
>
>CREATE OR REPLACE FUNCTION devolver_registro(varchar) RETURNS SETOF RECORD
>AS '
> DECLARE
> registro RECORD;
> BEGIN
> FOR registro IN SELECT p.pon_emp_nidntfccion,
>p.pon_nevnto,
>p.pon_ttulo
> FROM ponencias p
> WHERE p.pom_emp_nidntfccion=$1;
> LOOP
> RETURN NEXT registro ;
> END LOOP ;
> RETURN ;
> END;'
>
> LANGUAGE plpgsql;
>
>
>la llamo de la siguiente manera:
>
>select * from devolver_registro(1);
>
>y me saca el siguiente error
>
>** a column definition list is required for functions returning "record"
>
>como invoco esa función. Es obligacion poner los parametros. que solucion
>me pueden dar.
>
>como puedo hacerlo sin esta estructura
>
>SELECT * FROM devuelve_registro(14) as (xxx varchar, yyy varchar,
>zzz int, www int);
>
>Ah otra cosa como puedo hacer para que en esta linea de la funcion
>
>FOR registro IN SELECT p.pon_emp_nidntfccion, p.pon_nevnto, p.pon_ttulo
> FROM ponencias p
>
>pueda poner
>
>FOR registro IN SELECT * FROM ponencias p
>
>y no me saque mas errores
>
>
>Otra forma en que lo realizo es esta
>
>CREATE OR REPLACE FUNCTION CPonencia (varchar) RETURNS SETOF RECORD AS '
> DECLARE
> registro RECORD;
> BEGIN
> FOR registro IN SELECT p.pon_emp_nidntfccion, p.pon_nevnto,
>p.pon_ttulo
> FROM ponencias p
> WHERE p.pom_emp_nidntfccion=$1;
> LOOP
> RETURN NEXT registro ;
> END LOOP ;
> RETURN ;
> END;'
>
> LANGUAGE plpgsql;
>
>
>lo llamo asi
>
>SELECT * from Cponencia ('01') as (x varchar, y varchar, z varchar);
>
>Me saca este erro.
>
>
>ERROR: missing "LOOP" at end of SQL expression
>CONTEXT: compile of PL/pgSQL function "cponencia" near line 4
>
>
>Muchas Gracias.
>
>
>
>---------------------------(fin del mensaje)---------------------------
>TIP 2: puedes desuscribirte de todas las listas simultáneamente
> (envíe "unregister TuDirecciónDeCorreo" a majordomo(at)postgresql(dot)org)

hola muchas gracias pero aun no me funciona

la cree como usted me indica pero me pasa lo siguiente

CREATE TYPE public.tasesores AS (nombre varchar(30), apellido varchar(30));

CREATE OR REPLACE FUNCTION public.tasesor (varchar) returns setof
public.tasesores as '
DECLARE
rtasesores public.tasesores;
BEGIN

SELECT into rtasesores a.ase_nmbre, a.ase_papllido from
asesores a
where a.ase_nidntfccion=$1;

RETURN rteasesores;
END;'
language 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;
~
Que puedo hacer ????????????

y cundo la ejecuto me sale

SELECT * from tasesor('01');

ERROR: RETURN cannot have a parameter in function returning set; use RETURN
NEXT at or near "rteasesores" at character 363
QUERY:
DECLARE
rtasesores public.tasesores;
-- registro record;
BEGIN
-- FOR registro IN
SELECT into rtasesores a.ase_nmbre, a.ase_papllido from
asesores a
where a.ase_nidntfccion=$1;
-- LOOP
-- rtasesores.nombre := a.ase_nmbre;
-- rtasesores.apellido := a.ase_papllido;
-- RETURN NEXT rtasesores;
-- END LOOP;
-- RETURN NEXT rtasesores;
RETURN rteasesores;
END;
CONTEXT: compile of PL/pgSQL function "tasesor" near line 14
LINE 15: RETURN rteasesores;

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Mauricio Zea (Gmail) 2005-05-06 12:20:59 Re: Rendimiento del delete
Previous Message Oswaldo Hernández 2005-05-06 11:05:24 Plpythonu y Python 2.4