RE: 2 preguntas acerca de fechas

Lists: pgsql-es-ayuda
From: Daniel Soto <daniel(dot)soto2k(at)gmail(dot)com>
To: pgsql-es-ayuda(at)postgresql(dot)org
Subject: RE: 2 preguntas acerca de fechas
Date: 2007-07-08 00:44:51
Message-ID: [email protected]
Views: Whole Thread | Raw Message | Download mbox | Resend email
Lists: pgsql-es-ayuda

Hola, gracias, en realidad bastaba con poner timestamp para no andar
sumando horas ni nada.

Ahora, aqui veo un concepto que no entiendo del todo y quisiera que me
lo explicaran.

Ahora, considerando la funcion (con las variables ya cambiadas a timestamp)

create or replace function inventario.mi_funcion
(
in codigo varchar(50),
in fechaBusqIni timestamp,
in fechaBusqFin timestamp
)
returns void as $$
declare
hora_ini time;
hora_fin time;
fecha_ini timestamp;
fecha_fin timestamp;
begin

select *
from inventario.movimientos
where codigoprod=codigo and
fecha_movimiento between fechaBusqIni and fechaBusqFin;

end;
$$ LANGUAGE 'plpgsql' VOLATILE;

Al ejecutarlo me arroja el error /
ERROR: query has no destination for result data
HINT: If you want to discard the results of a SELECT, use PERFORM instead.

/Por lo que veo parece que el resultado del select (que es lo que quiero
rescatar afuera en mi programa que llama a este procedimiento
almacenado) debo asignarselo a algun return con cierto tipo. ¿Como debo
hacerlo?

Gracias.


From: Miguel Rodríguez Penabad <penabad(at)gmail(dot)com>
To: pgsql-es-ayuda(at)postgresql(dot)org, "Daniel Soto" <daniel(dot)soto2k(at)gmail(dot)com>
Subject: Re: 2 preguntas acerca de fechas
Date: 2007-07-08 01:16:18
Message-ID: [email protected]
Views: Whole Thread | Raw Message | Download mbox | Resend email
Lists: pgsql-es-ayuda

El 8/07/07, Daniel Soto <daniel(dot)soto2k(at)gmail(dot)com> escribió:
>
> Hola, gracias, en realidad bastaba con poner timestamp para no andar
> sumando horas ni nada.
>
> Ahora, aqui veo un concepto que no entiendo del todo y quisiera que me lo
> explicaran.
>
> Ahora, considerando la funcion (con las variables ya cambiadas a timestamp)
>
> create or replace function inventario.mi_funcion
> (
> in codigo varchar(50),
> in fechaBusqIni timestamp,
> in fechaBusqFin timestamp
> )
> returns void as $$
> declare
> hora_ini time;
> hora_fin time;
> fecha_ini timestamp;
> fecha_fin timestamp;
> begin
>
> select *
> from inventario.movimientos
> where codigoprod=codigo and
> fecha_movimiento between fechaBusqIni and fechaBusqFin;
>
> end;
> $$ LANGUAGE 'plpgsql' VOLATILE;
>
>
> Al ejecutarlo me arroja el error
> ERROR: query has no destination for result data
> HINT: If you want to discard the results of a SELECT, use PERFORM instead.
>
> Por lo que veo parece que el resultado del select (que es lo que quiero
> rescatar afuera en mi programa que llama a este procedimiento almacenado)
> debo asignarselo a algun return con cierto tipo. ¿Como debo hacerlo?
>
> Gracias.
>

Es más práctico hacer unha función SQL (no plpgsql) para esto.

create or replace function inventario.mi_funcion
(
in codigo varchar(50),
in fechaBusqIni timestamp,
in fechaBusqFin timestamp
)
returns SETOF inventario.movimientos as $$
select *
from inventario.movimientos
where codigoprod=$1 and
fecha_movimiento between $2 and $3;

$$ LANGUAGE sql VOLATILE;

Saludos


