Está en la página 1de 16

Escuela Técnica Superior

Escuela Técnica Superior de Ingeniería Informática


de Ingeniería Informática Departamento de Lenguajes
Departamento de Lenguajes y Sistemas Informáticos
y Sistemas Informáticos

1. Procedimientos y
funciones
1.1 Definición
1.2 Llamadas
Funciones, procedimientos,
1.3 Documenta-
ción
1.4 Depuración
2. Secuencias
secuencias y cursores en
2.1 Definición
3. Cursores
3.1 Bucle FOR
Oracle
3.2 Atributos
4. Ejercicios
5. Scripts

Grupo de Ingeniería del Software y Bases de Datos


Departamento de Lenguajes y Sistemas Informáticos
Universidad de Sevilla

© Diseño de Amador Durán Toro, 2011


diciembre 2011

Funciones, procedimientos, secuencias y cursores en Oracle

Escuela Técnica Superior • Objetivos de este tema


de Ingeniería Informática
Departamento de Lenguajes
y Sistemas Informáticos – Conocer la definición y utilización de funciones y
1. Procedimientos y
funciones procedimientos en Oracle.
1.1 Definición
1.2 Llamadas – Conocer la definición y utilización de las secuencias en
1.3 Documenta-
ción
1.4 Depuración
Oracle.
2. Secuencias
2.1 Definición – Conocer la definición y utilización de cursores en Oracle.
3. Cursores
3.1 Bucle FOR
3.2 Atributos
4. Ejercicios
5. Scripts
© Diseño de Amador Durán Toro, 2011

diciembre 2011 Introducción a la Ingeniería del Software y a los Sistemas de Información 1


Procedimientos y funciones

• Oracle permite acceder y manipular información de la base


Escuela Técnica Superior
de Ingeniería Informática
Departamento de Lenguajes de datos definiendo objetos procedurales (subprogramas)
y Sistemas Informáticos

1. Procedimientos y
que se almacenan en la base de datos. Estos objetos
funciones
1.1 Definición
procedurales son unidades de programa PL/SQL:
1.2 Llamadas
1.3 Documenta-
Funciones y Procedimientos almacenados.
ción
1.4 Depuración
2. Secuencias
2.1 Definición • Los procedimientos o funciones son bloques PL/SQL con
3. Cursores
3.1 Bucle FOR nombre, que pueden recibir parámetros y pueden ser
3.2 Atributos
4. Ejercicios
invocados desde distintos entornos: SQL*PLUS,
5. Scripts
Oracle*Forms, desde otros procedimientos y funciones y
desde otras herramientas Oracle y aplicaciones.

• Los procedimientos y funciones llevan a cabo tareas


específicas, y su mayor diferencia radica en que las

© Diseño de Amador Durán Toro, 2011


funciones devuelven un valor.

diciembre 2011 Introducción a la Ingeniería del Software y a los Sistemas de Información 2

Procedimientos y funciones

Escuela Técnica Superior • Sintaxis Procedimientos


de Ingeniería Informática
Departamento de Lenguajes
y Sistemas Informáticos CREATE [OR REPLACE} PROCEDURE [esquema].nombre-procedimiento
1. Procedimientos y (nombre-parámetro {IN | OUT | IN OUT} tipo de dato, ..) {IS | AS}
funciones
1.1 Definición
Declaración de variables;
1.2 Llamadas Declaración de constantes;
1.3 Documenta-
ción Declaración de cursores;
1.4 Depuración
2. Secuencias BEGIN
2.1 Definición
Cuerpo del subprograma PL/SQL;
3. Cursores
3.1 Bucle FOR EXCEPTION
3.2 Atributos
4. Ejercicios
Bloque de excepciones PL/SQL;
5. Scripts END;
© Diseño de Amador Durán Toro, 2011

octubre 2011 Introducción a la Ingeniería del Software y a los Sistemas de Información 3


Procedimientos y funciones

Escuela Técnica Superior • Sintaxis Funciones


de Ingeniería Informática
Departamento de Lenguajes
y Sistemas Informáticos CREATE [OR REPLACE] FUNCTION [esquema].nombre-función
1. Procedimientos y (nombre-parámetro {IN | OUT | IN OUT} tipo-de-dato, ...)
funciones
1.1 Definición
RETURN tipo-de-dato {IS | AS}
1.2 Llamadas Declaración de variables;
1.3 Documenta-
ción Declaración de constantes;
1.4 Depuración
2. Secuencias Declaración de cursores;
2.1 Definición
BEGIN
3. Cursores
3.1 Bucle FOR Cuerpo del subprograma PL/SQL;
3.2 Atributos
4. Ejercicios
EXCEPTION
5. Scripts Bloque de excepciones PL/SQL;
END;

