PDA

Ver la Versión Completa : Procedure con cursor


Angel Vicente
13-09-2010, 10:36:55
Hola a todos...

Estoy tratando de crear un procediemiento almacenado en firebird 2.1.3, con un cursor. Lo que quiero hacer es un cursor de una SELECT con varios campos de una tabla, y con campos con alias, para procesamientos posteriores (el contenido de estos campos no son calculos directos de los campos existentes). Para las primeras pruebas esto haciendo un procediemiento como el siguiente

DECLARE VARIABLE LISTA CURSOR FOR (
SELECT Historico.CAJA, HISTORICO.MAQUINA, 0 AS Calculo from historico where historico.fechahora BETWEEN '08/02/2010 00:00:00' AND '08/02/2010 23:59:59');
BEGIN
/* Procedure body */
SALIDA = 1;
OPEN Lista;
SUSPEND;
END

pero cuando lo ejecuto, no parece que se abra el cursor; SALIDA es una variable integer de retorno. Haciendo algo parecido en DB2, que es lo que mas conozco, obtengo el resultado de la SELECT del cursor.

La sentencia SELECT en cuestion devuelve registros, si la ejecuto directamente puedo ver los resultados.

¿Que es lo que hago mal?, o ¿que es lo que no estoy haciendo?

Saludos y gracias de antemano

Casimiro Notevi
13-09-2010, 11:27:29
Hola, ¿esa sintaxis es de db2?, no entiendo realmente lo que quieres, pero si es un simple select, entonces crea un procedimiento almacenado "normal":


CREATE PROCEDURE PROCPEDIDOSVENTASCLI ( CODCLIENTE Integer )
RETURNS (
CODPEDIDO Integer,
FECHA Timestamp,
CABPEDIDO Varchar(15),
etc... )
AS
begin
for
select Codigo, Fecha, SerieNumero, etc...
from tbLineasVentas
where TipoDocumento=2
and Cliente=:codCliente
order by Fecha desc
into :CodPedido, :Fecha, :CabPedido, etc...
do begin
/* esto es sólo un ejemplo, aquí haces lo que necesites */
suspend;
end
end

Angel Vicente
13-09-2010, 11:44:30
Hola...

No, no es la sintaxis de DB2, es lo que estoy tratando de hacer: como soy un poco novato con Firebird, en un primer momento quiero hacer una select (desde dentro de un procedimiento almacenado), que me devuelva todos los registros que cumplan los criterios; un poco a modo de prueba.

Despues lo que necesito es tambien, todo el contenido de una SELECT con varios campos calculados como alias ademas de los campos de la tabla, pero estos calculos no son "directos", se calcularian a partir de un campo de la SELECT, pero dependieno del contenido de otro campo que no entra en el calculo; por lo que he leido tendria que recorrer toda la SELECT utilizando FOR SELECT; no se si he explicado bien lo que quiero hacer.

Lo que no veo, al menos de una forma clara es la posibilidad de mostrar/devolver todos los registros de la SELECT, me gustaria ir comprobando los procesamientos que hago.

Saludos y gracias

Casimiro Notevi
13-09-2010, 11:47:33
Explica entonces exactamente qué quiéres hacer, qué campos tienes, qué resultado esperas obtener, etc.

Angel Vicente
13-09-2010, 13:38:03
Creo que lo he entendido, al menos funciona como deseaba: tengo que declarar en la parte de RETURNS tantas variables como campos del SELECT (por supuesto con sus tipos correspondientes), y despues en el FOR SELECT rellenarlas con INTO :variable y asi obtengo un Recordset con un registro por cada lectura en FOR SELECT.

En DB2 de iSeries es diferente, directamente declaras un cursor, lo abres y ya tienes los registros.

Muchas gracias, de momento ya no tengo la sensacion de haberme atorado.

Saludos