El documento describe la creación y uso de procedimientos almacenados en Oracle. Se crea una tabla de empleados y se ingresan registros. Luego, se crea un procedimiento almacenado llamado "pa_empleados_aumentarsueldo" que recibe como parámetro de entrada "ayear" y aumenta el sueldo de los empleados con esa cantidad de años o más en la empresa en un porcentaje determinado. El procedimiento se ejecuta para verificar que los sueldos aumentan correctamente.
3. Procedimientos almacenados
Un procedimiento almacenado es un conjunto de instrucciones a las que se les
da un nombre, se almacena en la base de datos activa. Permiten agrupar y
organizar tareas repetitivas.
Ventajas:
- comparten la lógica de la aplicación con las otras aplicaciones, con lo cual el
acceso y las modificaciones de los datos se hacen en un solo sitio.
- permiten realizar todas las operaciones que los usuarios necesitan evitando
que tengan acceso directo a las tablas.
- reducen el tráfico de red; en vez de enviar muchas instrucciones, los usuarios
realizan operaciones enviando una única instrucción, lo cual disminuye el
número de solicitudes entre el cliente y el servidor.
Un procedimiento almacenados puede hacer referencia a objetos que no
existen al momento de crearlo. Los objetos deben existir cuando se ejecute el
procedimiento almacenado.
4. Procedimientos Almacenados (crear- ejecutar)
• Al crear un procedimiento almacenado, las instrucciones que contiene se analizan para
verificar si son correctas sintácticamente. Si se encuentra algún error, el
procedimiento se compila, pero aparece un mensaje "con advertencias" que indica tal
situación.
• Un procedimiento almacenado se invoca llamándolo.
• En primer lugar se deben tipear y probar las instrucciones que se incluyen en el
procedimiento almacenado, luego, si se obtiene el resultado esperado, se crea el
procedimiento.
• Los procedimientos almacenados pueden hacer referencia a tablas, vistas, a funciones
definidas por el usuario, a otros procedimientos almacenados.
• Un procedimiento almacenado pueden incluir cualquier cantidad y tipo de
instrucciones DML (de manipulación de datos, como insert, update, delete), no
instrucciones DDL (de definición de datos, como create..., drop... alter...).
• Para crear un procedimiento almacenado empleamos la instrucción "create procedure".
La sintaxis básica parcial es:
• create or replace procedure NOMBREPROCEDIMIENTO
• As
• begin
• INSTRUCCIONES
• end;
5. Procedimientos Almacenados (crear- ejecutar)
• El bloque de instrucciones comienza luego de "begin" y acaba con "end".
• Si empleamos "or replace", se sobreescribe (se reemplaza) un procedimiento existente; si se
omite y existe un procedimiento con el nombre que le asignamos, Oracle mostrará un
mensaje de error indicando tal situación.
• Para diferenciar los procedimientos almacenados del sistema de los procedimientos
almacenados creados por el usuario use un prefijo, por ejemplo "pa_" cuando les de el
nombre.
• Con las siguientes instrucciones creamos un procedimiento almacenado llamado
"pa_libros_aumentar10" que incrementa en un 10% el precio de todos los libros:
create procedure pa_libros_aumentar10
as
update libros set precio=precio+precio*0.1;
• Entonces, creamos un procedimiento almacenado colocando "create procedure" (o "create
or replace", si es que desea reemplazar el existente), luego el nombre del procedimiento y
seguido de "as" las sentencias que definen el procedimiento.
• Para ejecutar el procedimiento almacenado creado anteriormente tipeamos:
• execute pa_libros_aumentar10;
• Entonces, para ejecutar un procedimiento almacenado colocamos "execute" seguido del
nombre del procedimiento.
6. PROBLEMA
Una librería almacena los datos de sus
libros en una tabla denominada "libros".
Eliminamos "libros", creamos la tabla y
luego ingresamos algunos registros:
drop table libros;
create table libros(
titulo varchar2(40),
autor varchar2(30),
editorial varchar2(20),
precio number(5,2) );
insert into libros values('Uno','Richard
Bach','Planeta',15);
insert into libros values('Ilusiones','Richard
Bach','Planeta',18);
insert into libros values('El
aleph','Borges','Emece',25);
insert into libros values('Aprenda
PHP','Mario Molina','Nuevo siglo',45);
insert into libros values('Matematica estas
ahi','Paenza','Nuevo siglo',12);
insert into libros values('Java en 10
minutos','Mario Molina','Paidos',35);
La librería, frecuentemente, aumenta los precios
de los libros en un 10%. Necesitamos un
procedimiento almacenado que actualice los
precios de los libros aumentándolos en un 10%:
create or replace procedure pa_libros_aumentar10
as
begin
update libros set precio=precio+(precio*0.1);
end;
Lo ejecutamos:
execute pa_libros_aumentar10;
Verificamos que los precios han aumentado:
select *from libros;
Volvemos a ejecutar el procedimiento:
execute pa_libros_aumentar10;
Verificamos que los precios han aumentado
nuevamente:
select *from libros
7. PRIMER PROBLEMA
Una empresa almacena los datos de sus
empleados en una tabla llamada "empleados".
1- Eliminamos la tabla y la creamos:
drop table empleados;
create table empleados(
documento char(8),
nombre varchar2(20),
apellido varchar2(20),
sueldo number(6,2),
cantidadhijos number(2,0),
fechaingreso date,
primary key(documento) );
2- Ingrese algunos registros:
insert into empleados
values('22222222','Juan','Perez',200,2,'10/
10/1980');
insert into empleados
values('22333333','Luis','Lopez',250,0,'01/
02/1990');
insert into empleados
values('22444444','Marta','Perez',350,1,'02
/05/1995');
insert into empleados
values('22555555','Susana','Garcia',400,2,'
15/12/2000');
insert into empleados
values('22666666','Jose
Maria','Morales',500,3,'25/08/2005');
3- Cree (o reemplace) el procedimiento
almacenado llamado "pa_aumentarsueldo" que
aumente los sueldos inferiores al promedio en
un 20%
4- Ejecute el procedimiento creado
anteriormente
5- Verifique que los sueldos han aumentado
6- Ejecute el procedimiento nuevamente
7- Verifique que los sueldos han aumentado
8- Elimine la tabla "empleados_antiguos"
9- Cree la tabla "empleados_antiguos"
create table empleados_antiguos(
documento char(8), nombre
varchar2(40) );
10- Cree (o reemplace) un procedimiento
almacenado que ingrese en la tabla
"empleados_antiguos" el documento, nombre y
apellido (concatenados) de todos los
empleados de la tabla "empleados" que
ingresaron a la empresa hace más de 10 años
11- Ejecute el procedimiento creado
anteriormente
12- Verifique que la tabla
"empleados_antiguos" ahora tiene registros (3
registros)
8. PROCEDIMIENTOS ALMACENADOS (PARÁMETROS DE ENTRADA)
Los procedimientos almacenados pueden recibir y devolver información; para ello se emplean
parámetros.
Veamos los primeros. Los parámetros de entrada posibilitan pasar información a un
procedimiento. Para que un procedimiento almacenado admita parámetros de entrada se
deben declarar al crearlo. La sintaxis es:
create or replace procedure NOMBREPROCEDIMIENTO (PARAMETRO in TIPODEDATO)
as
begin
INSTRUCCIONES;
end;
Los parámetros se definen luego del nombre del procedimiento. Pueden declararse varios
parámetros por procedimiento, se separan por comas.
Cuando el procedimiento es ejecutado, deben explicitarse valores para cada uno de los
parámetros (en el orden que fueron definidos), a menos que se haya definido un valor por
defecto, en tal caso, pueden omitirse.
Creamos un procedimiento que recibe el nombre de una editorial como parámetro y luego lo
utiliza para aumentar los precios de tal editorial:
create or replace procedure pa_libros_aumentar10(aeditorial in varchar2)
as
begin
update libros set precio=precio+(precio*0.1) where editorial=aeditorial;
end;
El procedimiento se ejecuta colocando "execute" (o "exec") seguido del nombre del
procedimiento y un valor para el parámetro:
execute pa_libros_aumentar10('Planeta');
Luego de definir un parámetro y su tipo, opcionalmente, se puede especificar un valor por
defecto; tal valor es el que asume el procedimiento al ser ejecutado si no recibe parámetros.
Si no se coloca valor por defecto, un procedimiento definido con parámetros no puede
ejecutarse sin valores para ellos. El valor por defecto puede ser "null" o una constante
9. PROCEDIMIENTOS ALMACENADOS (PARÁMETROS DE ENTRADA)
Creamos otro procedimiento que recibe 2 parámetros, el nombre de una editorial y el valor de
incremento (que tiene por defecto el valor 10):
create or replace procedure pa_libros_aumentar(aeditorial in varchar2,aporcentaje in number default 10)
as
begin
update libros set precio=precio+(precio*aporcentaje/100) where editorial=aeditorial;
end;
El procedimiento se ejecuta colocando "execute" (o "exec") seguido del nombre del
procedimiento y los valores para los parámetros separados por comas:
execute pa_libros_aumentar('Planeta',30);
Podemos omitir el segundo parámetro al invocar el procedimiento porque tiene establecido un
valor por defecto:
execute pa_libros_aumentar('Planeta');
En caso que un procedimiento tenga definidos varios parámetros con valores por defecto y al
invocarlo colocamos uno solo, Oracle asume que es el primero de ellos. si son de tipos de datos
diferentes, Oracle los convierte. Por ejemplo, definimos un procedimiento almacenado de la
siguiente manera:
create or replace procedure pa_libros_insertar (atitulo in varchar2 default null, aautor in varchar2 default
'desconocido', aeditorial in varchar2 default 'sin especificar', aprecio in number default 0) as
begin
insert into libros values (atitulo,aautor,aeditorial,aprecio);
end;
Si luego llamamos al procedimiento enviándoles solamente el primer y cuarto parámetro
correspondientes al título y precio:
execute pa_libros_insertar('Uno',100);
Oracle asume que los argumentos son el primero y segundo, el registro que se almacenará será:
Uno,100,sin especificar,0;
10. PROCEDIMIENTOS ALMACENADOS (PARÁMETROS DE ENTRADA)
Trabajamos con la tabla "libros" de una librería.
Eliminamos la tabla y la creamos nuevamente:
drop table libros;
create table libros(
titulo varchar2(40),
autor varchar2(30),
editorial varchar2(20),
precio number(5,2) );
Ingresamos algunos registros:
insert into libros values ('Uno','Richard Bach','Planeta',15);
insert into libros values ('Ilusiones','Richard
Bach','Planeta',12);
insert into libros values ('El aleph','Borges','Emece',25);
insert into libros values ('Aprenda PHP','Mario
Molina','Nuevo siglo',50);
insert into libros values ('Matematica estas
ahi','Paenza','Nuevo siglo',18);
insert into libros values ('Puente al infinito','Bach
Richard','Sudamericana',14);
insert into libros values ('Antología','J. L.
Borges','Paidos',24);
insert into libros values ('Java en 10 minutos','Mario
Molina','Siglo XXI',45);
insert into libros values ('Cervantes y el quijote','Borges-
Casares','Planeta',34);
Creamos un procedimiento que recibe el nombre de una
editorial y luego aumenta en un 10% los precios de los
libros de tal editorial:
create or replace procedure
pa_libros_aumentar10(aeditorial in varchar2)
as
begin
update libros set precio=precio+(precio*0.1) where
editorial=aeditorial;
end;
Ejecutamos el procedimiento:
execute pa_libros_aumentar10('Planeta');
Verificamos que los precios de los libros de la editorial
"Planeta" han aumentado un 10%:
select *from libros;
Creamos otro procedimiento que recibe 2 parámetros,
el nombre de una editorial y el valor de incremento (que
tiene por defecto el valor 10):
create or replace procedure
pa_libros_aumentar(aeditorial in varchar2,aporcentaje in
number default 10) as begin update libros set
precio=precio+(precio*aporcentaje/100) where
editorial=aeditorial; end;
Ejecutamos el procedimiento enviando valores para
ambos argumentos:
execute pa_libros_aumentar('Planeta',30);
Consultamos la tabla "libros" para verificar que los
precios de los libros de la editorial "Planeta" han sido
aumentados en un 30%:
select *from libros;
11. Ejecutamos el procedimiento "pa_libros_aumentar" omitiendo el segundo parámetro porque
tiene establecido un valor por defecto:
execute pa_libros_aumentar('Paidos');
Consultamos la tabla "libros" para verificar que los precios de los libros de la editorial "Paidos"
han sido aumentados en un 10% (valor por defecto):
select *from libros;
Definimos un procedimiento almacenado que ingrese un nuevo libro en la tabla "libros":
create or replace procedure pa_libros_insertar (atitulo in varchar2 default null, aautor in varchar2
default 'desconocido', aeditorial in varchar2 default 'sin especificar', aprecio in number default 0)
as begin insert into libros values (atitulo,aautor,aeditorial,aprecio); end;
Llamamos al procedimiento sin enviarle valores para los parámetros:
execute pa_libros_insertar;
Veamos cómo se almacenó el registro:
select *from libros;
Llamamos al procedimiento enviándole valores solamente para el primer y cuarto parámetros
correspondientes al título y precio:
execute pa_libros_insertar('Uno',100);
Oracle asume que los argumentos son el primero y segundo, vea cómo se almacenó el nuevo
registro:
select *from libros;
PROCEDIMIENTOS ALMACENADOS (PARÁMETROS DE ENTRADA)
12. Una empresa almacena los datos de sus
empleados en una tabla llamada "empleados".
1- Eliminamos la tabla y la creamos:
drop table empleados;
create table empleados(
documento char(8),
nombre varchar2(20),
apellido varchar2(20),
sueldo number(6,2),
fechaingreso date );
2- Ingrese algunos registros:
insert into empleados
values('22222222','Juan','Perez',300,'10/10
/1980');
insert into empleados
values('22333333','Luis','Lopez',300,'12/05/
1998');
insert into empleados
values('22444444','Marta','Perez',500,'25/0
8/1990');
insert into empleados
values('22555555','Susana','Garcia',400,'05
/05/2000');
insert into empleados
values('22666666','Jose
Maria','Morales',400,'24/10/2005');
3- Cree un procedimiento almacenado llamado
"pa_empleados_aumentarsueldo". Debe
incrementar el sueldo de los empleados con
cierta cantidad de años en la empresa
(parámetro "ayear" de tipo numérico) en un
porcentaje (parámetro "aporcentaje" de tipo
numerico); es decir, recibe 2 parámetros.
4- Ejecute el procedimiento creado
5- Verifique que los sueldos de los empleados con más de 10 años
en la empresa han aumentado un 20%
6- Ejecute el procedimiento creado anteriormente enviando otros
valores como parámetros (por ejemplo, 8 y 10)
7- Verifique que los sueldos de los empleados con más de 8 años
en la empresa han aumentado un 10%
8- Ejecute el procedimiento almacenado
"pa_empleados_aumentarsueldo" sin parámetros
9- Cree un procedimiento almacenado llamado
"pa_empleados_ingresar" que ingrese un empleado en la tabla
"empleados", debe recibir valor para el documento, el nombre,
apellido y almacenar valores nulos en los campos "sueldo" y
"fechaingreso"
10- Ejecute el procedimiento creado anteriormente y verifique si
se ha ingresado en "empleados" un nuevo registro
11- Reemplace el procedimiento almacenado llamado
"pa_empleados_ingresar" para que ingrese un empleado en la
tabla "empleados", debe recibir valor para el documento (con
valor por defecto nulo) y fechaingreso (con la fecha actual como
valor por defecto), los demás campos se llenan con valor nulo
12- Ejecute el procedimiento creado anteriormente enviándole
valores para los 2 parámetros y verifique si se ha ingresado en
"empleados" un nuevo registro
13- Ejecute el procedimiento creado anteriormente enviando
solamente la fecha de ingreso y vea el resultado
Oracle toma el valor enviado como primer argumento e intenta
ingresarlo en el campo "documento", muestra un mensaje de
error indicando que el valor es muy grande, ya que tal campo
admite 8 caracteres.
14- Cree (o reemplace) un procedimiento almacenado que reciba
un documento y elimine de la tabla "empleados" el empleado que
coincida con dicho documento
15- Elimine un empleado empleando el procedimiento del punto
anterior
16- Verifique la eliminación
PROCEDIMIENTOS ALMACENADOS (PARÁMETROS DE ENTRADA)