© Diseño de Amador Durán Toro, 2011


octubre 2011 Introducción a la Ingeniería del Software y a los Sistemas de Información 4

Procedimientos y Funciones
Descripción de la sintaxis:
Escuela Técnica Superior
de Ingeniería Informática
Departamento de Lenguajes • Nombre-parámetro: es el nombre que queramos dar al
y Sistemas Informáticos
parámetro. Podemos utilizar múltiples parámetros. En caso de
1. Procedimientos y
funciones no necesitarlos, podemos omitir los paréntesis.
1.1 Definición
1.2 Llamadas • IN: especifica que el parámetro es de entrada y que por tanto
1.3 Documenta-
ción
dicho parámetro tiene que tener un valor en el momento de
1.4 Depuración llamar a la función o procedimiento. Si no se especifica nada,
2. Secuencias
2.1 Definición los parámetros son por defecto de tipo entrada.
3. Cursores
3.1 Bucle FOR • OUT: especifica que se trata de un parámetro de salida. Son
3.2 Atributos
parámetros cuyo valor es devuelto después de la ejecución el
4. Ejercicios
5. Scripts procedimiento al bloque PL/SQL que lo llamó. Las funciones
PLSQL no admiten parámetros de salida.
• IN OUT: Son parámetros de entrada y salida a la vez.
• Tipo-de-dato: Indica el tipo de dato PLSQL que corresponde al
parámetro (NUMBER, VARCHAR2, etc).
© Diseño de Amador Durán Toro, 2011

octubre 2011 Introducción a la Ingeniería del Software y a los Sistemas de Información 5


Procedimientos y funciones

Escuela Técnica Superior


• Ejemplo de creación de un procedimiento
de Ingeniería Informática
Departamento de Lenguajes
y Sistemas Informáticos CREATE OR REPLACE PROCEDURE contratar_empleado
1. Procedimientos y (w_codigo_emp IN emp.codigo_emp%TYPE,
funciones
1.1 Definición w_depart IN emp.cod_depart%TYPE,
1.2 Llamadas
1.3 Documenta- w_fecha_alta IN emp.fecha_alta%TYPE)
ción
1.4 Depuración IS
2. Secuencias
2.1 Definición BEGIN
3. Cursores
3.1 Bucle FOR
INSERT INTO emp(código_emp, fecha_alta, cod_depart)
3.2 Atributos VALUES (w_código_emp, w_fecha_alta, w_depart);
4. Ejercicios
5. Scripts END contratar_empleado;

En este procedimiento se ha definido el tipo de dato de los parámetros de


entrada como del mismo tipo que los campos de la tabla “emp” , es decir:
nombreParametro IN nombreTabla.nombreColumna%TYPE.
Sería equivalente a poner:

© Diseño de Amador Durán Toro, 2011


w_codigo_emp number,
w_depart varchar..

diciembre 2011 Introducción a la Ingeniería del Software y a los Sistemas de Información 6

Procedimientos y funciones

Escuela Técnica Superior • Ejemplo de creación de una función


de Ingeniería Informática
Departamento de Lenguajes
y Sistemas Informáticos CREATE OR REPLACE FUNCTION obtener_salario
1. Procedimientos y
funciones (w_código_emp IN emp.código_emp%TYPE)
1.1 Definición
1.2 Llamadas
RETURN NUMBER
1.3 Documenta-
ción IS w_salario emp.salario_emp%TYPE;
1.4 Depuración
2. Secuencias
BEGIN
2.1 Definición
3. Cursores
SELECT salario_emp INTO w_salario
3.1 Bucle FOR
FROM emp
3.2 Atributos
4. Ejercicios WHERE código _emp = w_código_emp;
5. Scripts
RETURN w_salario;
END obtener_salario;

• Cada función debe devolver un valor del tipo especificado utilizando


la sentencia RETURN.
© Diseño de Amador Durán Toro, 2011

diciembre 2011 Introducción a la Ingeniería del Software y a los Sistemas de Información 7


Procedimientos y funciones

Escuela Técnica Superior


• Cuando se crea un procedimiento o función, Oracle
de Ingeniería Informática
Departamento de Lenguajes
y Sistemas Informáticos
automáticamente compila el código fuente, guarda el
1. Procedimientos y
código objeto en un área compartida de la SGA (System
funciones
1.1 Definición Global Area) y almacena tanto el código fuente como el
1.2 Llamadas
1.3 Documenta- código objeto en catálogos del diccionario de datos.
ción
1.4 Depuración
2. Secuencias
2.1 Definición
3. Cursores
• El código objeto permanece en la SGA, por tanto, los
3.1 Bucle FOR
3.2 Atributos
procedimientos o funciones se ejecutan más rápidamente
4. Ejercicios
5. Scripts
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
procedimiento o función, la próxima vez que se ejecute se
vuelve a cargar el código objeto, que está almacenado en

© Diseño de Amador Durán Toro, 2011


catálogo, en la SGA
diciembre 2011 Introducción a la Ingeniería del Software y a los Sistemas de Información 8

Procedimientos y funciones

Escuela Técnica Superior • Llamadas a procedimientos


de Ingeniería Informática
Departamento de Lenguajes
y Sistemas Informáticos • Desde otro procedimiento, función y triggers
1. Procedimientos y CREATE PROCEDURE proceso ... IS ...
funciones
1.1 Definición BEGIN ...
1.2 Llamadas
1.3 Documenta-
/* llamada al procedimiento contratar_empleado */
ción
contratar_empleado (2645, ’Contabilidad’,’19/12/1999’);
1.4 Depuración
2. Secuencias
2.1 Definición
3. Cursores END;
3.1 Bucle FOR
3.2 Atributos
4. Ejercicios
5. Scripts
• Herramientas de desarrollo de aplicaciones de Oracle:
SQL*Plus, SQL*Dba, SQL*Forms, SQL*Menu, SQL*ReportWriter, etc.

EXECUTE contratar_empleado (2645, ’Contabilidad’,’19/12/1999’);


© Diseño de Amador Durán Toro, 2011

diciembre 2011 Introducción a la Ingeniería del Software y a los Sistemas de Información 9


Procedimientos y funciones

Escuela Técnica Superior • Llamadas a funciones


