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