From: "Jaime Casanova" <systemguards(at)gmail(dot)com>
To: "Daniel Soto" <daniel(dot)soto2k(at)gmail(dot)com>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: 2 preguntas acerca de fechas
Date: 2007-07-08 07:34:52
Message-ID: [email protected]
Views: Whole Thread | Raw Message | Download mbox | Resend email
Lists: pgsql-es-ayuda

On 7/8/07, Daniel Soto <daniel(dot)soto2k(at)gmail(dot)com> wrote:
> Al ejecutarlo me arroja el error
> ERROR: query has no destination for result data
> HINT: If you want to discard the results of a SELECT, use PERFORM instead.
>
> Por lo que veo parece que el resultado del select (que es lo que quiero
> rescatar afuera en mi programa que llama a este procedimiento almacenado)
> debo asignarselo a algun return con cierto tipo. ¿Como debo hacerlo?
>
http://www.postgresql.org/docs/8.2/static/plpgsql-statements.html#PLPGSQL-STATEMENTS-SQL-ONEROW

--
Atentamente,
Jaime Casanova

"Programming today is a race between software engineers striving to
build bigger and better idiot-proof programs and the universe trying
to produce bigger and better idiots.
So far, the universe is winning."
Richard Cook


From: Miguel Rodríguez Penabad <penabad(at)gmail(dot)com>
To: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: 2 preguntas acerca de fechas
Date: 2007-07-08 11:02:23
Message-ID: [email protected]
Views: Whole Thread | Raw Message | Download mbox | Resend email
Lists: pgsql-es-ayuda

El 8/07/07, Jaime Casanova <systemguards(at)gmail(dot)com> escribió:
> On 7/8/07, Daniel Soto <daniel(dot)soto2k(at)gmail(dot)com> wrote:
> > Al ejecutarlo me arroja el error
> > ERROR: query has no destination for result data
> > HINT: If you want to discard the results of a SELECT, use PERFORM instead.
> >
> > Por lo que veo parece que el resultado del select (que es lo que quiero
> > rescatar afuera en mi programa que llama a este procedimiento almacenado)
> > debo asignarselo a algun return con cierto tipo. ¿Como debo hacerlo?
> >
> http://www.postgresql.org/docs/8.2/static/plpgsql-statements.html#PLPGSQL-STATEMENTS-SQL-ONEROW
>

Tal como está la función original de Daniel, a mi me da la impresión
de que el select devuelve más de una fila. Por eso yo había dicho que
era más fácil hacerlo con unha función SQL que devuelve "SETOF
inventario". Para hacerlo con PL/pgSQL hay que andar con bucles,
return next, ... (más complicado para hacer lo mismo, vamos :) )


From: Gabriel Hermes Colina Zambra <hermeszambra(at)yahoo(dot)com>
To: Miguel Rodríguez Penabad <penabad(at)gmail(dot)com>, pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: 2 preguntas acerca de fechas
Date: 2007-07-08 16:23:24
Message-ID: [email protected]
Views: Whole Thread | Raw Message | Download mbox | Resend email
Lists: pgsql-es-ayuda


--- Miguel Rodríguez Penabad <penabad(at)gmail(dot)com>
escribió:

> El 8/07/07, Jaime Casanova <systemguards(at)gmail(dot)com>
> escribió:
> > On 7/8/07, Daniel Soto <daniel(dot)soto2k(at)gmail(dot)com>
> wrote:
> > > Al ejecutarlo me arroja el error
> > > ERROR: query has no destination for result
> data
> > > HINT: If you want to discard the results of a
> SELECT, use PERFORM instead.
> > >
> > > Por lo que veo parece que el resultado del
> select (que es lo que quiero
> > > rescatar afuera en mi programa que llama a este
> procedimiento almacenado)
> > > debo asignarselo a algun return con cierto tipo.
> ¿Como debo hacerlo?
> > >
> >
>
http://www.postgresql.org/docs/8.2/static/plpgsql-statements.html#PLPGSQL-STATEMENTS-SQL-ONEROW
> >
>
> Tal como está la función original de Daniel, a mi me
> da la impresión
> de que el select devuelve más de una fila. Por eso
> yo había dicho que
> era más fácil hacerlo con unha función SQL que
> devuelve "SETOF
> inventario". Para hacerlo con PL/pgSQL hay que andar
> con bucles,
> return next, ... (más complicado para hacer lo
> mismo, vamos :) )
> --

