Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   ¿Firebird soporta consultas que devuelven más de un cursor ("record set")? (https://www.clubdelphi.com/foros/showthread.php?t=81376)

cointec 13-11-2012 23:06:26

Cita:

Empezado por poliburro (Mensaje 449389)
Pero eso no es agregar código adicional? Mysql y MsSql por ejemplo tu haces un

Código SQL [-]
 
   Select Campo1,Campo2,..,CampoN
     from tabla 
    where  criterio = ValParam1 or
              criterio = valParam2

y eso obtienes al ejecutr el SP con lo que no requieres de un suspend o fetch etc...

En oracle y Db2 al contrario debes delcarar como un cursor el recordset que deseas dar como salida del SP pero al final con un mero Open CurName obtienes la salida del sp...

Entonces.. déjame ver si entiendo bien, En Firebird debes hacer todo ese código para poder dar salida a un simple resultset en un SP? :eek: :eek:

Hola, creo que uno de las mayores virtudes que creo no tienen otros motores es que se puede tratar un procedimiento almacenado como una tabla virtual y trabajar con ellos conforme si lo fuesen. El ejemplo que se ha puesto es muy simple y habría que ver como se hace un proceso complejo en otros motores para poder valorar si se necesita o no más código.

No es lo mismo devolver un cursor, que el propio procedimiento sea un cursor.

Select *
From procedimiento( :param1, :param2,..., : paramN )

Un procedimiento no se realiza para sustituir un simple select como en el caso que has puesto, su objetivo es realizar un procesamiento más o menos complejo, donde pueden intervenir consultas de varias tablas y operaciones más o menos complejas con los datos obtenidos de ellas, por ejemplo. Una de sus funciones es no es sustituir un simple select. Y el resultado de todo ello es un conjunto de registros que puedes tratar como una tabla.

Quizá podrías mostrar como devolver un recordset con características similares en sqlserver, mysql u oracle para poder comparar realmente si es más o menos complejo, porque no creo que se pueda comparar el select que has puesto como ejemplo con el procedimiento almacenado que se ha escrito.

poliburro 13-11-2012 23:38:30

Cita:

Empezado por cointec (Mensaje 449391)

No es lo mismo devolver un cursor, que el propio procedimiento sea un cursor.

Select *
From procedimiento( :param1, :param2,..., : paramN )

Un procedimiento no se realiza para sustituir un simple select como en el caso que has puesto, su objetivo es realizar un procesamiento más o menos complejo, donde pueden intervenir consultas de varias tablas y operaciones más o menos complejas con los datos obtenidos de ellas, por ejemplo. Una de sus funciones es no es sustituir un simple select. Y el resultado de todo ello es un conjunto de registros que puedes tratar como una tabla.

Quizá podrías mostrar como devolver un recordset con características similares en sqlserver, mysql u oracle para poder comparar realmente si es más o menos complejo, porque no creo que se pueda comparar el select que has puesto como ejemplo con el procedimiento almacenado que se ha escrito.


Claro, un SP contiene dentro de si mucho código PLSQL, pero en el caso que se trata es meramente sobre como devolver un resulset. y si, aunque parezca muy simple, realmente en otros motores de bases de datos devolverlos es muy sencillo... no necesitas tanto trabajo para devolver un simple resultset.

esto

Código SQL [-]
 
Select * 
From procedimiento( :param1, :param2,..., : paramN )

Es exactamente lo mismo que cualquiera de estos:

Código SQL [-]
 
CALL procedimiento( param1, param2,..., : paramN );
 
Exec procedimiento( param1, param2,..., : paramN );

Te devuelven todos un resulset

RONPABLO 13-11-2012 23:56:37

Código SQL [-]
   Select Campo1,Campo2,..,CampoN      from tabla      where  criterio = ValParam1 or               criterio = valParam2

En Sql Server es muy común ver procedimientos con una simple consulta ya que mejoran la velocidad de la consulta (tengo entendido), así pues es más rápido consultar información de una tabla por medio de un procedimiento almacenado que por una consulta directa en un componente similar al TQuery, en firebird por el contrario esto no cambia mucho y no se acostumbra a tener un procedimientos para insertar, otro para modificar y otro para consultar (no por lo menos para hacer estos procesos más rápidos), con firebird se construyen un Dataset muy fácilmente sin la necesidad de consultar una tabla como es el caso del ejemplo que envié en el procedimiento llamado SP_CADENA_A_RECORD, ese procedimiento no consulta sobre ninguna tabla, solo va procesando una cadena y va retornando un DataSet, lo consulto en un IBQuery haciendo un:
Código SQL [-]
 select valor from SP_CADENA_A_RECORD('1,3,4,6,8,12')
Por ejemplo le puedo hacer un join con una tabla

Código SQL [-]
 select valor from SP_CADENA_A_RECORD('1,3,4,6,8,12') as CR inner join MovimientosPorOficina as MPO on CR.Valor = MPO.Idbodige

RONPABLO 14-11-2012 00:06:10

Cita:

Empezado por poliburro (Mensaje 449392)
Claro, un SP contiene dentro de si mucho código PLSQL, pero en el caso que se trata es meramente sobre como devolver un resulset. y si, aunque parezca muy simple, realmente en otros motores de bases de datos devolverlos es muy sencillo... no necesitas tanto trabajo para devolver un simple resultset.

esto

Código SQL [-] Select * From procedimiento( : Param1, : Param2,..., : paramN )


Es exactamente lo mismo que cualquiera de estos:

Código SQL [-] CALL procedimiento( param1, param2,..., : paramN ); Exec procedimiento( param1, param2,..., : paramN );


Te devuelven todos un resulset

No, no lo es, el SP en firebird tiene tratamiento muy similar a una tabla y con él le puedo hacer Joins, o puedo hacer un Insrt into table from select * from SP_proceso_antes_de_insertar cosa que con los CALL "SP" o Exec "SP" no se puede hacer

poliburro 14-11-2012 00:25:51

Cita:

Empezado por RONPABLO (Mensaje 449395)
En Sql Server es muy común ver procedimientos con una simple consulta ya que mejoran la velocidad de la consulta (tengo entendido),

No necesariamente un SP puede tener una consulta... puede contener múltiples consultas al igual que ORACLE, DB2, MYSQL, POSTGRESQL, etc

Sobre el rendimiento de la consulta en un SP, esto aplica para la gran mayoria de motores de bases que cuentan con algo llamado "Execution plan" Acaso firebid no lo tiene? :eek: :eek: :eek: :eek: Cómo hace firebird para decidir la ruta más óptima para ejecutar una sentencia sql?

Cómo hacen ustedes para verificar en Firebrid que no están ejecutando un "Table Scan" al ejecutar una consulta?

¿Firebird es capaz de permitirles decidir como y cuándo usar determinados índices en una tabla?

Cita:

Empezado por RONPABLO (Mensaje 449395)
con firebird se construyen un Dataset muy fácilmente sin la necesidad de consultar una tabla como es el caso del ejemplo que envié en el procedimiento llamado SP_CADENA_A_RECORD,

Pues con Mysql, Oracle, Db2, MsSql hacer eso es aún más sencillo:
Código SQL [-]
select *  from (Select 'Data' As Dummyfield) TableDummyInner join Table      on 1 = 1

Casimiro Notevi 14-11-2012 00:51:11

Amigo Poliburro, ¡¡¡qué manera de desvariar!!!, lo tuyo con firebird es grave :confused:

poliburro 14-11-2012 01:00:07

Cita:

Empezado por Casimiro Notevi (Mensaje 449400)
Amigo Poliburro, ¡¡¡qué manera de desvariar!!!, lo tuyo con firebird es grave :confused:


¿y a que viene eso? :eek: estoy diciendo algo errado? honestamente no conozco suficiente firebird por eso pregunto.

Casimiro Notevi 14-11-2012 01:50:10

Precisamente, amigo, es que me extraña muchísimo tu actitud, cualquier cosa que se comente es suficiente para que digas algo como: "pero firebird no tiene talcosa :eek::eek::eek:", "pero firebird no tiene laotracosa :eek::eek::eek:", etc.

Yo no veo en ningún sitio que se haya dicho nada sobre los planes de ejecución, que por supuesto que tiene, y la interpretación que estás haciendo de los "stored procedure" también le buscas el lado malo: "tanto código hay que escribir para esto o para aquello :eek::eek::eek:".
Cuando realmente es que no lo has entendido, o no se te ha explicado bien.

RONPABLO 14-11-2012 03:08:25

Cita:

Empezado por poliburro (Mensaje 449398)
No necesariamente un SP puede tener una consulta... puede contener múltiples consultas al igual que ORACLE, DB2, MYSQL, POSTGRESQL, etc

Firebird también puede tener varias consultas.


Cita:

Empezado por poliburro (Mensaje 449398)
Sobre el rendimiento de la consulta en un SP, esto aplica para la gran mayoria de motores de bases que cuentan con algo llamado "Execution plan" Acaso firebid no lo tiene? :eek: :eek: :eek: :eek: Cómo hace firebird para decidir la ruta más óptima para ejecutar una sentencia sql?

Ejecutando el plan, pero lo puedo hacer directamente desde la consulta sin pasar por un SP, aun así en el SP también puedo ejecutar el plan, tiene herramientas para analizar el rendimiento al ejecutar con un plan o con el otro

Cita:

Empezado por poliburro (Mensaje 449398)
Cómo hacen ustedes para verificar en Firebrid que no están ejecutando un "Table Scan" al ejecutar una consulta?

hay herramientas de estadística que nos muestra si una consulta está o no usando indice, los tiempos que se demoran al hacer una consulta, cual es el plan usado, etc

Cita:

Empezado por poliburro (Mensaje 449398)
¿Firebird es capaz de permitirles decidir como y cuándo usar determinados índices en una tabla?

Sí.

Cita:

Empezado por poliburro (Mensaje 449398)
Pues con Mysql, Oracle, Db2, MsSql hacer eso es aún más sencillo:

Código SQL [-]

select * from (Select 'Data' As Dummyfield) TableDummyInner join Table on 1 = 1

No es lo mismo, estoy hablando que en Firebird se puede hacer uniones, consultas y subconsultas a un procedimiento almacenado (se puede tomar como si fuera un view de SQL Server pero con la potencia que da los procedimientos almacenados), cosa que no se puede hacer en SQL Server, ahora, no entiendo que resultado traerá el ejemplo que pones en tu ejemplo, para ser más claro en el procedimiento almacenado que puse de ejemplo al hacer una consulta como:

Código SQL [-]
select valor from SP_CADENA_A_RECORD('1,3,4,6,8,12')


el resultado va ser un DataSet:


Cita:


Valor
1
3
4
6
8
12
Al cual le puedo hacer una subconsulta, o hacer join, o lo puedo llamar en otro Procedimiento almacenado:


Código SQL [-]
   for select valor from SP_CADENA_A_RECORD('1,3,4,6,8,12') order valor into :Valor do
   begin
      for Select c.Nombre, c.Encargado, CXC.Fecha, CXC.Cupos 
      from Ciudades c 
      inner Join CalendarioXCiudad CXC on c.Id = CXC.IdCIudad
      where C.Id = :Valor into :Ciudad, :Encargado, :FechaEvento, :Cupos do
      begin
         suspend;
      end
   end

mightydragonlor 14-11-2012 03:47:48

Bueno, este documento explica un poco sobre los procedimientos almacenados, es viejo y trata de Interbase, pero para este caso, acplica, este otro es algo mas actual y muestra mas cosas.

Saludos.

poliburro 14-11-2012 04:18:32

Cita:

Empezado por Casimiro Notevi (Mensaje 449403)
Precisamente, amigo, es que me extraña muchísimo tu actitud, cualquier cosa que se comente es suficiente para que digas algo como: "pero firebird no tiene talcosa :eek::eek::eek:", "pero firebird no tiene laotracosa ", etc.

Cita:

Empezado por Casimiro Notevi (Mensaje 449403)
Precisamente, amigo, es que me extraña muchísimo tu actitud, cualquier cosa que se comente es suficiente para que digas algo como: "pero firebird no tiene talcosa ", "pero firebird no tiene laotracosa ", etc.

Pues creo que no me estas leyendo correctamente amigo mio... Acaso no ves el signo "?" al final de mis oraciones?

Es una pregunta la que hago. Acaso preguntar algo es un desvario? :eek: :eek: :eek:

Cita:

Empezado por poliburro
En Firebird debes hacer todo ese código para poder dar salida a un simple resultset en un SP?


cointec 14-11-2012 08:18:17

Hola poliburro, lo que no entiendo es la frase "tienes que hacer todo ese código para devolver un resulset", cuando lo único que se tiene que escribir en el cuerpo del procedimiento almacenado si deseas devolverlo como resultset es "suspend"

El resto de código es común y la lógica será la misma que en cualquier motor.

Por otro lado, cuando te pedía el ejemplo no era en la llamada al procedimiento, sino en que escribieses el cuerpo del procedimiento en sqlserver, mysql, etc. para poder comprobar a lo que te referias con "todo ese código".

Imagino que en los motores que comentas, tendrás que declarar la estructura del resultset, con campos y tipos, que es equivalente a los parámetros de retorno del procedimiento almacenado. Dentro del procedimiento, tendrás que introducir los datos en variables e insertarlos en el resultset, para poder posteriormente devolverlos y por último devolver una referencia al resultset. Desde tu aplicación cliente tendrás una llamada al procedimiento almacenado y posteriormente otra llamada para obtener los datos insertados en el resultset.

En firebird, la sencillez es que la llamada al procedimiento ya es un resultset. Quizá con ejemplos sería mejor, por lo que sí nos pones algún ejemplo en otros motores, te podríamos mostrar su traducción a firebird y podríamos comparar cosas y no utilizar frases genéricas que creo no tienen sentido.

Al González 14-11-2012 09:06:09

Me parece que Casimiro ha detectado el tono con el que haces esas preguntas, Edgar, que no es precisamente el de alguien que espera recibir una respuesta didáctica y amable. Dices que no conoces lo suficientemente Firebird, pero recalcas las limitaciones que a tu juicio tiene. Respondes con efugios a algunas de las observaciones que de buena fe te hacen algunos de los compañeros en un intento por hacerte entrar en razón, para luego hacer comparaciones tendenciosas.

A los que hemos seguido este hilo ya nos quedó claro que guardas una especie de inquina hacia Firebird. Yo desconocía esto de ti (o mi memoria es mala), y de haberlo sabido antes no hubiera puesto en el mismo mensaje la pregunta inicial y la referencia a tu artículo. Ahora, en lo personal creo que las consultas de múltiples cursores es algo que Firebird debiera tener.

Algo ha de rescatarse de este mal devenido debate.

Saludos.

mightydragonlor 14-11-2012 16:05:06

Cita:

Empezado por cointec (Mensaje 449414)
Hola poliburro, lo que no entiendo es la frase "tienes que hacer todo ese código para devolver un resulset", cuando lo único que se tiene que escribir en el cuerpo del procedimiento almacenado si deseas devolverlo como resultset es "suspend"

El resto de código es común y la lógica será la misma que en cualquier motor.

Por otro lado, cuando te pedía el ejemplo no era en la llamada al procedimiento, sino en que escribieses el cuerpo del procedimiento en sqlserver, mysql, etc. para poder comprobar a lo que te referias con "todo ese código".

Imagino que en los motores que comentas, tendrás que declarar la estructura del resultset, con campos y tipos, que es equivalente a los parámetros de retorno del procedimiento almacenado. Dentro del procedimiento, tendrás que introducir los datos en variables e insertarlos en el resultset, para poder posteriormente devolverlos y por último devolver una referencia al resultset. Desde tu aplicación cliente tendrás una llamada al procedimiento almacenado y posteriormente otra llamada para obtener los datos insertados en el resultset.

En firebird, la sencillez es que la llamada al procedimiento ya es un resultset. Quizá con ejemplos sería mejor, por lo que sí nos pones algún ejemplo en otros motores, te podríamos mostrar su traducción a firebird y podríamos comparar cosas y no utilizar frases genéricas que creo no tienen sentido.

En MsSql no necesitas declarar los resulsets de salida, sólo con que tengas varios Select * from tabla serán retornados sin problemas, para el caso de oracle se declaran cursores de salida, y los llenas con sus respectivos Select, cada uno deberá ser declarado para que pueda ser retornado, para el caso del actual firebird sólo devuelve un resulset con un select y un suspend, en Oracle es casi igual ya que sólo se devuelve por cada cursor que se llena, pero en MsSQL la cosa cambia, ya que no puedes usar los Select "libremente" hay que tener cuidado de no devolver lo que no se desea, pero para este caso se usa IF EXISTS(SELECT * FROM TABLA) o también puedes usar un SET @Variable = (SELECT * FROM TABLA) y con esto se evitar devilver lo que no se requiere.
PD: Si no estoy mal, para la versión 3 de Firebird que no está lejos de salir, se va a soportar la salida de varios cursores o resulsets en un procedimiento almacenado y en execute block, creo que también en funciones.

Saludos.

roman 14-11-2012 16:11:18

Cita:

Empezado por Al González (Mensaje 449416)
Algo ha de rescatarse de este mal devenido debate.

A lo que yo he contribuido. Lo lamento. :(

--------

Aunque no es exactamente pra rescatar el debate, pues más bien es una duda, me gustaría, Al, leer tu opinión de porqué es buena esta característica de los múltiples result sets.

El ejemplo de poliburro no me aclara pues, a mi juicio, es algo que puede lograrse con enlaces entre tablas para recabar la información deseada. ¿Tendrías alguna situación en mente en la qué aplicar dicha técnica?

// Saludos

poliburro 14-11-2012 16:27:02

Cita:

Empezado por Al González (Mensaje 449416)

A los que hemos seguido este hilo ya nos quedó claro que guardas una especie de inquina hacia Firebird. Yo desconocía esto de ti (o mi memoria es mala), y de haberlo sabido antes no hubiera puesto en el mismo mensaje la pregunta inicial y la referencia a tu artículo. Ahora, en lo personal creo que las consultas de múltiples cursores es algo que Firebird debiera tener.

1.- Por allí anda un botón que se llama editar amigo.. :) puedes eliminar la referencia a mi artículo cuándo lo consideres correcto y de esa manera evitarte lamentaciones.

2- No tengo ningún tipo de "inquina" contra firebird. No aprecio a ese motor de base de datos y tampoco soy muy dado a elegirlo para mis proyectos. Pero si fuera contratado para trabajar en él lo haría sin ningún problema.

3- He visto aquí a muchos vosciferar contra Windows, .Net, Vb, Sql Server, la iglesia, el anticristo, etc etc y no ha habido ningún problema en ello. ¿Por qué se considera tan "mala" mi "inquina" contra Firebird?

Casimiro Notevi 14-11-2012 16:43:18

Cita:

Empezado por poliburro
Nunca he logrado entender pro que les es tan dificil reconocer que firebird no es un buen motor por el contrario es un motor medianon que puede ser una buena alternativa para desarrollos pequeños pero comparado con el trabajo que hacen verdaderos motores de bases de datos su rendimiento es más bien mediocre.

Enlace
Incluso lo equiparas a paradox, access y dbase :confused:
Cita:

Empezado por poliburro
Adolecer de estas características no la hacen un mal motor, al contrario sigue siendo una excelente opción para nuestros desarrollos, tanto como lo es access o paradox o dbase. Pero aceptando que tiene limitantes no deberia compararse con los grandes. (Oracle, Postgress, MsSql,Db2, Informix)

Enlace

En fin, no vale la pena, está bien que creas lo que quieras creer, amigo poliburro, pero no nos cuentes "cosas" que no son, porque las palabras se las lleva el viento, pero lo escrito... escrito está.

poliburro 14-11-2012 16:49:31

Cita:

Empezado por Casimiro Notevi (Mensaje 449450)
Enlace
Incluso lo equiparas a paradox, access y dbase :confused:

Enlace

En fin, no vale la pena, está bien que creas lo que quieras creer, amigo poliburro, pero no nos cuentes "cosas" que no son, porque las palabras se las lleva el viento, pero lo escrito... escrito está.

¿Cosas que no son? ¿Cuándo he dicho que me gusta? al contrario desde el inicio de este hilo dije "si no lo sporta se agrega a la larga lista de cosas que no soporta". y lo acabo de decir hace un momento. Firebird no me gusta Por que se toman tan a personal una crítica a firebird? por qué les cuesta tanto aceptar las críticas contra ese motor? deberían ser tan faciles de aceptar como las que hacen contra otras tecnologias....

mightydragonlor 14-11-2012 16:59:45

Cita:

Empezado por poliburro (Mensaje 449453)
¿Cosas que no son? ¿Cuándo he dicho que me gusta? al contrario desde el inicio de este hilo dije "si no lo sporta se agrega a la larga lista de cosas que no soporta". y lo acabo de decir hace un momento. Firebird no me gusta Por que se toman tan a personal una crítica a firebird? por qué les cuesta tanto aceptar las críticas contra ese motor? deberían ser tan faciles de aceptar como las que hacen contra otras tecnologias....

Creo que mas que las críticas que haces al Firebird es la forma que tomas todo, como las preguntas que hiciste repecto a los procedimientos, sacando conclusiones que no son lógicas, en forma de pregunta reitero, algo como entonces no tiene plan de ejecución? y cosas por el estilo.

Si bien Firebird carece de ciertas caracteristicas, como este caso, multiples resulsets, no quiere decir que estos no se puedan solventar de diferentes formas, varios procedimientos almacenados para este caso, soporte XML, hay varias UDF´s que hacen esto, lo mismo para búsqueda de texto completo, que de hecho no son soportadas directamente en la Api de MySQL, si no que son plugins adicionales que aunque ya vengan con la instalación, vienen a ser lo mismo que las UDF's de Firebird, y así varias características que pueden ser solventadas facilmente por programación, es mas sé de varias funciones que añaden soporte XML a Firebird, sin pasar por una UDF.

Saludos.

RONPABLO 14-11-2012 17:02:51

Cita:

Empezado por poliburro (Mensaje 449447)
3- He visto aquí a muchos vosciferar contra .Net, Vb, Sql Server, la iglesia, el anticristo, etc etc y no ha habido ningún problema en ello. ¿Por qué se considera tan "mala" mi "inquina" contra Firebird?


Para mi es normal, todos en la vida tenemos cosas que no nos gustan, aun así Firebird hace cosas que SQL Server no hace, como hay cosas que Firebird no hace, ¿es normal no?.


Cita:

Empezado por roman
El ejemplo de poliburro no me aclara pues, a mi juicio, es algo que puede lograrse con enlaces entre tablas para recabar la información deseada. ¿Tendrías alguna situación en mente en la qué aplicar dicha técnica?

Imagina que en un llamado a un procedimiento se trae 3 DataSets, uno es encuestas, el segundo es preguntas de la encuesta y el tercer DataSet trae las respuestas dadas a cada pregunta, se trae únicamente los datos que se van a usar para no sobrecargar la conexión a red, estos DataSet en .Net se pueden tomar como tablas en memoria y hacer una especie de maestro detalle donde al seleccionar en un grid una de las encuestas me muestre en otro las preguntas ofrecidas y el total de respuestas por preguntas en otro grid,


La franja horaria es GMT +2. Ahora son las 11:04:35.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi