Re: Problema con Cursor ??

From: Alvaro Herrera <alvherre(at)commandprompt(dot)com>
To: Ivan Alejandro Flores Correa <ifloresenator(at)gmail(dot)com>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Problema con Cursor ??
Date: 2006-12-18 00:28:18
Message-ID: 20061218002817.GB7718@alvh.no-ip.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Ivan Alejandro Flores Correa escribió:

> CREATE OR REPLACE FUNCTION websystem.optionSystemAdmin(
> i_user_id IN integer,
> o_cursor_application OUT REFCURSOR,
> o_codError OUT integer,
> o_descError OUT varchar)
> AS $$
> DECLARE
> vCodFunc integer := 400;
> BEGIN
> o_codError := 0;
> o_descError := 'OK';
>
> -- Verificamos que los Datos no Vengan null
> IF i_user_id IS NULL THEN
> o_codError := vCodFunc || 001;
> o_descError := 'userId is NUll.';
> RETURN;
> END IF;
>
> -- Seteamos las Applicaciones
> OPEN o_cursor_application FOR
> SELECT A.id
> , A.nombre
> , A.descripcion
> FROM websystem.APPLICATION A
> ORDER BY A.id;
>
>
> RETURN;
> END;
> $$ LANGUAGE 'plpgsql' VOLATILE;

Este procedimiento se puede hacer mucho mas facil:

create or replace function foo (i_user_id integer,
id out integer,
nombre out text,
descripcion out text) returns setof record
language 'plpgsql' stable strict as $$

declare
rec record;
begin
for rec in select a.id, a.nombre, a.descripcion
from websystem.application a
order by a.id loop
id = rec.id;
nombre = rec.nombre;
descripcion = rec.descripcion;
return next;
end loop;
end;
$$;

Los cambios son:

1. no necesitas chequear que el parametro sea no nulo, puesto que si la
funcion es strict, el procedimiento no sera invocado en caso de que
alguno de los parametros sea nulo; simplemente retornara nulo. (Si
quisieras invocar a un procedimiento con parametros nulos, debes
declararlo "called on null input", pero obviamente no tiene sentido
invocar al procedimiento solo para lanzar un mensaje de error).

2. No se hace OPEN de un cursor, sino que se entregan directamente los
resultados obtenidos. Asi te evitas hacer que la aplicacion tenga que
hacer FETCH del cursor.

Espero que este claro que el parametro "i_user_id" no se esta usando
para nada :-)

--
Alvaro Herrera http://www.CommandPrompt.com/
The PostgreSQL Company - Command Prompt, Inc.

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Alvaro Herrera 2006-12-18 00:30:00 Re: drop tablespace ? pero por otra razon
Previous Message Mario 2006-12-18 00:19:43 Re: drop tablespace ? pero por otra razon