PDA

Ver la Versión Completa : Procedimiento Almacenado Devolver una Select


granchop
03-01-2005, 13:19:01
Hola me gustaria saber si es posible mostrar un conjunto de resultados desde un prodedimiento almacenado en firebird o Interbase de la misma forma que lo hace sql Server.

Ejemplo Sql server:

Create Procedure Prueba ( @p1 smallint)
as

select * from T1 where c1 = @p1

Esto me devolveria todos los campos de T1 donde c1 sea igual a la variable
pero en Interbase o Firebird no se como se podria hacer

Grancias

Héctor Randolph
04-01-2005, 08:13:09
Hola granchop!

Aquí tienes un ejemplo de un procedimiento almacenado en FireBird que se comporta como un SELECT


SET TERM !!;

CREATE PROCEDURE prueba( p1 SMALLINT)
RETURNS (
campo1 SMALLINT,/*En la cláusula RETURNS se especifican las columnas que devolverá la consulta*/
campo2 NUMERIC(15,2),
.
.
.
campoN VARCHAR(15))
AS
BEGIN
FOR SELECT /*La cláusula FOR SELECT permite que el procedimiento se comporte como un SELECT*/
c1,
c2,
.
.
.
cN
FROM T1
WHERE c1=:p1
INTO /*Coloca los resultados obtenidos con SELECT dentro de las variables declaradas con RETURNS */
:campo1,
:campo2,
.
.
.
:campoN
DO
SUSPEND;/*Detiene la ejecución del procedimiento para mostrar el resultado parcial*/
END!!

SET TERM ;!!



Después solamente hay que llamar al procedimiento de la siguiente manera:


SELECT * FROM prueba(10)


Espero que te sea útil

granchop
04-01-2005, 09:12:32
Gracias lo probe y me resulto es un poco mas incomodo puesto que tienes que declarar todos los datos que vas a devolver. Aprovecho para realizar otra preguntita ya que estoy iniciandome en Firebird e Interbase cuando hago la llamada al procedimiento almacenado se puede utilizar
SELECT * FROM PROCEDIMIENTO(Valor1,Valor2) o
EXCUTE PROCEDURE PROCEDIMIENTO(Valor1,Valor2)
mi cuestion es que cando trabajo con dos variables llamese Var1 y Var2 hasta donde e podido averiguar hay que seguir el orden de como las declaraste no como en Sql Server que puedo hacer lo siguiente
EXEC PROCEDIMIENTO @Variable2 = Valor2,@Variable1 = Valor1
es decir como puedo especificar a que variable doy el valor no tengo que seguir el orden y me resulta mucho mas comodo y hay va la pregunta.
¿es posible en Intebase o Firebird hacer esto?

Gracias por la colaboracion con este pobre Novato

Héctor Randolph
04-01-2005, 09:55:45
es un poco mas incomodo puesto que tienes que declarar todos los datos que vas a devolver.

Hola granchop!

Tienes razón es un poco más latoso, pero la ventaja de esta estructura es que te ofrece más posibilidades ya que tienes más control sobre los datos que devuelves, por ejemplo puedes declarar variables, después moficarlas dentro del procedimiento y devolverlas como una nueva columna en la consulta, mezclar datos procedentes de otras tablas, calcular valores en funciones definidas por el usuario en librerías externas, entre otras cosas.

cuando hago la llamada al procedimiento almacenado se puede utilizar
SELECT * FROM PROCEDIMIENTO(Valor1,Valor2) o
EXCUTE PROCEDURE PROCEDIMIENTO(Valor1,Valor2)

Si utilizas EXCUTE PROCEDURE PROCEDIMIENTO(Valor1,Valor2) entonces el procedimiento no devolverá toda la consulta, es decir, al encontrar la cláusula SUSPEND entonces se da por terminado y solamente mostrará el primer renglón.

Llamar a un procedimiento por medio de EXECUTE solamente se utiliza cuando el procedimiento devuelve un valor o ninguno y en este caso no es necesario utilizar SUSPEND ni la cláusula FOR SELECT.

mi cuestion es que cando trabajo con dos variables llamese Var1 y Var2 hasta donde e podido averiguar hay que seguir el orden de como las declaraste no como en Sql Server que puedo hacer lo siguiente
EXEC PROCEDIMIENTO @Variable2 = Valor2,@Variable1 = Valor1
es decir como puedo especificar a que variable doy el valor no tengo que seguir el orden y me resulta mucho mas comodo y hay va la pregunta.
¿es posible en Intebase o Firebird hacer esto?

Bueno, hasta el momento yo siempre he enviado los parámetros siguiendo el orden en el que fueron declarados en el procedimiento, me parece que FireBird no tiene la flexibilidad que tu comentas.

Un saludo.

granchop
04-01-2005, 10:18:07
Gracias Duda aclarada por lo que he trabajado con Sql Server me parace mas completo porque a lo que me comentabas en Sql puedo hacer

SET @VARIABLE = @VARIABLE + 1
SELECT @VARIABLE NOMBRE_CAMPO FROM T1

y trabajar con esa variable, las desventajas que le encuentro a Sql Server son su alto coste en la Version Comericial, junto con las restricciones de la version libre(MSDE) y claro esta que Sql Server no es multiplataforma.

En fin creo que me quedo con Firebird para aplicaciones mas o menos MEDIAS en cuanto a carga de Datos. Pero me sigue gustando mas SQL Server a ver si en proximas versiones de Firebir e Interbase se van arreglando estos problemillas.

Gracias por toda la ayuda prestada :)

sakuragi
14-09-2006, 09:57:03
Hola que tal.

CREATE PROCEDURE prueba( p1 SMALLINT)
RETURNS (
campo1 SMALLINT,/*En la cláusula RETURNS se especifican las columnas que devolverá la consulta*/
campo2 NUMERIC(15,2),
.
.
.
campoN VARCHAR(15)) Como se espesifica, declarar las columnas con su tipo de dato, ahora se puede ese tipo de dato poner un dominio?

ya que hice una prueba pero por tipo de dato le puse un dominio que deve ser lo mismo no?

o ahi algo diferente en la declaracion?

saludos

gracias