![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|||||||
| Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
![]() |
|
|
Herramientas | Buscar en Tema | Desplegado |
|
|
|
#1
|
||||
|
||||
|
¡Hola de nuevo!
Ya me había ido a dormir, pero de pronto, entre el barullo de mis últimos pensamientos del día, reflexioné: ---------------------------------------------------- ¿Por qué será que no se permite parametrizar un First? Ah, pero podría "armar" el First n en el Select que llama al procedimiento (Select First n * From Procedimiento...). Después de todo, un procedimiento almacenado que devuelve un cursor hace un Suspend por cada fila, y si desde afuera le digo "First 10", pues sólo deberá traerme 10 y suspender definitivamente la obtención de las filas restantes. Quizá por eso los creadores de InterBase / Firebird no permiten usar una variable o parámetro para indicar la cantidad en el interior de un procedimiento. Pareciera una forma sutil de decirnos, "¿pa' qué quieres el First parametrizado aquí? Tú pide desde afuera la cantidad que requieras." Aunque esto no suena muy convincente, quizá haya otra razón. Ah, ¿pero qué pasaría si a ese Select exterior le añado una cláusula Order By? Temo que se va a traer todo el cursorote y ya luego tomará los First n del orden indicado, discriminando una gran cantidad de filas que ya se trajo. Eso lo volvería muy lento... ---------------------------------------------------- Entonces recordé que tenía una barra de chocolate con almendras en el congelador y aquello fue la gota que derramó la tentación. Me levanté a la media noche para compartir estas reflexiones con ustedes y de paso hacer algunas pruebas adicionales con IB Expert y Delphi. Los resultados de esas pruebas fueron que: 1. Efectivamente, se puede utilizar First en el Select exterior para evitar el empleo de Execute Statement dentro del procedimiento. 2. Ese First sí puede tener un parámetro. 3. Por alguna razón no se permiten cláusulas First sin un valor literal dentro de procedimientos almacenados y disparadores. 4. Como era de esperarse, una cláusula Order By en el Select que llama al procedimiento hace que se obtengan todas las filas posibles de éste antes de aplicar el First de dicha sentencia Select, lo cual no es óptimo. Conclusión para mi caso: Usaré First parametrizados en los Selects que llaman a los procedimientos. Dentro de éstos aplicaré un Order By acorde a ese First de afuera. En esos Selects exteriores evitaré el uso de Order By; con la ventaja de que, al estar utilizando CDSs (client data sets) conectados a los queries, puedo reordenar las filas en memoria según convenga para cada caso. Esta solución podría ser útil en otros casos; todo depende de la cantidad de registros, los componentes utilizados y de qué tanto queramos variar el orden del cursor. Cita:
Un abrazo chocolatoso. Al González. ![]() |
|
#2
|
||||
|
||||
|
Saludos.
Al González podrias si te es posible subir los select's de pruebas que utilizaste? . Gracias de antemano.
__________________
Gracias, Rolphy Reyes |
|
#3
|
|||
|
|||
|
Bueno, el hecho de usar el FIRST, solo lo considero para obtener estadísticas, no para recuperar filas de las tablas, mi caso es por ejemplo, quiero saber los N números más marcados mas no las primeras N filas, eso no me hace sentido y lo haría con validaciones WHERE, HAVING.
Salud OS.
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney |
|
#4
|
||||
|
||||
|
Tu sentencia esta bien solo le falta unos parentesis
donde: PAGE_NF Numero de registros por pagina PAGE_NRO el numero de pagina este es el codigo q uso, para darte un ejemplo
Agrego: probado en firebird 2.0 y 2.1 beta |
|
#5
|
||||
|
||||
|
Vaya, Vaya, Vaya¡¡¡
![]()
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!" http://www.purodelphi.com/ http://www.nosolodelphi.com/ |
|
#6
|
|||
|
|||
![]() ![]() , Funcionó perfectamente.Muchas gracias ariefez, pues nada, cada día se aprende algo nuevo. Así quedo finalmente mi SP
Solo hago notar que la funcion SUM() requiere de un tipo de dato Numeric, intentaba asignarlo como Integer y me daba un error de casting. Salud OS.
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney |
|
#7
|
||||
|
||||
|
¡Hola a todos!
Cita:
Select que detiene definitivamente el For Select del procedimiento spParte tras obtener las primeras 10 filas construidas por el procedimiento:
Select que, por tener Order By, espera a que se realice todo el For Select del procedimiento spParte, para luego devolver solo 10 de las filas que construyó el procedimiento:
Cita:
![]() Cita:
Cita:
. Me sorprendió de la misma forma y lo mejor de todo es que ¡también funciona en Firebird 1.5! ![]() Gracias por el tip Ariefez, creo que has dado con la mejor solución para los casos planteados. Y además he aprendido aquello del Order By en llamadas a procedimientos. Un primer abrazo. Al González. ![]() |
|
#8
|
||||
|
||||
|
Para eso estamos para compartir lo que sabemos y de pasadita tambien para aprender
... |
![]() |
| Herramientas | Buscar en Tema |
| Desplegado | |
|
|
Temas Similares
|
||||
| Tema | Autor | Foro | Respuestas | Último mensaje |
| problema con la consulta select count() | enecumene | PHP | 5 | 01-02-2007 23:33:24 |
| Problema con consulta not in (select ....) | VRO | Firebird e Interbase | 12 | 03-10-2005 18:54:05 |
| Problema conuna consulta select...not in (select ...) | VRO | Firebird e Interbase | 2 | 11-08-2005 08:56:35 |
| error Select firebird 1.5 | ale21alito | Firebird e Interbase | 2 | 25-04-2005 20:20:03 |
| Duplicidad de lineas en un grid con select contra firebird | saruman91 | Firebird e Interbase | 6 | 29-10-2004 02:41:33 |
|