Sie sind auf Seite 1von 45

- Procedimientos almacenados (crear - ejecutar)

Los procedimientos almacenados se crean en la base de datos seleccionada, excepto los


procedimientos almacenados temporales, que se crean en la base de datos "tempdb".
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 y a tablas temporales.
Un procedimiento almacenado pueden incluir cualquier cantidad y tipo de instrucciones, excepto:
create default, create procedure, create rule, create trigger y create view.
Se pueden crear otros objetos (por ejemplo ndices, tablas), en tal caso deben especificar el
nombre del propietario; se pueden realizar inserciones, actualizaciones, eliminaciones, etc.
Si un procedimiento almacenado crea una tabla temporal, dicha tabla slo existe dentro del
procedimiento y desaparece al finalizar el mismo. Lo mismo sucede con las variables.
Hemos empleado varias veces procedimientos almacenados del sistema ("sp_help",
"sp_helpconstraint", etc.), ahora aprenderemos a crear nuestros propios procedimientos
almacenados.
Para crear un procedimiento almacenado empleamos la instruccin "create procedure".
La sintaxis bsica parcial es:
create procedure NOMBREPROCEDIMIENTO
as INSTRUCCIONES;
Para diferenciar los procedimientos almacenados del sistema de los procedimientos almacenados
locales use un prefijo diferente a "sp_" cuando les de el nombre.
Con las siguientes instrucciones creamos un procedimiento almacenado llamado
"pa_libros_limite_stock" que muestra todos los libros de los cuales hay menos de 10 disponibles:
create proc pa_libros_limite_stock
as
select *from libros
where cantidad <=10;
Entonces, creamos un procedimiento almacenado colocando "create procedure" (o "create proc",
que es la forma abreviada), luego el nombre del procedimiento y seguido de "as" las sentencias
que definen el procedimiento.
"create procedure" debe ser la primera sentencia de un lote.
Para ejecutar el procedimiento almacenado creado anteriormente tipeamos:

exec pa_libros_limite_stock;
Entonces, para ejecutar un procedimiento almacenado colocamos "execute" (o "exec") seguido del
nombre del procedimiento.
Cuando realizamos un ejercicio nuevo, siempre realizamos las mismas tareas: eliminamos la tabla
si existe, la creamos y luego ingresamos algunos registros. Podemos crear un procedimiento
almacenado que contenga todas estas instrucciones:
create procedure pa_crear_libros
as
if object_id('libros')is not null
drop table libros;
create table libros(
codigo int identity,
titulo varchar(40),
autor varchar(30),
editorial varchar(20),
precio decimal(5,2),
primary key(codigo)
);
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);
Y luego lo ejecutamos cada vez que comenzamos un nuevo ejercicio y as evitamos tipear tantas
sentencias:
exec pa_crear_libros;

120 - Procedimientos almacenados (crear - ejecutar)


Problema:
Vamos a crear un procedimiento almacenado que contenga las siguientes instrucciones:
- eliminacin de la tabla "libros" si existe;
- creacin de la tabla "libros" con: codigo, titulo, autor, editorial, precio, cantidad;
- ingresode algunos registros.
En primer lugar, debemos eliminarlo, si existe (no hemos aprendido an a eliminar
procedimientos almacenados, en prximos captulos lo veremos):
if object_id('pa_crear_libros') is not null
drop procedure pa_crear_libros;

