Ver Mensaje Individual
  #4  
Antiguo 05-05-2005
lbuelvas lbuelvas is offline
Miembro
 
Registrado: may 2003
Ubicación: Colombia
Posts: 377
Reputación: 22
lbuelvas Va por buen camino
Hola foro,

Como me gustan los procedimientos almacenados !.

Me puse en la tarea de hacer un ejercicio completo, espero te sea de utilidad y puedes implementar la idea para tu aplicacion facilmente. El ejemplo esta en Firebird, implementable en Oracle y SQL-Server. No se si se puede hacer con mySQL.

La restriccion UK_CONDICIONES es para evitar que coloques mas de una vez la misma condicion de busqueda.

Se puede definir la tabla condiciones sin el campo id como identificador, si se desea que todas las condiciones en la tabla pasen al procedimiento almacenado. La ventaja con el identificador es que se puede jugar a rangos de condiciones.

Tablas:

CREATE TABLE DATOS (
CAMPO_1 INTEGER NOT NULL,
CAMPO_2 INTEGER NOT NULL,
CAMPO_3 VARCHAR(10) NOT NULL
);

CREATE TABLE CONDICIONES (
ID SMALLINT NOT NULL,
CAMPO_1 INTEGER NOT NULL,
CAMPO_2 INTEGER NOT NULL
);


Restricciones:
ALTER TABLE DATOS ADD CONSTRAINT PK_DATOS PRIMARY KEY (CAMPO_1, CAMPO_2);
ALTER TABLE CONDICIONES ADD CONSTRAINT PK_CONDICIONES PRIMARY KEY (ID);
ALTER TABLE CONDICIONES ADD CONSTRAINT UK_CONDICIONES UNIQUE (CAMPO_1, CAMPO_2);


Datos:
INSERT INTO DATOS (CAMPO_1, CAMPO_2, CAMPO_3) VALUES (1, 2, 'A');
INSERT INTO DATOS (CAMPO_1, CAMPO_2, CAMPO_3) VALUES (5, 7, 'B');
INSERT INTO DATOS (CAMPO_1, CAMPO_2, CAMPO_3) VALUES (10, 20, 'C');
INSERT INTO DATOS (CAMPO_1, CAMPO_2, CAMPO_3) VALUES (10, 7, 'D');
INSERT INTO DATOS (CAMPO_1, CAMPO_2, CAMPO_3) VALUES (10, 1, 'E');
INSERT INTO DATOS (CAMPO_1, CAMPO_2, CAMPO_3) VALUES (5, 1, 'F');
COMMIT WORK;

INSERT INTO CONDICIONES (ID, CAMPO_1, CAMPO_2) VALUES (1, 1, 2);
INSERT INTO CONDICIONES (ID, CAMPO_1, CAMPO_2) VALUES (2, 5, 7);
INSERT INTO CONDICIONES (ID, CAMPO_1, CAMPO_2) VALUES (3, 10, 20);
COMMIT WORK;

El procedimiento:

SET TERM ^ ;

ALTER PROCEDURE SP_SI_ES_POSIBLE (
CONDICION_INICIAL INTEGER,
CONDICION_FINAL INTEGER)
RETURNS (
CAMPO_1 INTEGER,
CAMPO_2 INTEGER,
CAMPO_3 VARCHAR(10))
AS
begin
/* Selecciona el rango de condiciones */
for select campo_1,
campo_2
from condiciones
where id between :condicion_inicial and :condicion_final
into :campo_1,
:campo_2
do begin
/* Busca los registros que cumplan la condicion */
for select campo_3
from datos
where campo_1 = :campo_1
and campo_2 = :campo_2
into campo_3
do begin
suspend;
end
end
end
^

SET TERM ; ^

Como serian las consultas:
Para una condicion (no tendria mucho sentido):
select *
from sp_si_es_posible (2,2);

Todas las condiciones (para tan pocas condiciones es mejor la opcion que colocaste en el foro) :
select *
from sp_si_es_posible (1,3);

Para muchas condiciones (si se te simplificaria el trabajo !!!) :
select *
from sp_si_es_posible (1,50);

Lo anterior suponiendo que tienes 50 condiciones por las cuales buscar.

Muchos exitos.
__________________
Luis Fernando Buelvas T.
Responder Con Cita