Hola Paoti
Primero que nada te diré que en Firebird/Interbase existen dos tipos de procedimientos:
- Procedimientos ejecutables .- Son llamados directamente por una aplicación mediante la sentencia EXECUTE PROCEDURE. Pueden ser utilizados para realizar una serie de tareas.
- Procedimientos select .- Pueden ser tratados de forma similar a una tabla o vista en una sentencia SELECT. Devuelven un conjunto de valores contenidos en uno o más renglones.
Para responder a tu pregunta te pongo un ejemplo de los procedimientos tipo select.
Código SQL
[-]
CREATE PROCEDURE get_emp_proj2 (v_empno SMALLINT)
RETURNS (line_no integer, _project_id CHAR(5))
AS
BEGIN
line_no = 0;
FOR SELECT proj_id
FROM Employee_project
WHERE emp_no = :v_ empno
INTO :_project_id
DO
BEGIN
line_no = line_no+1;
SUSPEND;
END
END
Para llamarlo se usa una sentencia como esta:
Código SQL
[-]
SELECT * FROM get_emp_proj2(71);
Resultado
LINE_NO PROJECT_ID
=========== ==========
1 VBASE
2 MAPDB
Como puedes observar el uso de la sentencia
FOR SELECT...DO dentro del procedimiento permite que su comportamiento sea similar a una tabla al llamarlo con la sentencia SELECT.
Por otra parte, la sentencia
SUSPEND detiene la execución del procedimiento para devolver los valores, es decir, cuando quieres enviar todo un renglón a la aplicación que lo ha llamado.
Puedes hacer una serie de operaciones con las variables y cuando hayas obtenido el resultado que deseas entonces utilizas SUSPEND para devolver el resultado, observa en el ejemplo la variable
line_no, una vez que se ha calculado se envia el resultado con SUSPEND.
Espero que sea útil, saludos.