de Ingeniería Informática
Departamento de Lenguajes
y Sistemas Informáticos • Desde otro procedimiento, función y triggers
1. Procedimientos y CREATE PROCEDURE proceso ... IS ...
funciones
1.1 Definición BEGIN ...
1.2 Llamadas
1.3 Documenta-
/* llamada a la función obtener_salario */
ción
w_sal :=obtener_salario (w_código);
1.4 Depuración
2. Secuencias END;
2.1 Definición
3. Cursores
3.1 Bucle FOR
3.2 Atributos • Desde un bloque anónimo
4. Ejercicios
5. Scripts BEGIN
DBMS_OUTPUT.PUT_LINE(‘Salario cod_emp 1 '||obtener_salario(1));
END;

• Desde una instrucción SQL


SELECT cod_emp, nom_emp, obtener_salario(cod_emp)

© Diseño de Amador Durán Toro, 2011


FROM emp;

diciembre 2011 Introducción a la Ingeniería del Software y a los Sistemas de Información 10

Procedimientos y funciones

Escuela Técnica Superior • Documentación procedimientos y funciones


de Ingeniería Informática
Departamento de Lenguajes
y Sistemas Informáticos • Para obtener los nombres de todos los procedimientos y funciones
1. Procedimientos y
funciones
se puede consultar la VISTA USER_OBJECTS
1.1 Definición
1.2 Llamadas
SELECT object_name, object_type FROM USER_OBJECTS
1.3 Documenta-
ción WHERE object_type IN (‘PROCEDURE’ , ‘FUNCTION’);
1.4 Depuración
2. Secuencias
2.1 Definición
3. Cursores
3.1 Bucle FOR
3.2 Atributos • Para obtener el texto de un procedimiento o función almacenado se
4. Ejercicios
5. Scripts puede consultar la VISTA USER_SOURCE
SELECT text FROM USER_SOURCE
WHERE type = ‘PROCEDURE’
AND name = ‘CONTRATAR_EMPLEADO’
© Diseño de Amador Durán Toro, 2011

diciembre 2011 Introducción a la Ingeniería del Software y a los Sistemas de Información 11


Procedimientos y funciones

Escuela Técnica Superior • Depuración de procedimientos y funciones


de Ingeniería Informática
Departamento de Lenguajes
y Sistemas Informáticos • Para visualizar los errores de compilación se puede consultar la
1. Procedimientos y
funciones
VISTA USER_ERRORS o el comando SHOW ERRORS.
1.1 Definición
1.2 Llamadas
1.3 Documenta-
ción • Se pueden visualizar valores o mensajes desde un procedimiento o
1.4 Depuración
2. Secuencias
función, invocando al package standard DBMS_OUPUT.
2.1 Definición
3. Cursores
3.1 Bucle FOR
Procedimiento Descripción
3.2 Atributos DBMS_OUTPUT.PUT Añade texto a la línea actual
4. Ejercicios
5. Scripts DBMS_OUTPUT.NEW_LINE Marca un final de línea

DBMS_OUTPUT.PUT_LINE Combina PUT y NEW_LINE

Es necesario activar SERVEROUTPUT (SET SERVEROUTPUT ON)


para ver las salidas desde procedimientos o funciones almacenados

© Diseño de Amador Durán Toro, 2011


diciembre 2011 Introducción a la Ingeniería del Software y a los Sistemas de Información 12

Secuencias

Escuela Técnica Superior • Las secuencias (sequences) son objetos que


de Ingeniería Informática
Departamento de Lenguajes
y Sistemas Informáticos facilitan la generación automática de series
1. Procedimientos y
funciones
1.1 Definición
numéricas.
1.2 Llamadas
1.3 Documenta-
ción
1.4 Depuración • Los usos más frecuentes de las secuencias, son:
2. Secuencias
2.1 Definición
3. Cursores
– La generación automática de claves primarias
3.1 Bucle FOR
3.2 Atributos – Coordinar las claves de múltiples filas o tablas.
4. Ejercicios
5. Scripts

• Las secuencias son independientes de las tablas; por tanto,


una misma secuencia se puede usar para generar valores
de columnas numéricas de una o más tablas.
© Diseño de Amador Durán Toro, 2011

diciembre 2011 Introducción a la Ingeniería del Software y a los Sistemas de Información 13


Secuencias
CREATE SEQUENCE nombre_secuencia
Escuela Técnica Superior
de Ingeniería Informática
Departamento de Lenguajes [INCREMENT BY n]
y Sistemas Informáticos
[START WITH n]
1. Procedimientos y
funciones
1.1 Definición
[MAXVALUE n]
1.2 Llamadas
1.3 Documenta-
...;
ción
1.4 Depuración
2. Secuencias
2.1 Definición
• Para referenciar al número actual de una secuencia:
3. Cursores
nombre_secuencia.Currval
3.1 Bucle FOR
3.2 Atributos
4. Ejercicios
5. Scripts • Para generar el siguiente número de una secuencia:
nombre_secuencia.Nextval

• Los usos posibles de Nextval y Currval son:


Clausula “Values” del comando Insert

© Diseño de Amador Durán Toro, 2011


Lista “Select” del comando Select
Clausula “Set” del comando Update
diciembre 2011 Introducción a la Ingeniería del Software y a los Sistemas de Información 14

Secuencias

Escuela Técnica Superior • Ejemplo de creación de secuencia


de Ingeniería Informática
Departamento de Lenguajes
y Sistemas Informáticos CREATE SEQUENCE sec_emp;
1. Procedimientos y
funciones
1.1 Definición
1.2 Llamadas
1.3 Documenta-
• Obtener los valores de la clave primaria de la tabla
ción
1.4 Depuración Empleado y coordinar los valores de las claves primarias
2. Secuencias
2.1 Definición de las tabla Empleado y la tabla Salario.
3. Cursores
3.1 Bucle FOR – Insertar fila en la tabla Empleado
3.2 Atributos
4. Ejercicios INSERT INTO Empleado (cod_emp,codemp...)
5. Scripts
VALUES (sec_emp.NEXTVAL, ‘emp01’...);

– Insertar empleado en la tabla Salarios


INSERT INTO Salario (cod_emp,mes...)
© Diseño de Amador Durán Toro, 2011

VALUES (sec_emp.CURRVAL,..)

diciembre 2011 Introducción a la Ingeniería del Software y a los Sistemas de Información 15


Cursores

• Los cursores permiten realizar operaciones sobre los


Escuela Técnica Superior
de Ingeniería Informática
Departamento de Lenguajes
registros devueltos por una sentencia Select. La utilización
y Sistemas Informáticos
de cursores es necesaria cuando:
1. Procedimientos y
funciones – Se necesita tratamiento fila a fila
1.1 Definición
1.2 Llamadas – En sentencias SELECT que devuelven más de una fila
1.3 Documenta-
ción
1.4 Depuración
• Operaciones con cursores
2. Secuencias
2.1 Definición – Declare
3. Cursores • Se declara el cursor asignándole nombre y asociándole a una consulta.
3.1 Bucle FOR
3.2 Atributos
– Open
4. Ejercicios • Abre el cursor y lo inicializa para que devuelva las filas.
5. Scripts
• Ejecuta la consulta asociada al cursor.
– Fetch
• Lee los datos del cursor con la sentencia FETCH.
• Devuelve la siguiente fila en el conjunto activo.
• Los datos devueltos se almacenan en variables de control o en un
registro. FETCH ... INTO ...

© Diseño de Amador Durán Toro, 2011


– Close
• Desactiva el cursor y libera los recursos. CLOSE cursor_1;

diciembre 2011 Introducción a la Ingeniería del Software y a los Sistemas de Información 16

Cursores

Escuela Técnica Superior


• Ejemplo uso de cursor
de Ingeniería Informática
Departamento de Lenguajes
y Sistemas Informáticos

1. Procedimientos y
DECLARE
funciones
1.1 Definición CURSOR cursor_1 IS
1.2 Llamadas
1.3 Documenta-
SELECT nombre, número, salario
ción
1.4 Depuración FROM emp ORDER BY salario;
2. Secuencias
2.1 Definición w_nombre emp.nombre%TYPE;
3. Cursores
3.1 Bucle FOR
w_número emp.número%TYPE;
3.2 Atributos
4. Ejercicios
w_salar io emp.salario%TYPE;
5. Scripts
BEGIN
OPEN cursor_1;
FETCH cursor_1 INTO w_nombre, w_número, w_salario;
...
CLOSE cursor_1;
© Diseño de Amador Durán Toro, 2011

END;

diciembre 2011 Introducción a la Ingeniería del Software y a los Sistemas de Información 17


Cursores

Escuela Técnica Superior


• Ejemplo uso de cursor
de Ingeniería Informática
Departamento de Lenguajes
y Sistemas Informáticos
DECLARE
1. Procedimientos y
CURSOR cursor_1 IS
funciones
1.1 Definición SELECT nombre, número, salario
1.2 Llamadas
1.3 Documenta-
FROM emp ORDER BY salario;
ción
1.4 Depuración w_registro cursor_1%ROWTYPE;
2. Secuencias
2.1 Definición
3. Cursores
3.1 Bucle FOR
BEGIN
3.2 Atributos
4. Ejercicios
OPEN cursor_1;
5. Scripts
FETCH cursor_1 INTO w_registro;
...
CLOSE cursor_1;
END;

© Diseño de Amador Durán Toro, 2011


El registro ha sido declarado basado en el cursor:
w_registro <nombre_cursor>%ROWTYPE
diciembre 2011 Introducción a la Ingeniería del Software y a los Sistemas de Información 18

Cursores

Escuela Técnica Superior


• Bucle de cursor FOR
de Ingeniería Informática
Departamento de Lenguajes
y Sistemas Informáticos – De forma implícita declara una variable REGISTRO de tipo
1. Procedimientos y ROWTYPE, abre el cursor y de forma repetitiva realiza el
funciones
1.1 Definición FETCH de las filas sobre la variable registro. Por último
1.2 Llamadas
1.3 Documenta-
cierra el cursor cuando todas las filas han sido procesadas
ción
1.4 Depuración DECLARE
2. Secuencias
2.1 Definición CURSOR c1 IS
3. Cursores
3.1 Bucle FOR
3.2 Atributos
SELECT empno, ename FROM emp;
4. Ejercicios
5. Scripts
BEGIN
FOR c1rec IN c1 LOOP
/* De forma implícita hace OPEN y FETCH del cursor*/
...
END LOOP;
© Diseño de Amador Durán Toro, 2011

END;

diciembre 2011 Introducción a la Ingeniería del Software y a los Sistemas de Información 19


Cursores

Escuela Técnica Superior • Atributos del cursor


de Ingeniería Informática
Departamento de Lenguajes
y Sistemas Informáticos – Cada cursor definido tiene cuatro atributos a los que se
1. Procedimientos y
funciones puede acceder para conocer el estado del cursor.
1.1 Definición
1.2 Llamadas
1.3 Documenta-
ción
1.4 Depuración • %FOUND Devuelve true si el último FETCH evaluado
2. Secuencias
2.1 Definición devuelve la siguiente fila.
3. Cursores
3.1 Bucle FOR • %NOTFOUND Devuelve true si el último FETCH evaluado
3.2 Atributos
4. Ejercicios
no devuelve ninguna fila.
5. Scripts
• %ROWCOUNT Contador inicialmente a cero, que se
incrementa en uno tras el FETCH de cada fila.
• %ISOPEN Devuelve true si el cursor especificado está
abierto.

© Diseño de Amador Durán Toro, 2011


diciembre 2011 Introducción a la Ingeniería del Software y a los Sistemas de Información 20

Cursores

Escuela Técnica Superior


• Ejemplo uso de atributos del cursor
de Ingeniería Informática
Departamento de Lenguajes
y Sistemas Informáticos
DECLARE
1. Procedimientos y
funciones
CURSOR cursor_1 IS
1.1 Definición SELECT nombre, salario FROM empleados;
1.2 Llamadas
1.3 Documenta-
registro cursor_1%ROWTYPE
ción
1.4 Depuración
2. Secuencias BEGIN
2.1 Definición
IF NOT (cursor_1%ISOPEN) THEN OPEN cursor_1;
3. Cursores
3.1 Bucle FOR ENDIF;
3.2 Atributos
4. Ejercicios
5. Scripts LOOP
FETCH cursor_1 INTO registro;
EXIT WHEN cursor_1%NOTFOUND;
...
END LOOP;
CLOSE cursor_1;
END;
© Diseño de Amador Durán Toro, 2011

diciembre 2011 Introducción a la Ingeniería del Software y a los Sistemas de Información 21


Ejercicio 1

Escuela Técnica Superior


• Añadir registros a la tabla de empleados, utilizando una
de Ingeniería Informática
Departamento de Lenguajes
y Sistemas Informáticos
secuencia que genere el código de empleado.
1. Procedimientos y
funciones
1.1 Definición
1.2 Llamadas
CREATE TABLE empleados
1.3 Documenta-
ción (cod_emp integer,
1.4 Depuración
2. Secuencias nom_emp char(10) not null,
2.1 Definición
3. Cursores salario number(9,2) DEFAULT 100000,
3.1 Bucle FOR
3.2 Atributos fecha_nac date DEFAULT SYSDATE,
4. Ejercicios
5. Scripts comision number(3,2)
CHECK (comision>=0 AND comision <=1),
cod_jefe integer,
PRIMARY KEY (cod_emp),
FOREIGN KEY (cod_jefe) REFERENCES empleados

© Diseño de Amador Durán Toro, 2011


ON DELETE CASCADE);

diciembre 2011 Introducción a la Ingeniería del Software y a los Sistemas de Información 22

Ejercicio 2

Escuela Técnica Superior • Crear un procedimiento para insertar un nuevo


de Ingeniería Informática
Departamento de Lenguajes
y Sistemas Informáticos empleado en la tabla Empleados.
1. Procedimientos y
funciones – Los argumentos del procedimiento son los valores de los
1.1 Definición
1.2 Llamadas atributos del empleado.
1.3 Documenta-
ción
1.4 Depuración – Utilizar una secuencia para obtener el valor de la clave
2. Secuencias
2.1 Definición primaria del nuevo empleado.
3. Cursores
3.1 Bucle FOR
3.2 Atributos
4. Ejercicios
5. Scripts
© Diseño de Amador Durán Toro, 2011

diciembre 2011 Introducción a la Ingeniería del Software y a los Sistemas de Información 23


Ejercicio 3

Escuela Técnica Superior • Crear una función para calcular el sueldo total de
de Ingeniería Informática
Departamento de Lenguajes
y Sistemas Informáticos un empleado pasado como parámetro. Tenga en
1. Procedimientos y
funciones
1.1 Definición
cuenta que hay que añadir la comisión (que es un
1.2 Llamadas
1.3 Documenta-
porcentaje adicional del salario) al salario.
ción
1.4 Depuración
2. Secuencias
2.1 Definición
3. Cursores
3.1 Bucle FOR
• Es posible también llamar a la función desde un
3.2 Atributos
4. Ejercicios bloque PL/SQL: Genere un bloque PL/SQL
5. Scripts

anónimo (un procedimiento BEGIN ….. END que


no es necesario nominar) y pruébelo con una
instrucción DBMS_OUTPUT

© Diseño de Amador Durán Toro, 2011


diciembre 2011 Introducción a la Ingeniería del Software y a los Sistemas de Información 24

Ejercicio 4

Escuela Técnica Superior


de Ingeniería Informática
• Obtener los tres empleados con más
Departamento de Lenguajes
y Sistemas Informáticos

1. Procedimientos y
subordinados
funciones
1.1 Definición
1.2 Llamadas
1.3 Documenta-
ción
1.4 Depuración
2. Secuencias
2.1 Definición
3. Cursores
3.1 Bucle FOR
3.2 Atributos
4. Ejercicios
5. Scripts
© Diseño de Amador Durán Toro, 2011

diciembre 2011 Introducción a la Ingeniería del Software y a los Sistemas de Información 25


Script ejercicios 1,2 y3

Escuela Técnica Superior DROP TABLE empleados;


de Ingeniería Informática
Departamento de Lenguajes
CREATE TABLE empleados
y Sistemas Informáticos ( cod_emp integer,
nom_emp char(10) not null,
1. Procedimientos y
funciones salario number(9,2) DEFAULT 100000,
1.1 Definición fecha_nac date DEFAULT SYSDATE,
1.2 Llamadas comision number(5,2), CHECK (comision>=0 AND comision<=1),
1.3 Documenta- cod_jefe integer,
ción PRIMARY KEY (cod_emp),
1.4 Depuración FOREIGN KEY (cod_jefe) REFERENCES empleados ON DELETE CASCADE);
2. Secuencias
2.1 Definición DROP SEQUENCE sec_emp;
3. Cursores
CREATE SEQUENCE sec_emp INCREMENT BY 1 START WITH 1;
3.1 Bucle FOR
3.2 Atributos
/* Procedimiento */
4. Ejercicios
CREATE OR REPLACE PROCEDURE contratar_empleado
5. Scripts
(w_nom_emp IN empleados.nom_emp%TYPE,
w_salario IN empleados.salario%TYPE,
w_comision IN empleados.comision%TYPE,
w_cod_jefe IN empleados.cod_jefe%TYPE) IS
BEGIN
INSERT INTO empleados (cod_emp,nom_emp, salario,comision,cod_jefe)
VALUES (sec_emp.nextval, w_nom_emp, w_salario, w_comision,
w_cod_jefe);
COMMIT WORK;

© Diseño de Amador Durán Toro, 2011


END contratar_empleado;
/

diciembre 2011 Introducción a la Ingeniería del Software y a los Sistemas de Información 26

Script ejercicios 1,2 y3

Escuela Técnica Superior


EXECUTE contratar_empleado('Primero',1000.00,.07,null);
de Ingeniería Informática EXECUTE contratar_empleado('Segundo',2000,.10,1);
Departamento de Lenguajes
y Sistemas Informáticos EXECUTE contratar_empleado('Tercero',2300.25,.15,2);
1. Procedimientos y
funciones --SELECT * FROM empleados;
1.1 Definición
1.2 Llamadas CREATE OR REPLACE FUNCTION obtener_salario(w_cod_emp IN
1.3 Documenta- empleados.cod_emp%TYPE)
ción
RETURN NUMBER IS w_salario_bruto empleados.salario%TYPE;
1.4 Depuración
2. Secuencias
BEGIN
2.1 Definición
SELECT salario*(1+comision) INTO w_salario_bruto FROM empleados
3. Cursores WHERE cod_emp = w_cod_emp;
3.1 Bucle FOR RETURN (w_salario_bruto);
3.2 Atributos END obtener_salario;
4. Ejercicios /
5. Scripts /* Prueba de función desde una instrucción SQL */
SELECT cod_emp,nom_emp,salario,comision,obtener_salario(cod_emp) FROM
empleados;

/* Prueba de función desde un bloque */


SET serveroutput ON;
BEGIN
DBMS_OUTPUT.PUT_LINE('Probando el salario de COD_EMP 1 '||' >>>>
© Diseño de Amador Durán Toro, 2011

'||obtener_salario(1));
END;
/

diciembre 2011 Introducción a la Ingeniería del Software y a los Sistemas de Información 27


Script ejercicios 4

Escuela Técnica Superior DROP TABLE empleados;


de Ingeniería Informática
Departamento de Lenguajes CREATE TABLE empleados (dni char(4) PRIMARY KEY,
y Sistemas Informáticos
nomemp varchar2(15),
1. Procedimientos y cojefe char(4),
funciones
FOREIGN KEY (cojefe) references empleados);
1.1 Definición
1.2 Llamadas
1.3 Documenta-
--
ción -- Inserta datos de ejemplo en la tabla
1.4 Depuración --
2. Secuencias INSERT INTO empleados VALUES ('D1','Director',null);
2.1 Definición
INSERT INTO empleados VALUES ('D2','D.Comercial','D1');
3. Cursores
INSERT INTO empleados VALUES ('D3','D.Producción','D1');
3.1 Bucle FOR
3.2 Atributos
INSERT INTO empleados VALUES ('D4','Jefe Ventas','D2');
4. Ejercicios
INSERT INTO empleados VALUES ('D5','Jefe Marketing','D2');
5. Scripts INSERT INTO empleados VALUES ('D6','Vendedor 1','D4');
INSERT INTO empleados VALUES ('D7','Vendedor 2','D4');
INSERT INTO empleados VALUES ('D8','Vendedor 3','D4');
INSERT INTO empleados VALUES ('D9','Vendedor 4','D4');
INSERT INTO empleados VALUES ('D10','Obrero 1','D3');
INSERT INTO empleados VALUES ('D11','Obrero 2','D3');
INSERT INTO empleados VALUES ('D12','Obrero 3','D3');
INSERT INTO empleados VALUES ('D13','Secretario','D5');

© Diseño de Amador Durán Toro, 2011


diciembre 2011 Introducción a la Ingeniería del Software y a los Sistemas de Información 28

Script ejercicios 4

Escuela Técnica Superior


de Ingeniería Informática --
Departamento de Lenguajes
y Sistemas Informáticos -- Procedimientos anónimos para obtener los tres empleados con más
1. Procedimientos y
subordinados con bucle for
funciones --
1.1 Definición
1.2 Llamadas SET SERVEROUTPUT ON
1.3 Documenta-
ción
DECLARE
1.4 Depuración CURSOR c IS
2. Secuencias SELECT cojefe,count(*) AS cuenta FROM empleados
2.1 Definición GROUP BY cojefe ORDER BY 2 DESC;
3. Cursores
3.1 Bucle FOR BEGIN
3.2 Atributos DBMS_OUTPUT.PUT_LINE('Prueba cursor (3 superjefes) bucle FOR');
4. Ejercicios
FOR fila IN c LOOP
5. Scripts
EXIT WHEN C%ROWCOUNT >3;
DBMS_OUTPUT.PUT_LINE(fila.cojefe||' '||fila.cuenta);
END LOOP;
END;
/
© Diseño de Amador Durán Toro, 2011

diciembre 2011 Introducción a la Ingeniería del Software y a los Sistemas de Información 29


Script ejercicios 4
--
Escuela Técnica Superior
-- Procedimientos anónimos para obtener los tres empleados con más subordinados
de Ingeniería Informática con bucle normal
Departamento de Lenguajes
y Sistemas Informáticos

--
1. Procedimientos y
funciones DECLARE
1.1 Definición wjefe CHAR(4);
1.2 Llamadas wcount INTEGER;
1.3 Documenta- CURSOR c IS SELECT cojefe,count(*) AS cuenta FROM empleados
ción
1.4 Depuración
GROUP BY cojefe ORDER BY 2 DESC;
2. Secuencias
fila c%ROWTYPE;
2.1 Definición BEGIN
3. Cursores DBMS_OUTPUT.PUT_LINE('Prueba de cursor (3 superjefes) con
3.1 Bucle FOR Open/Fetch/Close ** BUCLE NORMAL');
3.2 Atributos OPEN c;
4. Ejercicios LOOP
5. Scripts
FETCH c INTO fila;
EXIT WHEN C%NOTFOUND OR c%ROWCOUNT >3;
DBMS_OUTPUT.PUT_LINE(fila.cojefe||' '||fila.cuenta);
END LOOP;
CLOSE c;
END;
/

© Diseño de Amador Durán Toro, 2011


diciembre 2011 Introducción a la Ingeniería del Software y a los Sistemas de Información 30

Script ejercicios 4
--
Escuela Técnica Superior -- Procedimientos anónimos para obtener los tres empleados con más subordinados
de Ingeniería Informática
Departamento de Lenguajes con bucle while
y Sistemas Informáticos

1. Procedimientos y DECLARE
funciones
wjefe CHAR(4);
1.1 Definición
wcount INTEGER;
1.2 Llamadas
1.3 Documenta-
CURSOR c IS
ción SELECT cojefe,count(*) AS cuenta FROM empleados
1.4 Depuración GROUP BY cojefe ORDER BY 2 DESC;
2. Secuencias fila c%ROWTYPE;
2.1 Definición
BEGIN
3. Cursores
DBMS_OUTPUT.PUT_LINE('Prueba de cursor (3 superjefes) con
3.1 Bucle FOR
3.2 Atributos
Open/Fetch/Close ** BUCLE WHILE');
4. Ejercicios
OPEN c;
5. Scripts WHILE c%ROWCOUNT<3 LOOP
FETCH c INTO fila;
EXIT WHEN C%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(fila.cojefe||' '||fila.cuenta);
END LOOP;
CLOSE c;
END;
/
© Diseño de Amador Durán Toro, 2011

-- Para no crear ningún objeto en la BD


ROLLBACK WORK;

diciembre 2011 Introducción a la Ingeniería del Software y a los Sistemas de Información 31

También podría gustarte