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
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
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).