Creamos el procedimiento:
create procedure pa_crear_libros
as
if object_id('libros')is not null
drop table libros
create table libros(
codigo int identity,
titulo varchar(40),
autor varchar(30),
editorial varchar(20),
precio decimal(5,2),
cantidad smallint,
primary key(codigo)
)
insert into libros values('Uno','Richard Bach','Planeta',15,5)
insert into libros values('Ilusiones','Richard Bach','Planeta',18,50)
insert into libros values('El aleph','Borges','Emece',25,9)
insert into libros values('Aprenda PHP','Mario Molina','Nuevo
siglo',45,100)
insert into libros values('Matematica estas ahi','Paenza','Nuevo
siglo',12,50)
insert into libros values('Java en 10 minutos','Mario
Molina','Paidos',35,300);
Disponemos un punto y coma (;) en la ltima instruccin del procedimiento almacenado.
Ejecutamos el procedimiento:
exec pa_crear_libros;
Veamos si ha creado la tabla:
select *from libros;
Ejecutamos el procedimiento almacenado del sistema "sp_help" y el nombre del procedimiento
almacenado para verificar que existe el procedimiento creado recientemente:
sp_help pa_crear_libros;
Aparece el nombre, propietario, tipo y fecha de creacin.
Necesitamos un procedimiento almacenado que muestre los libros de los cuales hay menos de 10.
En primer lugar, lo eliminamos si existe:
if object_id('pa_libros_limite_stock') is not null
drop procedure pa_libros_limite_stock;
Creamos el procedimiento:
create proc pa_libros_limite_stock
as
select *from libros
where cantidad <=10;

Ejecutamos el procedimiento almacenado del sistema "sp_help" junto al nombre del


procedimiento creado recientemente para verificar que existe:
sp_help pa_libros_limite_stock;
Aparece el nombre, propietario, tipo y fecha de creacin.
Lo ejecutamos:
exec pa_libros_limite_stock;
Modificamos algn registro y volvemos a ejecutar el procedimiento:
update libros set cantidad=2 where codigo=4;
exec pa_libros_limite_stock;
Note que el resultado del procedimiento ha cambiado porque los datos han cambiado.

if object_id('pa_crear_libros') is not null


drop procedure pa_crear_libros;

create procedure pa_crear_libros


as
if object_id('libros')is not null
drop table libros

create table libros(


codigo int identity,
titulo varchar(40),
autor varchar(30),
editorial varchar(20),
precio decimal(5,2),
cantidad smallint,
primary key(codigo)
)

insert into libros values('Uno','Richard Bach','Planeta',15,5)

insert into libros values('Ilusiones','Richard Bach','Planeta',18,50)


insert into libros values('El aleph','Borges','Emece',25,9)
insert into libros values('Aprenda PHP','Mario Molina','Nuevo siglo',45,100)
insert into libros values('Matematica estas ahi','Paenza','Nuevo siglo',12,50)
insert into libros values('Java en 10 minutos','Mario Molina','Paidos',35,300);

exec pa_crear_libros;

select *from libros;

sp_help pa_crear_libros;

if object_id('pa_libros_limite_stock') is not null


drop procedure pa_libros_limite_stock;

create proc pa_libros_limite_stock


as
select *from libros
where cantidad <=10;

sp_help pa_libros_limite_stock;

exec pa_libros_limite_stock;

update libros set cantidad=2 where codigo=4;


exec pa_libros_limite_stock;

120 - Procedimientos almacenados (crear - ejecutar)

Primer problema:
Una empresa almacena los datos de sus empleados en una tabla llamada "empleados".
1- Eliminamos la tabla, si existe y la creamos:
if object_id('empleados') is not null
drop table empleados;
create table empleados(
documento char(8),
nombre varchar(20),
apellido varchar(20),
sueldo decimal(6,2),
cantidadhijos tinyint,
seccion varchar(20),
primary key(documento)
);
2- Ingrese algunos registros:
insert into empleados values('22222222','Juan','Perez',300,2,'Contaduria');
insert into empleados values('22333333','Luis','Lopez',300,0,'Contaduria');
insert into empleados values ('22444444','Marta','Perez',500,1,'Sistemas');
insert into empleados values('22555555','Susana','Garcia',400,2,'Secretaria');
insert into empleados values('22666666','Jose Maria','Morales',400,3,'Secretaria');
3- Elimine el procedimiento llamado "pa_empleados_sueldo" si existe:
if object_id('pa_empleados_sueldo') is not null
drop procedure pa_empleados_sueldo;
4- Cree un procedimiento almacenado llamado "pa_empleados_sueldo" que seleccione
los nombres, apellidos y sueldos de los empleados.
5- Ejecute el procedimiento creado anteriormente.
6- Elimine el procedimiento llamado "pa_empleados_hijos" si existe:
if object_id('pa_empleados_hijos') is not null
drop procedure pa_empleados_hijos;
7- Cree un procedimiento almacenado llamado "pa_empleados_hijos" que seleccione
los nombres,
apellidos y cantidad de hijos de los empleados con hijos.
8- Ejecute el procedimiento creado anteriormente.
9- Actualice la cantidad de hijos de algn empleado sin hijos y vuelva a ejecutar el
procedimiento
para verificar que ahora si aparece en la lista.

if object_id('empleados') is not null


drop table empleados;
create table empleados(

documento char(8),
nombre varchar(20),
apellido varchar(20),
sueldo decimal(6,2),
cantidadhijos tinyint,
seccion varchar(20),
primary key(documento)
);
insert
insert
insert
insert
insert

into
into
into
into
into

empleados
empleados
empleados
empleados
empleados

values('22222222','Juan','Perez',300,2,'Contaduria');
values('22333333','Luis','Lopez',300,0,'Contaduria');
values ('22444444','Marta','Perez',500,1,'Sistemas');
values('22555555','Susana','Garcia',400,2,'Secretaria');
values('22666666','Jose Maria','Morales',400,3,'Secretaria');

if object_id('pa_empleados_sueldo') is not null


drop procedure pa_empleados_sueldo;
create procedure pa_empleados_sueldo
as
select nombre,apellido,sueldo
from empleados;
exec pa_empleados_sueldo;
if object_id('pa_empleados_hijos') is not null
drop procedure pa_empleados_hijos;
create procedure pa_empleados_hijos
as
select nombre,apellido,cantidadhijos
from empleados
where cantidadhijos>0;
exec pa_empleados_hijos;
update empleados set cantidadhijos=1 where documento='22333333';
exec pa_empleados_hijos;

121 - Procedimientos almacenados (eliminar)

Los procedimientos almacenados se eliminan con "drop procedure". Sintaxis:


drop procedure NOMBREPROCEDIMIENTO;
Eliminamos el procedimiento almacenado llamado "pa_libros_autor":
drop procedure pa_libros_autor;

Si el procedimiento que queremos eliminar no existe, aparece un mensaje de error, para evitarlo,
podemos emplear esta sintaxis:
if object_id('NOMBREPROCEDIMIENTO') is not null
drop procedure NOMBREPROCEDIMIENTO;
Eliminamos, si existe, el procedimiento "pa_libros_autor", si no existe, mostramos un mensaje:
if object_id('pa_libros_autor') is not null
drop procedure pa_libros_autor
else
select 'No existe el procedimiento "pa_libros_autor"';
"drop procedure" puede abreviarse con "drop proc".
Se recomienda ejecutar el procedimiento almacenado del sistema "sp_depends" para ver si algn
objeto depende del procedimiento que deseamos eliminar.
Podemos eliminar una tabla de la cual dependa un procedimiento, SQL Server lo permite, pero
luego, al ejecutar el procedimiento, aparecer un mensaje de error porque la tabla referenciada
no existe.

121 - Procedimientos almacenados (eliminar)


Problema:
Eliminamos, si existe, el procedimiento almacenado "pa_crear_libros":
if object_id('pa_crear_libros') is not null
drop procedure pa_crear_libros;
Verificamos que no existe ejecutando "sp_help":
sp_help pa_crear_libros;
Aparece un mensaje de error indicando que no existe.
Creamos el procedimiento:
create procedure pa_crear_libros
as
if object_id('libros')is not null
drop table libros
create table libros(
codigo int identity,
titulo varchar(40),
autor varchar(30),
editorial varchar(20),
precio decimal(5,2),
cantidad smallint,

primary key(codigo)
)
insert into libros values('Uno','Richard Bach','Planeta',15,5)
insert into libros values('Ilusiones','Richard Bach','Planeta',18,50)
insert into libros values('El aleph','Borges','Emece',25,9)
insert into libros values('Aprenda PHP','Mario Molina','Nuevo
siglo',45,100)
insert into libros values('Matematica estas ahi','Paenza','Nuevo
siglo',12,50)
insert into libros values('Java en 10 minutos','Mario
Molina','Paidos',35,300);
Verificamos que existe:
sp_help pa_crear_libros;
Aparece.
Lo eliminamos sin corroborar su existencia:
drop proc pa_crear_libros;
Vemos si aparece en la lista de objetos que muestra "sp_help":
sp_help pa_crear_libros;
Aparece un mensaje de error indicando que no existe.
Solicitamos su eliminacin nuevamente:
drop proc pa_crear_libros;
No existe, aparece un mensaje de error.
Solicitamos su eliminacin verificando si existe, si no existe, mostramos un mensaje:
if object_id('pa_crear_libros') is not null
drop proc pa_crear_libros
else
select 'No existe el procedimiento "pa_crear_libros"';

if object_id('pa_crear_libros') is not null


drop procedure pa_crear_libros;

sp_help pa_crear_libros;

create procedure pa_crear_libros

as
if object_id('libros')is not null
drop table libros
create table libros(
codigo int identity,
titulo varchar(40),
autor varchar(30),
editorial varchar(20),
precio decimal(5,2),
cantidad smallint,
primary key(codigo)
)
insert into libros values('Uno','Richard Bach','Planeta',15,5)
insert into libros values('Ilusiones','Richard Bach','Planeta',18,50)
insert into libros values('El aleph','Borges','Emece',25,9)
insert into libros values('Aprenda PHP','Mario Molina','Nuevo siglo',45,100)
insert into libros values('Matematica estas ahi','Paenza','Nuevo siglo',12,50)
insert into libros values('Java en 10 minutos','Mario Molina','Paidos',35,300);

sp_help pa_crear_libros;

drop proc pa_crear_libros;

sp_help pa_crear_libros;

drop proc pa_crear_libros;

if object_id('pa_crear_libros') is not null

drop proc pa_crear_libros


else
select 'No existe el procedimiento "pa_crear_libros"';

122 - Procedimientos almacenados (parmetros de entrada)


Los procedimientos almacenados pueden recibir y devolver informacin; para ello se emplean
parmetros, de entrada y salida, respectivamente.
Veamos los primeros. Los parmetros de entrada posibilitan pasar informacin a un
procedimiento.
Para que un procedimiento almacenado admita parmetros de entrada se deben declarar
variables como parmetros al crearlo. La sintaxis es:
create proc NOMBREPROCEDIMIENTO
@NOMBREPARAMETRO TIPO =VALORPORDEFECTO
as SENTENCIAS;
Los parmetros se definen luego del nombre del procedimiento, comenzando el nombre con un
signo arroba (@). Los parmetros son locales al procedimiento, es decir, existen solamente dentro
del mismo. Pueden declararse varios parmetros por procedimiento, se separan por comas.
Cuando el procedimiento es ejecutado, deben explicitarse valores para cada uno de los
parmetros (en el orden que fueron definidos), a menos que se haya definido un valor por
defecto, en tal caso, pueden omitirse. Pueden ser de cualquier tipo de dato (excepto cursor).
Luego de definir un parmetro 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 parmetros. Si
no se coloca valor por defecto, un procedimiento definido con parmetros no puede ejecutarse
sin valores para ellos. El valor por defecto puede ser "null" o una constante, tambin puede
incluir comodines si el procedimiento emplea "like".
Creamos un procedimiento que recibe el nombre de un autor como parmetro para mostrar todos
los libros del autor solicitado:
create procedure pa_libros_autor
@autor varchar(30)
as
select titulo, editorial,precio
from libros
where autor= @autor;
El procedimiento se ejecuta colocando "execute" (o "exec") seguido del nombre del procedimiento
y un valor para el parmetro:
exec pa_libros_autor 'Borges';
Creamos un procedimiento que recibe 2 parmetros, el nombre de un autor y el de una editorial:

create procedure pa_libros_autor_editorial


@autor varchar(30),
@editorial varchar(20)
as
select titulo, precio
from libros
where autor= @autor and
editorial=@editorial;
El procedimiento se ejecuta colocando "execute" (o "exec") seguido del nombre del procedimiento
y los valores para los parmetros separados por comas:
exec pa_libros_autor_editorial 'Richard Bach','Planeta';
Los valores de un parmetro pueden pasarse al procedimiento mediante el nombre del parmetro
o por su posicin. La sintaxis anterior ejecuta el procedimiento pasando valores a los parmetros
por posicin. Tambin podemos emplear la otra sintaxis en la cual pasamos valores a los
parmetros por su nombre:
exec pa_libros_autor_editorial @editorial='Planeta', @autor='Richard
Bach';
Cuando pasamos valores con el nombre del parmetro, el orden en que se colocan puede
alterarse.
No podramos ejecutar el procedimiento anterior sin valores para los parmetros. Si queremos
ejecutar un procedimiento que permita omitir los valores para los parmetros debemos, al crear
el procedimiento, definir valores por defecto para cada parmetro:
create procedure pa_libros_autor_editorial2
@autor varchar(30)='Richard Bach',
@editorial varchar(20)='Planeta'
as
select titulo, autor,editorial,precio
from libros
where autor= @autor and
editorial=@editorial;
Podemos ejecutar el procedimiento anterior sin enviarle valores, usar los predeterminados.
Si enviamos un solo parmetro a un procedimiento que tiene definido ms de un parmetro sin
especificar a qu parmetro corresponde (valor por posicin), asume que es el primero. Es decir,
SQL Server asume que los valores se dan en el orden que fueron definidos, no se puede
interrumpir la secuencia.
Si queremos especificar solamente el segundo parmetro, debemos emplear la sintaxis de paso de
valores a parmetros por nombre:
exec pa_libros_autor_editorial2 @editorial='Paidos';
Podemos emplear patrones de bsqueda en la consulta que define el procedimiento almacenado y
utilizar comodines como valores por defecto:
create proc pa_libros_autor_editorial3
@autor varchar(30) = '%',
@editorial varchar(30) = '%'

as
select titulo,autor,editorial,precio
from libros
where autor like @autor and
editorial like @editorial;
La sentencia siguiente ejecuta el procedimiento almacenado "pa_libros_autor_editorial3"
enviando un valor por posicin, se asume que es el primero.
exec pa_libros_autor_editorial3 'P%';
La sentencia siguiente ejecuta el procedimiento almacenado "pa_libros_autor_editorial3"
enviando un valor para el segundo parmetro, para el primer parmetro toma el valor por
defecto:
exec pa_libros_autor_editorial3 @editorial='P%';
Tambin podramos haber tipeado:
exec pa_libros_autor_editorial3 default, 'P%';

122 - Procedimientos almacenados (parmetros de entrada)

Problema:
Trabajamos con la tabla "libros" de una librera.
Eliminamos la tabla si existe y la creamos nuevamente:
if object_id('libros') is not null
drop table libros;
create table libros(
codigo int identity,
titulo varchar(40),
autor varchar(30),
editorial varchar(20),
precio decimal(5,2),
primary key(codigo)
);
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 ('Antologa','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','BorgesCasares','Planeta',34);
Eliminamos el procedimiento almacenado "pa_libros_autor" si existe:
if object_id('pa_libros_autor') is not null
drop procedure pa_libros_autor;
Creamos el procedimiento para que reciba el nombre de un autor y muestre todos los libros del
autor solicitado:
create procedure pa_libros_autor
@autor varchar(30)
as
select titulo, editorial,precio
from libros
where autor= @autor;
Ejecutamos el procedimiento:
exec pa_libros_autor 'Richard Bach';
Empleamos la otra sintaxis (por nombre) y pasamos otro valor:
exec pa_libros_autor @autor='Borges';
Eliminamos, si existe, el procedimiento "pa_libros_autor_editorial":
if object_id('pa_libros_autor_editorial') is not null
drop procedure pa_libros_autor_editorial;
Creamos un procedimiento "pa_libros_autor_editorial" que recibe 2 parmetros, el nombre de un
autor y el de una editorial:
create procedure pa_libros_autor_editorial
@autor varchar(30),
@editorial varchar(20)
as
select titulo, precio
from libros
where autor= @autor and
editorial=@editorial;
Ejecutamos el procedimiento enviando los parmetros por posicin:
exec pa_libros_autor_editorial 'Richard Bach','Planeta';
Ejecutamos el procedimiento enviando otros valores y lo hacemos por nombre:
exec pa_libros_autor_editorial @autor='Borges',@editorial='Emece';
Si ejecutamos el procedimiento omitiendo los parmetros, aparecer un mensaje de error.

Eliminamos, si existe, el procedimiento "pa_libros_autor_editorial2":


if object_id('pa_libros_autor_editorial2') is not null
drop procedure pa_libros_autor_editorial2;
Creamos el procedimiento almacenado "pa_libros_autor_editorial2" que recibe los mismos
parmetros, esta vez definimos valores por defecto para cada parmetro:
create procedure pa_libros_autor_editorial2
@autor varchar(30)='Richard Bach',
@editorial varchar(20)='Planeta'
as
select titulo,autor,editorial,precio
from libros
where autor= @autor and
editorial=@editorial;
Ejecutamos el procedimiento anterior sin enviarle valores para verificar que usa los valores por
defecto:
exec pa_libros_autor_editorial2;
Muestra los libros de "Richard Bach" y editorial "Planeta" (valores por defecto).
Enviamos un solo parmetro al procedimiento:
exec pa_libros_autor_editorial2 'Planeta';
SQL Server asume que es el primero, y no hay registros cuyo autor sea "Planeta".
Especificamos el segundo parmetro, enviando parmetros por nombre:
exec pa_libros_autor_editorial2 @editorial='Planeta';
Muestra los libros de "Richard Bach" (valor por defecto para "autor") de la editorial enviada como
argumento ("Planeta").
Ejecutamos el procedimiento enviando parmetros por nombre en distinto orden:
exec pa_libros_autor_editorial2 @editorial='Nuevo
siglo',@autor='Paenza';
Definimos un procedimiento empleando patrones de bsqueda (antes verificamos si existe para
eliminarlo):
if object_id('pa_libros_autor_editorial3') is not null
drop procedure pa_libros_autor_editorial3;
create proc pa_libros_autor_editorial3
@autor varchar(30) = '%',
@editorial varchar(30) = '%'
as
select titulo,autor,editorial,precio
from libros
where autor like @autor and
editorial like @editorial;
Ejecutamos el procedimiento enviando parmetro por posicin, asume que es el primero:

exec pa_libros_autor_editorial3 'P%';


La sentencia anterior ejecuta el procedimiento almacenado "pa_libros_autor_editorial3" enviando
un valor que es asumido como el primero y para el segundo parmetro toma el valor por defecto;
muestra los libros cuyo autor comience con "P", de cualquier editorial.
Ejecutamos el procedimiento especificando que el valor corresponde al segundo parmetro:
exec pa_libros_autor_editorial3 @editorial='P%';
La sentencia anterior ejecuta el procedimiento almacenado "pa_libros_autor_editorial3" enviando
un valor para el segundo parmetro, para el primer parmetro toma el valor por defecto;
muestra los libros de cualquier autor cuya editorial comience con "P".
La sentencia siguiente muestra lo mismo que la anterior:
exec pa_libros_autor_editorial3 default, 'P%';

if object_id('libros') is not null


drop table libros;

create table libros(


codigo int identity,
titulo varchar(40),
autor varchar(30),
editorial varchar(20),
precio decimal(5,2),
primary key(codigo)
);

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 ('Antologa','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);

if object_id('pa_libros_autor') is not null


drop procedure pa_libros_autor;

create procedure pa_libros_autor


@autor varchar(30)
as
select titulo, editorial,precio
from libros
where autor= @autor;

exec pa_libros_autor 'Richard Bach';

exec pa_libros_autor @autor='Borges';

if object_id('pa_libros_autor_editorial') is not null


drop procedure pa_libros_autor_editorial;

create procedure pa_libros_autor_editorial


@autor varchar(30),
@editorial varchar(20)
as

select titulo, precio


from libros
where autor= @autor and
editorial=@editorial;

exec pa_libros_autor_editorial 'Richard Bach','Planeta';

exec pa_libros_autor_editorial @autor='Borges',@editorial='Emece';

if object_id('pa_libros_autor_editorial2') is not null


drop procedure pa_libros_autor_editorial2;

create procedure pa_libros_autor_editorial2


@autor varchar(30)='Richard Bach',
@editorial varchar(20)='Planeta'
as
select titulo,autor,editorial,precio
from libros
where autor= @autor and
editorial=@editorial;

exec pa_libros_autor_editorial2;

exec pa_libros_autor_editorial2 'Planeta';

exec pa_libros_autor_editorial2 @editorial='Planeta';

exec pa_libros_autor_editorial2 @editorial='Nuevo siglo',@autor='Paenza';

if object_id('pa_libros_autor_editorial3') is not null


drop procedure pa_libros_autor_editorial3;

create proc pa_libros_autor_editorial3


@autor varchar(30) = '%',
@editorial varchar(30) = '%'
as
select titulo,autor,editorial,precio
from libros
where autor like @autor and
editorial like @editorial;

exec pa_libros_autor_editorial3 'P%';

exec pa_libros_autor_editorial3 @editorial='P%';

exec pa_libros_autor_editorial3 default, 'P%';

122 - Procedimientos almacenados (parmetros de entrada)


Primer problema:
Una empresa almacena los datos de sus empleados en una tabla llamada "empleados".
1- Eliminamos la tabla, si existe y la creamos:
if object_id('empleados') is not null
drop table empleados;
create table empleados(
documento char(8),
nombre varchar(20),

apellido varchar(20),
sueldo decimal(6,2),
cantidadhijos tinyint,
seccion varchar(20),
primary key(documento)
);
2- Ingrese algunos registros:
insert into empleados values('22222222','Juan','Perez',300,2,'Contaduria');
insert into empleados values('22333333','Luis','Lopez',300,0,'Contaduria');
insert into empleados values ('22444444','Marta','Perez',500,1,'Sistemas');
insert into empleados values('22555555','Susana','Garcia',400,2,'Secretaria');
insert into empleados values('22666666','Jose Maria','Morales',400,3,'Secretaria');
3- Elimine el procedimiento llamado "pa_empleados_sueldo" si existe:
if object_id('pa_empleados_sueldo') is not null
drop procedure pa_empleados_sueldo;
4- Cree un procedimiento almacenado llamado "pa_empleados_sueldo" que seleccione
los nombres,
apellidos y sueldos de los empleados que tengan un sueldo superior o igual al enviado
como
parmetro.
5- Ejecute el procedimiento creado anteriormente con distintos valores:
exec pa_empleados_sueldo 400;
exec pa_empleados_sueldo 500;
6- Ejecute el procedimiento almacenado "pa_empleados_sueldo" sin parmetros.
Mensaje de error.
7- Elimine el procedimiento almacenado "pa_empleados_actualizar_sueldo" si existe:
if object_id('pa_empleados_actualizar_sueldo') is not null
drop procedure pa_empleados_actualizar_sueldo;
8- Cree un procedimiento almacenado llamado "pa_empleados_actualizar_sueldo" que
actualice los
sueldos iguales al enviado como primer parmetro con el valor enviado como segundo
parmetro.
9- Ejecute el procedimiento creado anteriormente y verifique si se ha ejecutado
correctamente:
exec pa_empleados_actualizar_sueldo 300,350;
select *from empleados;
10- Ejecute el procedimiento "pa_empleados_actualizar_sueldo" enviando un solo
parmetro.
Error.
11- Ejecute el procedimiento almacenado "pa_empleados_actualizar_sueldo" enviando
en primer lugar el
parmetro @sueldonuevo y en segundo lugar @sueldoanterior (parmetros por
nombre).

12- Verifique el cambio:


select *from empleados;
13- Elimine el procedimiento almacenado "pa_sueldototal", si existe:
if object_id('pa_sueldototal') is not null
drop procedure pa_sueldototal;
14- Cree un procedimiento llamado "pa_sueldototal" que reciba el documento de un
empleado y muestre
su nombre, apellido y el sueldo total (resultado de la suma del sueldo y salario por
hijo, que es de
$200 si el sueldo es menor a $500 y $100, si el sueldo es mayor o igual a $500).
Coloque como valor
por defecto para el parmetro el patrn "%".
15- Ejecute el procedimiento anterior enviando diferentes valores:
exec pa_sueldototal '22333333';
exec pa_sueldototal '22444444';
exec pa_sueldototal '22666666';
16- Ejecute el procedimiento sin enviar parmetro para que tome el valor por defecto.
Muestra los 5 registros.

if object_id('empleados') is not null


drop table empleados;
create table empleados(
documento char(8),
nombre varchar(20),
apellido varchar(20),
sueldo decimal(6,2),
cantidadhijos tinyint,
seccion varchar(20),
primary key(documento)
);
insert
insert
insert
insert
insert

into
into
into
into
into

empleados
empleados
empleados
empleados
empleados

values('22222222','Juan','Perez',300,2,'Contaduria');
values('22333333','Luis','Lopez',300,0,'Contaduria');
values ('22444444','Marta','Perez',500,1,'Sistemas');
values('22555555','Susana','Garcia',400,2,'Secretaria');
values('22666666','Jose Maria','Morales',400,3,'Secretaria');

if object_id('pa_empleados_sueldo') is not null


drop procedure pa_empleados_sueldo;
create procedure pa_empleados_sueldo
@sueldo decimal(6,2)
as
select nombre,apellido,sueldo

from empleados
where sueldo>=@sueldo;
exec pa_empleados_sueldo 400;
exec pa_empleados_sueldo 500;
exec pa_empleados_sueldo;
if object_id('pa_empleados_actualizar_sueldo') is not null
drop procedure pa_empleados_actualizar_sueldo;
create procedure pa_empleados_actualizar_sueldo
@sueldoanterior decimal(6,2),
@sueldonuevo decimal(6,2)
as
update empleados set sueldo=@sueldonuevo
where sueldo=@sueldoanterior;
exec pa_empleados_actualizar_sueldo 300,350;
select *from empleados;
exec pa_empleados_actualizar_sueldo 350;
exec pa_empleados_actualizar_sueldo @sueldonuevo=400,@sueldoanterior=350;
select *from empleados;
if object_id('pa_sueldototal') is not null
drop procedure pa_sueldototal;
create procedure pa_sueldototal
@documento varchar(8) = '%'
as
select nombre,apellido,
sueldototal=
case
when sueldo<500 then sueldo+(cantidadhijos*200)
when sueldo>=500 then sueldo+(cantidadhijos*100)
end
from empleados
where documento like @documento;
exec pa_sueldototal '22333333';
exec pa_sueldototal '22444444';
exec pa_sueldototal '22666666';
exec pa_sueldototal;

123 - Procedimientos almacenados (parmetros de salida)

Dijimos que los procedimientos almacenados pueden devolver informacin; para ello se emplean
parmetros de salida. El valor se retorna a quien realiz la llamada con parmetros de salida.
Para que un procedimiento almacenado devuelva un valor se debe declarar una variable con la
palabra clave "output" al crear el procedimiento:
create procedure NOMBREPROCEDIMIENTO
@PARAMETROENTRADA TIPO =VALORPORDEFECTO,
@PARAMETROSALIDA TIPO=VALORPORDEFECTO output
as
SENTENCIAS
select @PARAMETROSALIDA=SENTENCIAS;
Los parmetros de salida pueden ser de cualquier tipo de datos, excepto text, ntext e image.
Creamos un procedimiento almacenado al cual le enviamos 2 nmeros y retorna el promedio:
create procedure pa_promedio
@n1 decimal(4,2),
@n2 decimal(4,2),
@resultado decimal(4,2) output
as
select @resultado=(@n1+@n2)/2;
Al ejecutarlo tambin debe emplearse "output":
declare @variable decimal(4,2)
execute pa_promedio 5,6, @variable output
select @variable;
Declaramos una variable para guardar el valor devuelto por el procedimiento; ejecutamos el
procedimiento envindole 2 valores y mostramos el resultado.
La instruccin que realiza la llamada al procedimiento debe contener un nombre de variable para
almacenar el valor retornado.
Creamos un procedimiento almacenado que muestre los ttulos, editorial y precio de los libros de
un determinado autor (enviado como parmetro de entrada) y nos retorne la suma y el promedio
de los precios de todos los libros del autor enviado:
create procedure pa_autor_sumaypromedio
@autor varchar(30)='%',
@suma decimal(6,2) output,
@promedio decimal(6,2) output
as
select titulo,editorial,precio
from libros
where autor like @autor
select @suma=sum(precio)
from libros
where autor like @autor
select @promedio=avg(precio)
from libros
where autor like @autor;

Ejecutamos el procedimiento y vemos el contenido de las variables en las que almacenamos los
parmetros de salida del procedimiento:
declare @s decimal(6,2), @p decimal(6,2)
execute pa_autor_sumaypromedio 'Richard Bach', @s output, @p output
select @s as total, @p as promedio;

123 - Procedimientos almacenados (parmetros de salida)


Problema:
Eliminamos el procedimiento almacenado "pa_promedio", si existe:
if object_id('pa_promedio') is not null
drop proc pa_promedio;
Creamos un procedimiento almacenado al cual le enviamos 2 nmeros decimales y retorna el
promedio:
create procedure pa_promedio
@n1 decimal(4,2),
@n2 decimal(4,2),
@resultado decimal(4,2) output
as
select @resultado=(@n1+@n2)/2;
Lo ejecutamos enviando diferentes valores:
declare @variable decimal(4,2)
execute pa_promedio 5,6, @variable output
select @variable
execute pa_promedio 5.3,4.7, @variable output
select @variable
execute pa_promedio 9,10, @variable output
select @variable;
Trabajamos con la tabla "libros" de una librera.
Eliminamos la tabla si existe y la creamos nuevamente:
if object_id('libros') is not null
drop table libros;
create table libros(
codigo int identity,
titulo varchar(40),
autor varchar(30),
editorial varchar(20),
precio decimal(5,2),
primary key(codigo)

);
Ingresamos algunos registros:
insert into libros values
insert into libros values
insert into libros values
insert into libros values
siglo',50);
insert into libros values
siglo',18);
insert into libros values
Bach','Sudamericana',14);
insert into libros values
insert into libros values
XXI',45);
insert into libros values

('Uno','Richard Bach','Planeta',15);
('Ilusiones','Richard Bach','Planeta',12);
('El aleph','Borges','Emece',25);
('Aprenda PHP','Mario Molina','Nuevo
('Matematica estas ahi','Paenza','Nuevo
('Puente al infinito','Richard
('Antologa','J. L. Borges','Paidos',24);
('Java en 10 minutos','Mario Molina','Siglo
('Antologa','Borges','Planeta',34);

Eliminamos el procedimiento almacenado "pa_autor_sumaypromedio", si existe:


if object_id('pa_autor_sumaypromedio') is not null
drop proc pa_autor_sumaypromedio;
Creamos un procedimiento almacenado que muestre los ttulos, editorial y precio de los libros de
un determinado autor (enviado como parmetro de entrada) y nos retorne la suma y el promedio
de los precios de todos los libros del autor enviado:
create procedure pa_autor_sumaypromedio
@autor varchar(30)='%',
@suma decimal(6,2) output,
@promedio decimal(6,2) output
as
select titulo,editorial,precio
from libros
where autor like @autor
select @suma=sum(precio)
from libros
where autor like @autor
select @promedio=avg(precio)
from libros
where autor like @autor;
Ejecutamos el procedimiento enviando distintos valores:
declare @s decimal(6,2), @p decimal(6,2)
execute pa_autor_sumaypromedio 'Richard Bach', @s output, @p output
select @s as total, @p as promedio
execute pa_autor_sumaypromedio 'Borges', @s output, @p output
select @s as total, @p as promedio
execute pa_autor_sumaypromedio 'Mario Molina', @s output, @p output
select @s as total, @p as promedio

Ejecutamos el procedimiento sin pasar el parmetro para autor. Recuerde que en estos casos
debemos colocar los nombres de las variables.
declare @s decimal(6,2), @p decimal(6,2)
execute pa_autor_sumaypromedio @suma=@s output,@promedio= @p output
select @s as total, @p as promedio;

if object_id('pa_promedio') is not null


drop proc pa_promedio;

create procedure pa_promedio


@n1 decimal(4,2),
@n2 decimal(4,2),
@resultado decimal(4,2) output
as
select @resultado=(@n1+@n2)/2;

declare @variable decimal(4,2)


execute pa_promedio 5,6, @variable output
select @variable

execute pa_promedio 5.3,4.7, @variable output


select @variable

execute pa_promedio 9,10, @variable output


select @variable;

if object_id('libros') is not null


drop table libros;

create table libros(


codigo int identity,
titulo varchar(40),
autor varchar(30),
editorial varchar(20),
precio decimal(5,2),
primary key(codigo)
);

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','Richard Bach','Sudamericana',14);
insert into libros values ('Antologa','J. L. Borges','Paidos',24);
insert into libros values ('Java en 10 minutos','Mario Molina','Siglo XXI',45);
insert into libros values ('Antologa','Borges','Planeta',34);

if object_id('pa_autor_sumaypromedio') is not null


drop proc pa_autor_sumaypromedio;

create procedure pa_autor_sumaypromedio


@autor varchar(30)='%',
@suma decimal(6,2) output,
@promedio decimal(6,2) output

as
select titulo,editorial,precio
from libros
where autor like @autor
select @suma=sum(precio)
from libros
where autor like @autor
select @promedio=avg(precio)
from libros
where autor like @autor;

declare @s decimal(6,2), @p decimal(6,2)


execute pa_autor_sumaypromedio 'Richard Bach', @s output, @p output
select @s as total, @p as promedio

execute pa_autor_sumaypromedio 'Borges', @s output, @p output


select @s as total, @p as promedio

execute pa_autor_sumaypromedio 'Mario Molina', @s output, @p output


select @s as total, @p as promedio;

declare @s decimal(6,2), @p decimal(6,2)


execute pa_autor_sumaypromedio @suma=@s output,@promedio= @p output
select @s as total, @p as promedio;

123 - Procedimientos almacenados (parmetros de salida)

Primer problema:
Una empresa almacena los datos de sus empleados en una tabla llamada "empleados".
1- Eliminamos la tabla, si existe y la creamos:
if object_id('empleados') is not null
drop table empleados;
create table empleados(
documento char(8),
nombre varchar(20),
apellido varchar(20),
sueldo decimal(6,2),
cantidadhijos tinyint,
seccion varchar(20),
primary key(documento)
);
2- Ingrese algunos registros:
insert into empleados values('22222222','Juan','Perez',300,2,'Contaduria');
insert into empleados values('22333333','Luis','Lopez',350,0,'Contaduria');
insert into empleados values ('22444444','Marta','Perez',500,1,'Sistemas');
insert into empleados values('22555555','Susana','Garcia',null,2,'Secretaria');
insert into empleados values('22666666','Jose Maria','Morales',460,3,'Secretaria');
insert into empleados values('22777777','Andres','Perez',580,3,'Sistemas');
insert into empleados values('22888888','Laura','Garcia',400,3,'Secretaria');
3- Elimine el procedimiento llamado "pa_seccion" si existe:
if object_id('pa_seccion') is not null
drop procedure pa_seccion;
4- Cree un procedimiento almacenado llamado "pa_seccion" al cual le enviamos el
nombre de una
seccin y que nos retorne el promedio de sueldos de todos los empleados de esa
seccin y el valor
mayor de sueldo (de esa seccin)
5- Ejecute el procedimiento creado anteriormente con distintos valores.
6- Ejecute el procedimiento "pa_seccion" sin pasar valor para el parmetro "seccin".
Luego muestre
los valores devueltos por el procedimiento.
Calcula sobre todos los registros porque toma el valor por defecto.
7- Elimine el procedimiento almacenado "pa_sueldototal", si existe y cree un
procedimiento con ese
nombre que reciba el documento de un empleado y retorne el sueldo total, resultado
de la suma del
sueldo y salario por hijo, que es $200 si el sueldo es menor a $500 y $100 si es mayor
o igual.
8- Ejecute el procedimiento anterior enviando un documento existente.

9- Ejecute el procedimiento anterior enviando un documento inexistente.


Retorna "null".
10- Ejecute el procedimiento anterior enviando el documento de un empleado en cuyo
campo "sueldo"
contenga "null".
Retorna "null".
11- Ejecute el procedimiento anterior sin enviar valor para el parmetro "documento".
Retorna el valor calculado del ltimo registro.
if object_id('empleados') is not null
drop table empleados;
create table empleados(
documento char(8),
nombre varchar(20),
apellido varchar(20),
sueldo decimal(6,2),
cantidadhijos tinyint,
seccion varchar(20),
primary key(documento)
);
insert
insert
insert
insert
insert
insert
insert

into
into
into
into
into
into
into

empleados
empleados
empleados
empleados
empleados
empleados
empleados

values('22222222','Juan','Perez',300,2,'Contaduria');
values('22333333','Luis','Lopez',350,0,'Contaduria');
values ('22444444','Marta','Perez',500,1,'Sistemas');
values('22555555','Susana','Garcia',null,2,'Secretaria');
values('22666666','Jose Maria','Morales',460,3,'Secretaria');
values('22777777','Andres','Perez',580,3,'Sistemas');
values('22888888','Laura','Garcia',400,3,'Secretaria');

if object_id('pa_seccion') is not null


drop procedure pa_seccion;
create procedure pa_seccion
@seccion varchar(20)='%',
@promedio decimal(6,2) output,
@mayor decimal(6,2) output
as
select @promedio=avg(sueldo)
from empleados
where seccion like @seccion
select @mayor=max(sueldo)
from empleados
where seccion like @seccion;
declare @p decimal(6,2), @m decimal(6,2)
execute pa_seccion 'Contaduria', @p output, @m output
select @p as promedio, @m as mayor
execute pa_seccion 'Secretaria', @p output, @m output
select @p as promedio, @m as mayor;

declare @p decimal(6,2), @m decimal(6,2)


execute pa_seccion @promedio=@p output,@mayor= @m output
select @p as promedio, @m as mayor;
if object_id('pa_sueldototal') is not null
drop procedure pa_sueldototal;
create procedure pa_sueldototal
@documento varchar(8)='%',
@sueldototal decimal(8,2) output
as
select @sueldototal=
case
when sueldo<500 then sueldo+(cantidadhijos*200)
when sueldo>=500 then sueldo+(cantidadhijos*100)
end
from empleados
where documento like @documento;
declare @st decimal(8,2)
exec pa_sueldototal '22666666', @st output
select @st;
declare @st decimal(8,2)
exec pa_sueldototal '22999999', @st output
select @st;
declare @st decimal(8,2)
exec pa_sueldototal '22555555', @st output
select @st;
declare @st decimal(8,2)
exec pa_sueldototal @sueldototal=@st output
select @st;

124 - Procedimientos almacenados (return)

La instruccin "return" sale de una consulta o procedimiento y todas las instrucciones posteriores
no son ejecutadas.
Creamos un procedimiento que muestre todos los libros de un autor determinado que se ingresa
como parmetro. Si no se ingresa un valor, o se ingresa "null", se muestra un mensaje y se sale del
procedimiento:
create procedure pa_libros_autor
@autor varchar(30)=null

as
if @autor is null
begin
select 'Debe indicar un autor'
return
end;
select titulo from libros where autor = @autor;
Si al ejecutar el procedimiento enviamos el valor "null" o no pasamos valor, con lo cual toma el
valor por defecto "null", se muestra un mensaje y se sale; en caso contrario, ejecuta la consulta
luego del "else".
"return" puede retornar un valor entero.
Un procedimiento puede retornar un valor de estado para indicar si se ha ejecutado
correctamente o no.
Creamos un procedimiento almacenado que ingresa registros en la tabla "libros". Los parmetros
correspondientes al ttulo y autor DEBEN ingresarse con un valor distinto de "null", los dems son
opcionales. El procedimiento retorna "1" si la insercin se realiza, es decir, si se ingresan valores
para ttulo y autor y "0", en caso que ttulo o autor sean nulos:
create procedure pa_libros_ingreso
@titulo varchar(40)=null,
@autor varchar(30)=null,
@editorial varchar(20)=null,
@precio decimal(5,2)=null
as
if (@titulo is null) or (@autor is null)
return 0
else
begin
insert into libros values (@titulo,@autor,@editorial,@precio)
return 1
end;
Para ver el resultado, debemos declarar una variable en la cual se almacene el valor devuelto por
el procedimiento; luego, ejecutar el procedimiento asignndole el valor devuelto a la variable,
finalmente mostramos el contenido de la variable:
declare @retorno int
exec @retorno=pa_libros_ingreso 'Alicia en el pais...','Lewis Carroll'
select 'Ingreso realizado=1' = @retorno
exec @retorno=pa_libros_ingreso
select 'Ingreso realizado=1' = @retorno;
Tambin podramos emplear un "if" para controlar el valor de la variable de retorno:
declare @retorno int;
exec @retorno=pa_libros_ingreso 'El gato con botas','Annimo'
if @retorno=1 print 'Registro ingresado'
else select 'Registro no ingresado porque faltan datos';

124 - Procedimientos almacenados (return)

Problema:
Trabajamos con la tabla "libros" de una librera.
Eliminamos la tabla si existe y la creamos nuevamente:
if object_id('libros') is not null
drop table libros;
create table libros(
codigo int identity,
titulo varchar(40),
autor varchar(30),
editorial varchar(20),
precio decimal(5,2),
primary key(codigo)
);
Ingresamos algunos registros:
insert into libros values
insert into libros values
insert into libros values
insert into libros values
siglo',50);
insert into libros values
siglo',18);
insert into libros values
Bach','Sudamericana',14);
insert into libros values
insert into libros values
XXI',45);
insert into libros values

('Uno','Richard Bach','Planeta',15);
('Ilusiones','Richard Bach','Planeta',12);
('El aleph','Borges','Emece',25);
('Aprenda PHP','Mario Molina','Nuevo
('Matematica estas ahi','Paenza','Nuevo
('Puente al infinito','Richard
('Antologa','J. L. Borges','Paidos',24);
('Java en 10 minutos','Mario Molina','Siglo
('Antologa','Borges','Planeta',34);

Eliminamos el procedimiento llamado "pa_libros_autor", si existe:


if object_id('pa_libros_autor') is not null
drop procedure pa_libros_autor;
Creamos un procedimiento que muestre todos los libros de un autor determinado que se ingresa
como parmetro. Si no se ingresa un valor, o se ingresa "null", se muestra un mensaje y se sale del
procedimiento:
create procedure pa_libros_autor
@autor varchar(30)=null
as
if @autor is null
begin
select 'Debe indicar un autor'
return
end
select titulo from libros where autor = @autor;

Ejecutamos el procedimiento con parmetro:


exec pa_libros_autor 'Borges';
Ejecutamos el procedimiento sin parmetro:
exec pa_libros_autor;
Eliminamos el procedimiento "pa_libros_ingreso", si existe:
if object_id('pa_libros_ingreso') is not null
drop procedure pa_libros_ingreso;
Creamos un procedimiento almacenado que ingresa registros en la tabla "libros". Los parmetros
correspondientes al ttulo y autor DEBEN ingresarse con un valor distinto de "null", los dems son
opcionales. El procedimiento retorna "1" si la insercin se realiza (si se ingresan valores para
ttulo y autor) y "0", en caso que ttulo o autor sean nulos:
create procedure pa_libros_ingreso
@titulo varchar(40)=null,
@autor varchar(30)=null,
@editorial varchar(20)=null,
@precio decimal(5,2)=null
as
if (@titulo is null) or (@autor is null)
return 0
else
begin
insert into libros values (@titulo,@autor,@editorial,@precio)
return 1
end;
Declaramos una variable en la cual almacenaremos el valor devuelto, ejecutamos el
procedimiento enviando los dos parmetros obligatorios y vemos el contenido de la variable:
declare @retorno int
exec @retorno=pa_libros_ingreso 'Alicia en el pais...','Lewis Carroll'
select 'Ingreso realizado=1' = @retorno;
El procedimiento retorn "1", lo cual indica que el registro fue ingresado.
Verifiquemos el ingreso consultando la tabla:
select *from libros;
Ejecutamos los mismos pasos, pero esta vez no enviamos valores al procedimiento:
declare @retorno int
exec @retorno=pa_libros_ingreso
select 'Ingreso realizado=1' = @retorno;
El procedimiento retorn "0", lo cual indica que el registro no fue ingresado.

Verifiquemos que el ingreso no se realiz consultando la tabla:


select *from libros;
Empleamos un "if" para controlar el valor de la variable de retorno. Enviando al procedimiento
valores para los parmetros obligatorios:
declare @retorno int
exec @retorno=pa_libros_ingreso 'El gato con botas','Annimo'
if @retorno=1 select 'Registro ingresado'
else select 'Registro no ingresado porque faltan datos';
Verifiquemos el ingreso consultando la tabla:
select *from libros;
Empleamos nuevamente un "if" y no enviamos valores al procedimiento:
declare @retorno int
exec @retorno=pa_libros_ingreso
if @retorno=1 select 'Registro ingresado'
else select 'Registro no ingresado porque faltan datos';
Verifiquemos que el ingreso no se realiz:
select *from libros;

if object_id('libros') is not null


drop table libros;

create table libros(


codigo int identity,
titulo varchar(40),
autor varchar(30),
editorial varchar(20),
precio decimal(5,2),
primary key(codigo)
);

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','Richard Bach','Sudamericana',14);
insert into libros values ('Antologa','J. L. Borges','Paidos',24);
insert into libros values ('Java en 10 minutos','Mario Molina','Siglo XXI',45);
insert into libros values ('Antologa','Borges','Planeta',34);

if object_id('pa_libros_autor') is not null


drop procedure pa_libros_autor;

create procedure pa_libros_autor


@autor varchar(30)=null
as
if @autor is null
begin
select 'Debe indicar un autor'
return
end
select titulo from libros where autor = @autor;

exec pa_libros_autor 'Borges';

exec pa_libros_autor;

if object_id('pa_libros_ingreso') is not null


drop procedure pa_libros_ingreso;

create procedure pa_libros_ingreso


@titulo varchar(40)=null,
@autor varchar(30)=null,
@editorial varchar(20)=null,
@precio decimal(5,2)=null
as
if (@titulo is null) or (@autor is null)
return 0
else
begin
insert into libros values (@titulo,@autor,@editorial,@precio)
return 1
end;

declare @retorno int


exec @retorno=pa_libros_ingreso 'Alicia en el pais...','Lewis Carroll'
select 'Ingreso realizado=1' = @retorno;

select *from libros;

declare @retorno int


exec @retorno=pa_libros_ingreso
select 'Ingreso realizado=1' = @retorno;

select *from libros;

declare @retorno int


exec @retorno=pa_libros_ingreso 'El gato con botas','Annimo'
if @retorno=1 select 'Registro ingresado'
else select 'Registro no ingresado porque faltan datos';

select *from libros;

declare @retorno int


exec @retorno=pa_libros_ingreso
if @retorno=1 select 'Registro ingresado'
else select 'Registro no ingresado porque faltan datos';

select *from libros;

124 - Procedimientos almacenados (return)


Primer problema:
Una empresa almacena los datos de sus empleados en una tabla llamada "empleados".
1- Eliminamos la tabla, si existe y la creamos:
if object_id('empleados') is not null
drop table empleados;
create table empleados(
documento char(8),
nombre varchar(20),
apellido varchar(20),
cantidadhijos tinyint,
seccion varchar(20),
primary key(documento)
);

2- Ingrese algunos registros:


insert into empleados values('22222222','Juan','Perez',2,'Contaduria');
insert into empleados values('22333333','Luis','Lopez',0,'Contaduria');
insert into empleados values ('22444444','Marta','Perez',NULL,'Sistemas');
insert into empleados values('22555555','Susana','Garcia',2,'Secretaria');
insert into empleados values('22666666','Jose Maria','Morales',1,'Secretaria');
insert into empleados values('22777777','Andres','Perez',3,'Sistemas');
insert into empleados values('22888888','Laura','Garcia',3,'Secretaria');
3- Elimine el procedimiento llamado "pa_empleados_seccion", si existe:
if object_id('pa_empleados_seccion') is not null
drop procedure pa_empleados_seccion;
4- Cree un procedimiento que muestre todos los empleados de una seccin
determinada que se ingresa
como parmetro. Si no se ingresa un valor, o se ingresa "null", se muestra un mensaje
y se sale del
procedimiento.
5- Ejecute el procedimiento envindole un valor para el parmetro.
6- Ejecute el procedimiento sin parmetro.
7- Elimine el procedimiento "pa_actualizarhijos", si existe:
if object_id('pa_actualizarhijos') is not null
drop procedure pa_actualizarhijos;
8- Cree un procedimiento almacenado que permita modificar la cantidad de hijos
ingresando el
documento de un empleado y la cantidad de hijos nueva. Ambos parmetros DEBEN
ingresarse con un
valor distinto de "null". El procedimiento retorna "1" si la actualizacin se realiza (si se
ingresan valores para ambos parmetros) y "0", en caso que uno o ambos parmetros
no se ingresen o
sean nulos.
9- Declare una variable en la cual se almacenar el valor devuelto por el
procedimiento, ejecute el
procedimiento enviando los dos parmetros y vea el contenido de la variable.
El procedimiento retorna "1", con lo cual indica que fue actualizado.
10- Verifique la actualizacin consultando la tabla:
select *from empleados;
11- Ejecute los mismos pasos, pero esta vez enve solamente un valor para el
parmetro "documento".
Retorna "0", lo que indica que el registro no fue actualizado.
12- Verifique que el registro no se actualiz consultando la tabla:
select *from empleados;

13- Emplee un "if" para controlar el valor de la variable de retorno. Enviando al


procedimiento valores para los parmetros.
Retorna 1.
14- Verifique la actualizacin consultando la tabla:
select *from empleados;
15- Emplee nuevamente un "if" y enve solamente valor para el parmetro "hijos".
Retorna 0.
if object_id('empleados') is not null
drop table empleados;
create table empleados(
documento char(8),
nombre varchar(20),
apellido varchar(20),
cantidadhijos tinyint,
seccion varchar(20),
primary key(documento)
);
insert
insert
insert
insert
insert
insert
insert

into
into
into
into
into
into
into

empleados
empleados
empleados
empleados
empleados
empleados
empleados

values('22222222','Juan','Perez',2,'Contaduria');
values('22333333','Luis','Lopez',0,'Contaduria');
values ('22444444','Marta','Perez',NULL,'Sistemas');
values('22555555','Susana','Garcia',2,'Secretaria');
values('22666666','Jose Maria','Morales',1,'Secretaria');
values('22777777','Andres','Perez',3,'Sistemas');
values('22888888','Laura','Garcia',3,'Secretaria');

if object_id('pa_empleados_seccion') is not null


drop procedure pa_empleados_seccion;
create procedure pa_empleados_seccion
@seccion varchar(20)=null
as
if @seccion is null
begin
select 'Debe indicar una seccion'
return
end
select nombre from empleados where seccion=@seccion;
exec pa_empleados_seccion 'Secretaria';
exec pa_empleados_seccion;
if object_id('pa_actualizarhijos') is not null
drop procedure pa_actualizarhijos;
create procedure pa_actualizarhijos
@documento char(8)=null,
@hijos tinyint=null

as
if (@documento is null) or (@hijos is null)
return 0
else
begin
update empleados set cantidadhijos=@hijos where documento=@documento
return 1
end;
declare @retorno int
exec @retorno=pa_actualizarhijos '22222222',3
select 'Registro actualizado=1' = @retorno;
select *from empleados;
declare @retorno int
exec @retorno=pa_actualizarhijos '22333333'
select 'Registro actualizado=1' = @retorno;
select *from empleados;
declare @retorno int
exec @retorno=pa_actualizarhijos '22333333',2
if @retorno=1 select 'Registro actualizado'
else select 'Registro no actualizado, se necesita un documento y la cantidad de hijos';
select *from empleados;
declare @retorno int
exec @retorno=pa_actualizarhijos @hijos=4
if @retorno=1 select 'Registro actualizado'
else select 'Registro no actualizado, se necesita un documento y la cantidad de hijos';

125 - Procedimientos almacenados (informacin)


Problema:
Trabajamos con la tabla "libros" de una librera.
Eliminamos la tabla si existe y la creamos nuevamente:
if object_id('libros') is not null
drop table libros;
create table libros(
codigo int identity,
titulo varchar(40),
autor varchar(30),
editorial varchar(20),
precio decimal(5,2),
primary key(codigo)

);
Ingresamos algunos registros:
insert into libros values
insert into libros values
insert into libros values
insert into libros values
siglo',50);
insert into libros values
siglo',18);
insert into libros values
Bach','Sudamericana',14);
insert into libros values
insert into libros values
XXI',45);
insert into libros values

('Uno','Richard Bach','Planeta',15);
('Ilusiones','Richard Bach','Planeta',12);
('El aleph','Borges','Emece',25);
('Aprenda PHP','Mario Molina','Nuevo
('Matematica estas ahi','Paenza','Nuevo
('Puente al infinito','Richard
('Antologa','J. L. Borges','Paidos',24);
('Java en 10 minutos','Mario Molina','Siglo
('Antologa','Borges','Planeta',34);

Eliminamos el procedimiento llamado "pa_autor_promedio", si existe y luego lo creamos para que


reciba el nombre de un autor y nos retorne el promedio de los precios de todos los libros de tal
autor:
if object_id('pa_autor_promedio') is not null
drop proc pa_autor_promedio;
create procedure pa_autor_promedio
@autor varchar(30)='%',
@promedio decimal(6,2) output
as
select @promedio=avg(precio)
from libros
where autor like @autor;
Ejecutamos el procedimiento "sp_help" seguido del nombre del procedimiento creado:
sp_help pa_autor_promedio;
Obtenemos la fecha de creacin e informacin sobre sus parmetros (nombre, tipo, longitud,
etc.).
Veamos el texto de nuestro procedimiento:
sp_helptext pa_autor_promedio;
Ejecutamos el procedimiento almacenado del sistema "sp_stored_procedures":
sp_stored_procedures;
muestra todos los procedimientos almacenados, los propietarios, etc., entre ellos se encuentra el
procedimiento "pa_autor_promedio".
Ejecutamos el procedimiento anterior pero envindole un valor para el primer parmetro:

sp_stored_procedures 'pa_%';
Ejecutamos "sp_depends" seguido del nombre del procedimiento "pa_autor_promedio":
sp_depends pa_autor_promedio;
Obtenemos la siguiente informacin: los objetos de los cuales depende el procedimiento, en este
caso, los campos y tablas referenciadas en el mismo: el nombre del objeto (libros), el tipo de
objeto (tabla), el campo (autor y precio) y dems informacin que no analizaremos.
En caso que haya objetos que dependen del procedimiento, aparece otra tabla; aqu no aparece
porque el procedimiento no tiene objetos que dependan de l.
Ejecutamos el procedimiento "sp_depends" seguido del nombre de la tabla "libros":
sp_depends libros;
aparece todos los objetos que dependen de ella; en este caso, nicamente el procedimiento
creado anteriormente.
Consultamos la tabla del sistema "sysobjects":
select *from sysobjects;
Nos muestra nombre y varios datos de todos los objetos de la base de datos actual. La columna
"xtype" indica el tipo de objeto. "P" indica que es un procedimiento almacenado.
Recuperamos todos los procedimientos almacenados creados por nosotros de la tabla "sysobjects":
select *from sysobjects
where xtype='P' and-- tipo procedimiento
name like 'pa%';--bsqueda con comodn
deben aparecer el procedimiento creado anteriormente.
Eliminamos el procedimiento:
drop proc pa_autor_promedio;
Ejecutamos "sp_depends" seguido del nombre de la tabla "libros":
sp_depends libros;
Aparece un mensaje indicando que la tabla no tiene objetos que dependan de ella ni ella
depende de ningn objeto.

if object_id('libros') is not null


drop table libros;

create table libros(


codigo int identity,
titulo varchar(40),
autor varchar(30),
editorial varchar(20),
precio decimal(5,2),
primary key(codigo)
);

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','Richard Bach','Sudamericana',14);
insert into libros values ('Antologa','J. L. Borges','Paidos',24);
insert into libros values ('Java en 10 minutos','Mario Molina','Siglo XXI',45);
insert into libros values ('Antologa','Borges','Planeta',34);

if object_id('pa_autor_promedio') is not null


drop proc pa_autor_promedio;

create procedure pa_autor_promedio


@autor varchar(30)='%',
@promedio decimal(6,2) output
as

select @promedio=avg(precio)
from libros
where autor like @autor;

sp_help pa_autor_promedio;

sp_helptext pa_autor_promedio;

sp_stored_procedures;

sp_stored_procedures 'pa_%';

sp_depends pa_autor_promedio;

sp_depends libros;

select *from sysobjects;

select *from sysobjects


where xtype='P' and-- tipo procedimiento
name like 'pa%'--bsqueda con comodn;

drop proc pa_autor_promedio;

sp_depends libros;

Das könnte Ihnen auch gefallen