Aunque estoy de acuerdo contigo, al igual que tu
prefiero hacer una funcion en sql, o una consulta con
rules y una funcion en sql, puesto que no solo es mas
facil, tambien es editable desde un recordset cuando
construyo mi aplicacion.

Debo aclararte que tambien desde pl/pgsql se puede
devolver varios registros sin la necesidad de bucles y
no es tan complicado, eso si siempre me devolvieron
recordset readonly, mientras que desde la otra forma
edito los recordset dinamicos desde una grilla y los
actualizo desde ahi sin problemas.

De todas maneras, la estrategia de usar uno u otro
dependera de uso final que le demos a esto.

Atte,
Gabriel Hermes Colina Zambra

__________________________________________________
Correo Yahoo!
Espacio para todos tus mensajes, antivirus y antispam ¡gratis!
Regístrate ya - http://correo.espanol.yahoo.com/


From: Miguel Rodríguez Penabad <penabad(at)gmail(dot)com>
To: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: 2 preguntas acerca de fechas
Date: 2007-07-08 22:37:15
Message-ID: [email protected]
Views: Whole Thread | Raw Message | Download mbox | Resend email
Lists: pgsql-es-ayuda

El 8/07/07, Gabriel Hermes Colina Zambra <hermeszambra(at)yahoo(dot)com> escribió:
[...]
> Debo aclararte que tambien desde pl/pgsql se puede
> devolver varios registros sin la necesidad de bucles y
> no es tan complicado, ...

Podrías decirme cómo, o indicarme un enlace en donde se hable de ello?
Es que revisé antes de contestar la pregunta original y la única forma
que encontré
en pl/pgsql era del tipo

for registro in (select bla bla) loop
return next registro;
end loop;
return;

Saludos
Miguel


From: Alvaro Herrera <alvherre(at)commandprompt(dot)com>
To: Daniel Soto <daniel(dot)soto2k(at)gmail(dot)com>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: 2 preguntas acerca de fechas
Date: 2007-07-08 22:40:29
Message-ID: [email protected]
Views: Whole Thread | Raw Message | Download mbox | Resend email
Lists: pgsql-es-ayuda

Daniel Soto escribió:

> Al ejecutarlo me arroja el error /
> ERROR: query has no destination for result data
> HINT: If you want to discard the results of a SELECT, use PERFORM instead.

Lo que sucede es que en una funcion PL/pgSQL, debes "redirigir" el
resultado de las consultas a alguna parte; ya sea a una variable (usando
INTO, y potencialmente poniendo la consulta en un FOR ... LOOP), o bien
a un hipotetico "/dev/null" usando PERFORM en lugar de SELECT.

> /Por lo que veo parece que el resultado del select (que es lo que quiero
> rescatar afuera en mi programa que llama a este procedimiento
> almacenado) debo asignarselo a algun return con cierto tipo. ¿Como debo
> hacerlo?

Lo mas sensato en este caso es que no uses ningun procedimiento
almacenado (a.k.a. "funcion") y que ejecutes la consulta directamente.
En este caso en particular, el procedimiento almacenado no le agrega
ningun valor a lo que estas haciendo, y mas te valdria hacer la consulta
SELECT directamente.

--
Alvaro Herrera Valdivia, Chile ICBM: S 39º 49' 18.1", W 73º 13' 56.4"
"El miedo atento y previsor es la madre de la seguridad" (E. Burke)


From: Daniel Soto <daniel(dot)soto2k(at)gmail(dot)com>
To: Miguel Rodríguez Penabad <penabad(at)gmail(dot)com>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: 2 preguntas acerca de fechas
Date: 2007-07-09 02:25:08
Message-ID: [email protected]
Views: Whole Thread | Raw Message | Download mbox | Resend email
Lists: pgsql-es-ayuda

