Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 20-07-2004
Avatar de Tino
Tino Tino is offline
Miembro
 
Registrado: may 2004
Posts: 40
Poder: 0
Tino Va por buen camino
Evaluar condiciones con Oracle PL/SQL

Tengo la tarea de evaluar una condición lógica del tipo:

Código:
('PLATÓN'='FILÓSOFO') OR (3 <> 5) AND NOT (2/3/2004 < 1/1/2005) ...
Para ello, he escrito la sig. rútina:

Código SQL [-]
FUNCTION Fu_Evalua_Condicion(p_condicion IN VARCHAR2) RETURN BOOLEAN IS
-- Evalua la condición pasada como parámetro
   vSQL VARCHAR2(300);
   vDummy VARCHAR2(1);
BEGIN 
   vSQL := 'SELECT ''X'' FROM DUAL WHERE ' || p_condicion;
   BEGIN 
     EXECUTE IMMEDIATE vSQL INTO vDummy;
     If vDummy = 'X' Then
        RETURN TRUE;
     Else
        RETURN FALSE;
     End If;
   EXCEPTION
     WHEN OTHERS THEN RETURN FALSE;
   END;   
END Fu_Evalua_Condicion;


¿Cabe una mejor solución? El rendimiento es crítico porque esta rútina será llamada muchas veces, pero no se me ocurre otra manera.

Agradezco de antemano cualquier comentario que hagaís.
Responder Con Cita
  #2  
Antiguo 20-07-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Queres saber si la condición es válida, o si es verdadera?

Que tanto son muchas veces?

Cuantas condiciones diferentes vas a evaluar de esta forma?

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #3  
Antiguo 20-07-2004
Avatar de Tino
Tino Tino is offline
Miembro
 
Registrado: may 2004
Posts: 40
Poder: 0
Tino Va por buen camino
Evaluar condiciones con Oracle PL/SQL

La condición debe ser válida aunque pudiera no serlo. Si la condición no es válida se evaluará como falsa.

A esta función se le llama por cada registro leído de la tabla principal, o sea, un montón de veces.

La condición a evaluar puede ser cualquiera que se pueda poner en la parte WHERE de una consulta SQL.

Saludos.
Responder Con Cita
  #4  
Antiguo 20-07-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
No me imagino como para que necesitas esto... pero el método concebido es bastante ingenioso y funcional, aunque ciertamente no es óptimo.

Si las condiciones no son muy variadas... sería mucho mejor trabajar con consultas parámetrizadas, de manera que se pueda aprovechar el cache y no obligar a reanalizar la consulta cada vez que se envía.

Dependiendo de la versión de Oracle que uses, puede ser aconsejable también no usar la tabla dual para hacer la consulta.. pues es bastante ineficiente, ya que por alguna razón el motor no la mantiene en memoria y obliga a dos acceso al disco por cada consulta. Es mejor crear tu propia tabla (xDual) que tenga un solo registro (podes garantizarlo con la PK) y basarte en esta, que si se mantendrá en cache para hacer las consultas.

Con esas dos mejoras... será mucho mas eficiente.

Hasta luego.

Responder Con Cita
  #5  
Antiguo 20-07-2004
Avatar de Tino
Tino Tino is offline
Miembro
 
Registrado: may 2004
Posts: 40
Poder: 0
Tino Va por buen camino
De verdad, gracias jachguate por tus consejos, aunque creo que no podré aplicarlos porque la condición a evaluar (que puede ser múltiple) no veo la manera de parametrizarla. Es demasiado variable, y no sabríamos ni siquiera el nro. de parámetros a usar. Necesitaria preprocesar la condición para saber el nro. (y tipo) de los parámetros y eso no resultaría eficiente.

Apuntaré tu comentario sobre la shared pool acerca de la tabla dual. De todos modos crear una tabla unicamente para este propósito... no sé. Supongo que haré pruebas, como siempre, antes de decidirme. No estoy seguro tampoco de que de esta manera aproveche la cache pues tengo entendido de que la optimización se consigue cuando la consulta a analizar por el motor es identica a la almacenada en la cache y dada la disparidad de consultas SQL que va a lanzar mi rútina no creo que se logre aprovechar en alguna manera de la cache. Por tus comentarios y por los de delphi.com.ar (en otro hilo) he aprendido que el uso de parámetros facilita la entrada de la consulta en la caché , algo que no sabía y que puede serme muy útil. Si sabeís de algo sobre la shared pool adicional os agradecería que lo comentaraís.

¿El motivo de esta rútina? Por si tienes curiosidad: imagina una relación maestro detalle con dos tablas 1:N. Bien, necesitamos recuperar por cada registro de la tabla maestra un único (o ninguno, pero no más) registro de la tabla detalle. Y este único registro es el único cuya condición (que se guarda en un campo) se cumple. Necesitamos un cursor que recorre los registros de la tabla detalle y que vaya evaluando sus condiciones hasta encontrar el que se cumple.

Saludos y gracias por la ayuda.
Responder Con Cita
  #6  
Antiguo 20-07-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Cool

Cita:
Empezado por Tino
Apuntaré tu comentario sobre la shared pool acerca de la tabla dual. De todos modos crear una tabla unicamente para este propósito... no sé. Supongo que haré pruebas, como siempre, antes de decidirme. No estoy seguro tampoco de que de esta manera aproveche la cache pues tengo entendido de que la optimización se consigue cuando la consulta a analizar por el motor es identica a la almacenada
En este caso no me referia a la shared pool, sino a la Database Buffer Cache, también del SGA, que es el otro punto a optimizar, y que la tabla DUAL no aprovecha (según leí en algun artículo que busque pero no logré encontrar).

Cita:
Empezado por Tino
Si sabeís de algo sobre la shared pool adicional os agradecería que lo comentaraís.
Te recomiendo la lectura del capítulo 1 (Introduction to the Oracle Server) del manual Database Concepts de tu versión. También una lectura al Administrator's Guide y Performance Tuning Guide and Reference no te vendria nada mal.

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 14:23:25.


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
Copyright 1996-2007 Club Delphi