PDA

Ver la Versión Completa : Procedimiento almacenado con consultas distintas


VRO
04-08-2005, 19:26:01
Hola, haber si vosotros me resolveís esta duda,
seguro que si ya que siempre lo haceis.


Tengo un procedimiento almacenado con varias
consultas independientes, es decir, tengo un bloque
FOR....DO con un begin end; dentro del dicho
begin end + código;., y despues tengo otro bloque FOR DO
, con su correspondiente begin end
y su codigo; y al final de los 2 bloques un suspend.

Lo que pretedo comentaros es que no puedo meter el 2º bloque
dentro del primero, porque son consultas que no estan relacionadas.
Yo pretendo que de una llamada al procedimiento me saque todos los resultados de una y de ptra consulta.

No se si me he explicado con claridad. Os pongo el código a continuacion


SET TERM!!;
CREATE PROCEDURE PLANNING (FI DATE, FF DATE)
RETURNS(COD_R INTEGER,NOMBRE_CLIR VARCHAR(50),
NOMBRE_EMPR VARCHAR(50),FECHAIR DATE,FECHAFR DATE,
FECHA_SUSR DATE,REGIMENR VARCHAR(20),ENTRADA_REGR
VARCHAR(10),ADULTOR INTEGER,NINOR INTEGER,BEBER
INTEGER,COD_HABR INTEGER,ESTADOR VARCHAR(20),
COD_HABE INTEGER,REGIMENE VARCHAR(20),DEPOSITO
INTEGER,FIE DATE,FFE DATE, NOMBRE_CLIE VARCHAR(50)
,NOMBRE_EMPE VARCHAR(50))
AS
DECLARE VARIABLE CLI VARCHAR(50);
DECLARE VARIABLE EMP VARCHAR(50);
DECLARE VARIABLE CLIE VARCHAR(50);
DECLARE VARIABLE EMPE VARCHAR(50);
DECLARE VARIABLE COD_RE INTEGER;
BEGIN

FOR SELECT DISTINCT RESERVA.COD_R,RESERVA.FECHAI,
RESERVA.FECHAF,
RESERVA.FECHA_SUS,REGIMEN.TIPO,RESERVA.ENTRADA_REG,
RESERVA.ADULTO,RESERVA.NINO,RESERVA.BEBE,RESERVA.ESTADO
,HAB_RESERVADA.COD_HAB,RESERVA.DIFMES,
HAB_RESERVADA.HABOBLI
FROM RESERVA,CLIENTE,EMPRESA,REGIMEN,HAB_RESERVADA
WHERE RESERVA.COD_R=HAB_RESERVADA.COD_R
AND RESERVA.COD_REG=REGIMEN.COD_REG
AND ((RESERVA.FECHAI>=:FI) AND (RESERVA.FECHAF<=:FF))
OR ((RESERVA.DIFMES>=:FI) AND (RESERVA.DIFMES<=:FF))
ORDER BY RESERVA.FECHAI,RESERVA.DIFMES ASC INTO :COD_R,:FECHAIR,:FECHAFR,
:FECHA_SUSR,:REGIMENR,
:ENTRADA_REGR,:ADULTOR,:NINOR,:BEBER,
:ESTADOR,:COD_HABR DO
BEGIN
SELECT CLIENTE.NOMBRE
FROM RESERVA, CLIENTE
WHERE CLIENTE.COD_CLI=RESERVA.COD_CLI
AND CLIENTE.LETRA_CLI=RESERVA.LETRA_CLI
AND RESERVA.COD_R=:COD_R
INTO :CLI;
IF (:CLI<>'') THEN
NOMBRE_CLIR=:CLI;
ELSE
NOMBRE_CLIR='';

SELECT EMPRESA.NOMBRE
FROM RESERVA,EMPRESA
WHERE RESERVA.COD_EMP=EMPRESA.COD_EMP
AND EMPRESA.LETRA_EMP=EMPRESA.LETRA_EMP
AND RESERVA.COD_R=:COD_R
INTO :EMP;

IF (:EMP<>'') THEN
NOMBRE_EMPR=:EMP;
ELSE
NOMBRE_EMPR='';

END
FOR SELECT ESTANCIA.COD_HAB,ESTANCIA.FECHAI,
ESTANCIA.FECHAF,
ESTANCIA.DEPOSITO,ESTANCIA.COD_R
FROM ESTANCIA,REGIMEN
WHERE ESTANCIA.COD_REG=REGIMEN.COD_REG
AND ((ESTANCIA.FECHAI>=:FI) AND (ESTANCIA.FECHAF<=:FF))
OR ((ESTANCIA.DIFMES>=:FI) AND (ESTANCIA.DIFMES<=:FF))
ORDER BY ESTANCIA.FECHAI ASC
INTO :COD_HABE,:FIE,:FFE,:DEPOSITO,:REGIMENE,:COD_RE DO
BEGIN
SELECT CLIENTE.NOMBRE
FROM ESTANCIA, CLIENTE
WHERE CLIENTE.COD_CLI=ESTANCIA.COD_CLI
AND ESTANCIA.COD_R=:COD_RE
INTO :CLIE;
IF (:CLIE<>'') THEN
NOMBRE_CLIE=:CLIE;
ELSE
NOMBRE_CLIE='';

SELECT EMPRESA.NOMBRE
FROM ESTANCIA,EMPRESA
WHERE ESTANCIA.COD_EMP=EMPRESA.COD_EMP
AND ESTANCIA.COD_R=:COD_RE
INTO :EMPE;

IF (:EMPE<>'') THEN
NOMBRE_EMPE=:EMPE;
ELSE
NOMBRE_EMPE='';

END
SUSPEND;
END!!
SET TERM;!!


El error que me da cuando ejecuto esto es:SQL error code =-313
"count of column list and variable list do not match"

¿Cual sería la solución?¿Será que no lo puedo hacerlo en un sólo procedimiento?

Por favor espero su respuesta.
Gracias antetodo por su ayuda.

Osorio
05-08-2005, 15:37:29
El inconveniente es que la cantidad de campos seleccionados supera la cantidad de variables.

si miras el primer bloque For SELECT encuentras que estas seleccionando 13 campos y cuando dices INTO solo tienes 10 variales donde almacenar la informacion.

La solucion es tener en la seccion INTO tantas variables como campos seleccionados.

En el siguiente ejemplo selecciona tres campos y los guarda en 3 variables.

FOR SELECT IDEMPLEADO, EMPLEADO, DIRECCION
FROM TBL_EMPLEADOS
WHERE IDEMPLEADO = '50935257'
INTO :CODIGO, :NOMBRE, :DOMICILIO

Espero haberte servido.

Saludos,

VRO
05-08-2005, 16:13:13
Ciertamente he puesto tantos campos que me habís perdido.

Gracias Osorio hallaste mi estupido error.


Thankssssssss