Tambien estoy interesado en como hacer eso, de devolver varios registros
con pgplsql. Veran lo que pasa es que me importa mantener la
"homogeneidad" de mi sistema, es decir, para funciones que devuelven
multiples registros usar sql mientras que para las demas (por ejemplo
insercion de registros) usar plpgsql. No lo se, en mi opinion no seria
muy complicado tener algunas funciones en un lenguaje y otras con otro?
Digo, en otras bases de datos se puede hacer perfectamente sin tanta
"complicacion" (bueno, considerando como "complicacion" algo que aun no
domino bien, lo admito).

El problema es que con funciones en sql no puedo declarar variables
locales, y tengo algunos procedimientos que necesito migrar, que tienen
un poco de logica dentro, entonces, o uso plpgsql (que lo estoy
encontrando mas robusto) o uso sql, pero este ultimo no deja usar
variables locales, segun me han contado.

Miguel Rodríguez Penabad escribió:
> El 8/07/07, Gabriel Hermes Colina Zambra <hermeszambra(at)yahoo(dot)com>
> escribió:
> [...]
>> Debo aclararte que tambien desde pl/pgsql se puede
>> devolver varios registros sin la necesidad de bucles y
>> no es tan complicado, ...
>
> Podrías decirme cómo, o indicarme un enlace en donde se hable de ello?
> Es que revisé antes de contestar la pregunta original y la única forma
> que encontré
> en pl/pgsql era del tipo
>
> for registro in (select bla bla) loop
> return next registro;
> end loop;
> return;
>
> Saludos
> Miguel
> --
> ---------------------------(fin del mensaje)---------------------------
> TIP 2: puedes desuscribirte de todas las listas simultáneamente
> (envíe "unregister TuDirecciónDeCorreo" a majordomo(at)postgresql(dot)org)
>


From: Alvaro Herrera <alvherre(at)commandprompt(dot)com>
To: Daniel Soto <daniel(dot)soto2k(at)gmail(dot)com>
Cc: Miguel Rodríguez Penabad <penabad(at)gmail(dot)com>, pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: 2 preguntas acerca de fechas
Date: 2007-07-09 04:16:42
Message-ID: [email protected]
Views: Whole Thread | Raw Message | Download mbox | Resend email
Lists: pgsql-es-ayuda

Daniel Soto escribió:
> Tambien estoy interesado en como hacer eso, de devolver varios registros
> con pgplsql. Veran lo que pasa es que me importa mantener la
> "homogeneidad" de mi sistema, es decir, para funciones que devuelven
> multiples registros usar sql mientras que para las demas (por ejemplo
> insercion de registros) usar plpgsql. No lo se, en mi opinion no seria
> muy complicado tener algunas funciones en un lenguaje y otras con otro?
> Digo, en otras bases de datos se puede hacer perfectamente sin tanta
> "complicacion" (bueno, considerando como "complicacion" algo que aun no
> domino bien, lo admito).
>
> El problema es que con funciones en sql no puedo declarar variables
> locales, y tengo algunos procedimientos que necesito migrar, que tienen
> un poco de logica dentro, entonces, o uso plpgsql (que lo estoy
> encontrando mas robusto) o uso sql, pero este ultimo no deja usar
> variables locales, segun me han contado.

Hace poco se estuvo discutiendo dotar a PL/pgSQL de la posibilidad de
hacer cosas como

RETURN TABLE (SELECT * from bla bla)

que seria mas o menos lo que tu estas pidiendo. No me queda claro si
quedo abierta la posibilidad de que sea en 8.3, o tendra que esperar un
poco mas. Obviamente, mientras eso no suceda no hay ninguna
funcionalidad equivalente. Lo del "FOR LOOP con un RETURN NEXT dentro"
es lo mas cercano que tenemos.

Pero no veo que sea tan complicado ... !

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


From: Daniel Soto <daniel(dot)soto2k(at)gmail(dot)com>
To: Alvaro Herrera <alvherre(at)commandprompt(dot)com>
Cc: Miguel Rodríguez Penabad <penabad(at)gmail(dot)com>, pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: 2 preguntas acerca de fechas
Date: 2007-07-09 11:52:51
Message-ID: [email protected]
Views: Whole Thread | Raw Message | Download mbox | Resend email
Lists: pgsql-es-ayuda

