Los subprogramas son los bloques PL/SQL con nombre que pueden recibir y devolver valores.
- La cabecera, compuesta por el nombre del subprograma, los parámetros y el tipo de valor de retorno.
- El cuerpo, compuesto por las declaraciones, las instrucciones y el manejo de excepciones.
Podemos distinguir entre dos tipos de subprogramas, como ya hemos comentado en artículos anteriores:
Procedimientos
Los procedimientos ya los hemos visto en el articulo Bloques anónimos y procedimientos PL/SQL por lo que pasamos directamente a las funciones.Funciones
Las funciones son muy similares a los procedimiento con la diferencia que éstas siempre devolverán un valor. Su estructura es la siguiente:
CREATE [OR REPLACE] FUNCTION NombreFuncion [(parámetros)] RETURN tipo
IS [parte declarativa]
BEGIN
instrucciones
RETURN <valor o expresión>;
[EXCEPTION excepciones]
END;
La cláusula RETURN de la cabecera nos especifica el tipo de valor que nos va a devolver la función.
Parámetros
Todos los subprogramas utilizan parámetros para pasar y recibir información.Dentro de los parámetros podemos distinguir dos tipos:
- Parámetros actuales: son variables indicadas en la llamada a un subprograma.
- Parámetros formales: son variables declaradas en la especificación del subprograma.
Además podemos hacer el paso de parámetros de un tipo a otro. Generalmente si los tipos son compatibles PL/SQL lo hace automáticamente. En cualquier caso, podemos hacerlo de forma manual utilizando las siguientes notaciones:
- Posicional: el compilador asocia los parámetros actuales a los formales, basándose en suposición.
- Nominal: el símbolo => después del parámetro actual y antes del nombre del formal, indica al compilador correspondencia.
- Mixta: nos permite usar las dos notaciones anteriores.
Para que esto quede más claro pasamos a escribir un ejemplo de paso de parámetros y conversión de tipos.
Tenemos la especificación de un procedimiento como esta:
PROCEDURE departamento(
n_departamento INTEGER,
localidad VARCHAR2
IS...
Desde el siguiente bloque se podrán realizar las llamadas indicadas:
DECLARE
num_departamento INTEGER;
aula VARCHAR(30)
BEGIN
...
- - posicional departamento(num_departamento, aula);
- - nominal departamento(num_departamento => n_departamento, aula =>localidad);
...
END;
Esto nos pasaría los parámetros num_departamento al mismo tipo que n_departamento y localidad al mismo tipo que aula.
Los parámetros que soporta PL/SQL pueden ser de entrada, salida o entrada/salida
IN | Nos permite pasar valores a un subprograma. Dentro del subprograma, el parámetro actuá como una constante. Puede ser una variable, constante, literal o expresión. |
OUT | Permite devolver valores al bloque que llamó al subprograma. Dentro del subprograma, el parámetro actúa como una variable no inicializada. Solo puede ser una variable. |
IN OUT | Permite pasar un valor inicial y devolver un valor actualizado. Dentro del subprograma, el parámetro actuá como variable inicializada. Puede intervenir otras expresiones. El valor actual debe ser una variable. |
El formato genérico es el siguiente:
<nombrevariable> [IN | OUT | IN OUT] <tipodato>
[ { := | DEFAULT} <valor>]
Además es importante recordar que al especificar parámetros debemos indicar el tipo, pero no el tamaño.
Creación, modificación y borrado de subprogramas
Cuando creamos subprogramas con SQL * PLUS utilizando los comandos CREATE, Oracle automáticamente compila el código fuente, genera el código objeto y los guarda en el diccionario de datos, quedando disponibles para su utilización.Para volver a compilar un subprograma almacenado utilizaremos la orden ALTER en vez del CREATE y su formato es el siguiente:
ALTER {PROCEDURE | FUNCITON} nombresubprograma COMPILE;
Para ver el código de un subprograma almacenado podemos ejecutar una sentencia como esta;
select LINE, SUBSTR(TEXT,1,60) from USER_SOURCE where name = 'nombresubprograma';
Para borrar un subprograma almacenado utilizaremos la orden DROP de la siguiente forma:
DROP {PROCEDURE | FUNCTION} nombresubprograma;