Ver Mensaje Individual
  #2  
Antiguo 06-06-2007
Avatar de xander
xander xander is offline
Miembro
 
Registrado: jul 2006
Posts: 499
Reputación: 20
xander Va por buen camino
En general un Procedimiento almacenado se ve, como algo como esto:

Código SQL [-]
CREATE PROCEDURE CERTIFICADODEUNIDAD (
    UNIDAD INTEGER,
    MES INTEGER,
    ANHO INTEGER)
RETURNS (
    INDRAIZ INTEGER,
    INDICADOR VARCHAR(200),
    RESULTADO VARCHAR(1000),
    LEYENDA VARCHAR(200),
    META VARCHAR(100),
    DIMENSION VARCHAR(200))
AS
DECLARE VARIABLE INDID INTEGER;
DECLARE VARIABLE VMES VARCHAR(15);
DECLARE VARIABLE VMUESTRA INTEGER;
DECLARE VARIABLE VTIPO INTEGER;
DECLARE VARIABLE VFILTRO VARCHAR(200);
DECLARE VARIABLE VLEYENDA VARCHAR(200);
BEGIN
   FOR SELECT IND_ID, IND_NOMBRE, DIM_NOMBRE, IND_TEXTOTITULO
    FROM EST_INIDICADOR
    LEFT JOIN EST_DIMENSION ON (IND_DIMENSION = DIM_ID)
    LEFT JOIN EST_SECUENCIA ON (SEC_INDICADOR = IND_ID)
    WHERE SEC_ANTECESOR = 0
    ORDER BY DIM_NOMBRE, SEC_ORDEN ASC
    INTO :INDRAIZ, :INDICADOR, IMENSION, :LEYENDA DO
    BEGIN
      /*CALCULAMOS PARA EL INDICADOR RAIZ */
      SELECT FIRST 1 MET_VALOR FROM EST_METAS
      WHERE MET_INDICADOR = :INDRAIZ
      ORDER BY MET_FECHAALTA DESC
      INTO :META;
      VFILTRO = 'AND (ENC_UNIDADMEDICA = ' || CAST( UNIDAD AS VARCHAR (10)) ||')';
      EXECUTE PROCEDURE GRAFICA(:INDICADOR, :MES, :ANHO, VFILTRO ,0, 0)
      RETURNING_VALUES :VMES, :RESULTADO, :VMUESTRA, :VTIPO;
      SUSPEND;

      FOR SELECT IND_ID, IND_NOMBRE
       FROM EST_INIDICADOR
       LEFT JOIN EST_SECUENCIA ON (SEC_INDICADOR = IND_ID)
       WHERE SEC_ANTECESOR = :INDRAIZ
       ORDER BY SEC_ORDEN ASC
       INTO :INDID, :INDICADOR DO
       BEGIN
         /*Y CALCULAMOS PARA LOS SUB-INDICADORES */
         SELECT FIRST 1 MET_VALOR FROM EST_METAS
         WHERE MET_INDICADOR = :INDID
         ORDER BY MET_FECHAALTA DESC
         INTO :META;
         VFILTRO ='AND (ENC_UNIDADMEDICA = ' || CAST( UNIDAD AS VARCHAR (10)) ||')';
         EXECUTE PROCEDURE GRAFICA(:INDICADOR, :MES, :ANHO, VFILTRO ,0, 0)
         RETURNING_VALUES :VMES, :RESULTADO, :VMUESTRA, :VTIPO;
         INDICADOR =  '             '|| :INDICADOR;
         SUSPEND;
       END
    END
END^

Es como un pequeño programa que ejecuta sentencias SQL... la ventaja es que se ejecuta dentro de la base de datos así que los datos no viajan del servidor al cliente para efectuarles el tratamiento... sino que se tratan en el servidor y se envía solo los resultados (en el caso que se tengan que devolver resultados).
__________________
"Hey, nena, debe ser genial ser tú y verme a mí mismo..."
Responder Con Cita