Ahh, comprendo, hubieramos comenzado por ahi, jeje, no sabia que habian
cosas que plpgsql no podia hacer. De todas maneras me parece raro que no
se pueda hacer, si es algo tan... basico podriamos llamarlo.

Si es así buscaré otra solucion.

Un saludo.

Alvaro Herrera escribió:
> Daniel Soto escribió:
>
>> Tambien estoy interesado en como hacer eso, de devolver varios registros
>> con pgplsql. Veran lo que pasa es que me importa mantener la
>> "homogeneidad" de mi sistema, es decir, para funciones que devuelven
>> multiples registros usar sql mientras que para las demas (por ejemplo
>> insercion de registros) usar plpgsql. No lo se, en mi opinion no seria
>> muy complicado tener algunas funciones en un lenguaje y otras con otro?
>> Digo, en otras bases de datos se puede hacer perfectamente sin tanta
>> "complicacion" (bueno, considerando como "complicacion" algo que aun no
>> domino bien, lo admito).
>>
>> El problema es que con funciones en sql no puedo declarar variables
>> locales, y tengo algunos procedimientos que necesito migrar, que tienen
>> un poco de logica dentro, entonces, o uso plpgsql (que lo estoy
>> encontrando mas robusto) o uso sql, pero este ultimo no deja usar
>> variables locales, segun me han contado.
>>
>
> Hace poco se estuvo discutiendo dotar a PL/pgSQL de la posibilidad de
> hacer cosas como
>
> RETURN TABLE (SELECT * from bla bla)
>
> que seria mas o menos lo que tu estas pidiendo. No me queda claro si
> quedo abierta la posibilidad de que sea en 8.3, o tendra que esperar un
> poco mas. Obviamente, mientras eso no suceda no hay ninguna
> funcionalidad equivalente. Lo del "FOR LOOP con un RETURN NEXT dentro"
> es lo mas cercano que tenemos.
>
> Pero no veo que sea tan complicado ... !
>
>


From: "Jaime Casanova" <systemguards(at)gmail(dot)com>
To: "Daniel Soto" <daniel(dot)soto2k(at)gmail(dot)com>
Cc: Miguel Rodríguez Penabad <penabad(at)gmail(dot)com>, pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: 2 preguntas acerca de fechas
Date: 2007-07-11 05:03:24
Message-ID: [email protected]
Views: Whole Thread | Raw Message | Download mbox | Resend email
Lists: pgsql-es-ayuda

On 7/9/07, Daniel Soto <daniel(dot)soto2k(at)gmail(dot)com> wrote:
> Tambien estoy interesado en como hacer eso, de devolver varios registros
> con pgplsql. Veran lo que pasa es que me importa mantener la
> "homogeneidad" de mi sistema, es decir, para funciones que devuelven
> multiples registros usar sql mientras que para las demas (por ejemplo
> insercion de registros) usar plpgsql. No lo se, en mi opinion no seria
> muy complicado tener algunas funciones en un lenguaje y otras con otro?
> Digo, en otras bases de datos se puede hacer perfectamente sin tanta
> "complicacion" (bueno, considerando como "complicacion" algo que aun no
> domino bien, lo admito).
>

y yo quiero usar un destornillador para hacer un hueco en la pared...
si lo piensas, si se puede pero seria mas fácil usar la herramienta
adecuada; a saber, un taladro.

usa el lenguaje que mejor resuelva el problema y no te cierres con
políticas o reglas auto impuestas que te impidan avanzar...

- funciones SQL para consultas e inserciones simples y no tan simple a
veces si usas cosas como CASE, UNION, subqueries y otros...
- plpgsql para consultas e inserciones que requieran cierta lógica y/o
"procesamiento interno"
- pl/r para estadísticas
- pl/perl para... no lo se, no se perl (que verguenza :()

--
Atentamente,
Jaime Casanova

"Programming today is a race between software engineers striving to
build bigger and better idiot-proof programs and the universe trying
to produce bigger and better idiots.
So far, the universe is winning."
Richard Cook