Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Indice
1 SUBPROGRAMAS. .................................................................................................................................................................... 3
Pág. 2 de 9
Procedimientos, funciones y secuencias
1 Subprogramas.
Oracle permite acceder y manipular información de la base de datos definiendo objetos procedurales
(subprogramas) que se almacenan en la base de datos. Estos objetos procedurales son unidades de
programa PL/SQL: Funciones y Procedimientos almacenados.
Los procedimientos o funciones son bloques PL/SQL con nombre, que pueden recibir parámetros y
pueden ser invocados desde distintos entornos: SQL*PLUS, Oracle*Forms, desde otros procedimientos y
funciones y desde otras herramientas Oracle y aplicaciones.
Los procedimientos y funciones llevan a cabo tareas específicas. Las funciones devuelven un valor.
Se crean desde el SQL*PLUS o SQL*DBA.
• En el Cuerpo se define, mediante comandos y sentencias SQL y PL/SQL, la tarea específica que
realiza el subprograma.
Cuando se crea un procedimiento ó función, Oracle automáticamente compila el código fuente, guarda el
código objeto en un área compartida de la SGA (System Global Area) y almacena tanto el código fuente
como el código objeto en catálogos del diccionario de datos.
El código objeto permanece en la SGA, por tanto, los subprogramas se ejecutan más rápidamente y lo
pueden compartir muchos usuarios. Cuando es necesario liberar áreas de la SGA, Oracle aplica el algoritmo
‘menos-usado-recientemente’. Si en un momento determinado se libera el área SQL de un subprograma, la
próxima vez que se ejecute se vuelve a cargar el código objeto, que está almacenado en catálogo, en la SGA.
Pág. 3 de 9
DBD Práctica-3 Procedimientos, funciones y secuencias
Sevilla, Febrero 2007, V 2007.02.1
• Precompiladores de Oracle:
Pro*C, Pro*Cobol, Pro*PL/I, Pro*Ada, Pro*Fortran, etc. Se incluyen bloques PL/SQL embebidos en
programas escritos en lenguajes de alto nivel (C, Cobol, PL/I, etc.)
Procedimiento Descripción
DBMS_OUTPUT.PUT Añade texto a la línea actual
DBMS_OUTPUT.NEW_LINE Marca un final de línea
DBMS_OUTPUT.PUT_LINE Combina PUT y NEW_LINE
Es necesario activar SERVEROUTPUT desde SQL*PLUS o SQL*DBA para ver las salidas desde
procedimientos o funciones almacenados: SET SERVEROUTPUT ON
1.5 Package
Un Package es un objeto que permite encapsular ó agrupar procedimientos, funciones, cursores, variables,
etc. que están relacionados lógicamente y almacenarlos en la base de datos como una sola unidad.
Los métodos de definición de Packages, permiten especificar qué variables, cursores, procedures, etc. son
públicos (accesibles directamente por los usuarios) y cuáles privados (no accesibles por los usuarios).
Un Package se crea en dos partes separadas: Especificación y Cuerpo:
• Especificación (CREATE PACKAGE): se declaran los constructores públicos del Package. Esta
parte del Package es la interface con las aplicaciones de los usuarios.
• Cuerpo (CREATE PACKAGE BODY): se declaran los constructores privados del Package y se
definen todos los procedimientos y funciones (públicos y privados).
En la Especificación del Package (CREATE PACKAGE). Se declaran todas las variables, funciones,
procedimientos, etc. que sean públicos; es decir, accesibles desde las aplicaciones de los usuarios:
Variable wtotal-emp (número total de empleados),
Función inserta-emp (insertar empleado, devuelve la clave primaria del nuevo empleado)
Procedimiento borra-emp (borrar empleado) y
Procedimiento actualiza-comsal (actualizar comisiones de salario de un empleado).
Pág. 5 de 9
DBD Práctica-3 Procedimientos, funciones y secuencias
Sevilla, Febrero 2007, V 2007.02.1
Podemos ver que al declarar los procedimientos y funciones, sólo se incluye la parte de Especificación; es
decir, nombre del procedimiento, nombre y tipo de los argumentos y, sólo en las funciones, el nombre y
tipo de dato del valor que devuelven.
En el Cuerpo del Package (CREATE PACKAGE BODY). Se declaran todas las variables, procedimientos,
funciones, etc. que sean privados; es decir, no accesibles desde las aplicaciones; y se definen los
procedimientos y funciones públicos y privados. En este caso, se declara la variable privada wfecha-actual
(fecha actual) y se definen la función inserta-emp y los procedimientos borra-emp y actualiza-comsal que se
declararon en la parte de Especificación del Package.
FUNCTION inserta-emp
(codemp Varchar2...) IS
RETURN new-empno Number(10);
BEGIN
....
END inserta-emp;
PROCEDURE borra-emp
(n-emp IN Number) AS
BEGIN
....
END borra-emp;
PROCEDURE actualiza-comsal
(n-emp IN Number,
comsal-incr IN Number) AS
BEGIN
....
END actualiza-comsal;
END p-emp;
Pág. 6 de 9
DBD Práctica-3 Procedimientos, funciones y secuencias
Sevilla, Febrero 2007, V 2007.02.1
2 Secuencias.
Las secuencias (sequences) son objetos que facilitan la generación automática de series numéricas.
Las secuencias son independientes de las tablas; por tanto, una misma secuencia se puede usar para generar
valores de columnas numéricas de una ó más tablas.
Una forma muy común de implementar en las aplicaciones la generación de series numéricas, es forzar que
cada transacción que solicita un nuevo número bloquee la tabla, seleccione el último número, lo incremente
y libere la tabla. Con esta implementación, si dos usuarios quieren obtener el siguiente número al mismo
tiempo, uno de los dos tendrá que esperar a que termine la transacción del otro.
Una de las principales ventajas de las secuencias frente a implementar la generación de éstas series de
números en las aplicaciones, es que permiten la generación simultánea de múltiples números
garantizando que son únicos. De esta forma, mejora la concurrencia de las aplicaciones.
La primera referencia a Nextval devuelve el valor inicial de la secuencia (parámetro START WITH); las
sucesivas referencias generan los siguientes números de la serie (parámetro INCREMENT BY).
Pág. 7 de 9
DBD Práctica-3 Procedimientos, funciones y secuencias
Sevilla, Febrero 2007, V 2007.02.1
En el siguiente ejemplo podemos ver la utilidad de las secuencias para obtener los valores de la clave
primaria de la tabla Empleado y para coordinar los valores de las claves primarias de las tabla Empleado
y la tabla Salario.
Con el comando CREATE SEQUENCE creamos la secuencia (sec_emp) para obtener los valores de la
clave primaria de la tabla Empleado.
Para introducir un empleado nuevo ejecutamos el comando SQL INSERT y en la claúsula VALUES, para
especificar el valor del campo clave (srgemp), referenciamos a la pseudo-columna sec_emp.NEXTVAL.
Ejercicio 1.
Añadir registros a la tabla de empleados, utilizando una secuencia que genere el código de empleado.
Pág. 8 de 9
Procedimientos, funciones y secuencias
Ejercicio 2.
Crear un procedimiento para insertar un nuevo empleado en la tabla Empleados.
Los argumentos del procedimiento son los valores de los atributos del empleado.
Para obtener el valor de la clave primaria del nuevo empleado, utilizamos una secuencia que la genere
automáticamente.
Ejercicio 3.
Crear una función para calcular el sueldo total de un empleado pasado como parámetro. Tenga en cuenta
que hay que añadir la comisión (que es un porcentaje adicional del salario) al salario.
Genere un bloque PL/SQL anónimo (un procedimiento BEGIN ….. END que no es necesario
nominarlo) y pruébelo desde la WorkSheet con una instrucción DBMS_OUTPUT.
Pág. 9 de 9