Está en la página 1de 5

Instituto Superior de Formacin Docente y Tcnica N 93

Base de datos
PROCEDIMIENTOS ALMACENADOS
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
parmetro para mostrar todos los libros del autor solicitado:

como

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:

Pgina 1 de 5

Instituto Superior de Formacin Docente y Tcnica N 93


Base de datos
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
Bach';

@editorial='Planeta',

@autor='Richard

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%';

Pgina 2 de 5

Instituto Superior de Formacin Docente y Tcnica N 93


Base de datos
La sentencia siguiente ejecuta el procedimiento almacenado
pa_libros_autor_editorial3"
enviando
un
valor
para
el
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%';

Pgina 3 de 5

segundo

Instituto Superior de Formacin Docente y Tcnica N 93


Base de datos
EJEMPLO COMPLETO DE ABM
EJEMPLO
PRACTICO
PARA
INSERTAR,
ACTUALIZAR
Y
ELIMINAR
CON
PROCEDIMIENTOS ALMACENADOS; TAMBIEN SE HACE USO DE UNA FUNCION PARA
PONER LA FECHA DE ALTA, PARA ELLO SOLO SE NECESITA LA FECHA DE
INSCRIPCION.
--CREANDO LA BASE DE DATOS
CREATE DATABASE SEPELIOS
GO
--HACIENDO USO
USE SEPELIOS
GO
--CREANDO LA TABLA
CREATE TABLE TITULARES_SEPELIOS
(CODIGO_MUDULAR VARCHAR(4),
NUMERO_SOLICITUD VARCHAR(5),
APELLIDOS VARCHAR(35),
NOMBRES VARCHAR(35),
FECHA_INS DATETIME,
FECHA_ALTA DATETIME,
[PLAN] INT,
MONTO DECIMAL)
GO
--FUNCION PARA LA FECHA DE ALTA
CREATE FUNCTION FECHA_ALTA(@FECHA_INS DATETIME)
RETURNS DATETIME
BEGIN
RETURN DATEADD(MONTH,2,@FECHA_INS)
END
GO
--PROBANDO LA FUNCION
SELECT DBO.FECHA_ALTA('01/01/2010')
GO
--PROCEDIMIENTO ALMACENADO (INSERTAR)
CREATE PROCEDURE USP_TITULARES_S_INSERTAR
@CODMOD VARCHAR(4),
@NOSOLI VARCHAR(5),
@APELLI VARCHAR(35),
@NOMB VARCHAR(35),
@FECINS DATETIME,
@PLAN INT,
@PAGO DECIMAL
AS
BEGIN
INSERT INTO TITULARES_SEPELIOS
VALUES(@CODMOD, @NOSOLI,@APELLI,@NOMB,@FECINS,DBO.FECHA_ALTA(@FECINS),
@PLAN,@PAGO)
END

Pgina 4 de 5

Instituto Superior de Formacin Docente y Tcnica N 93


Base de datos
GO
--PROCEDIMIENTO ALMACENADO (ACTUALIZAR)
CREATE PROCEDURE USP_TITULARES_S_ACTUALIZAR
@CODMODU VARCHAR(4),
@NOSOL VARCHAR(5),
@APELL VARCHAR(35),
@NOM VARCHAR(35),
@FECIN DATETIME,
@P INT,
@PAG DECIMAL
AS
BEGIN
UPDATE TITULARES_SEPELIOS
SET NUMERO_SOLICITUD = @NOSOL, APELLIDOS = @APELL,NOMBRES = @NOM,FECH
A_INS =@FECIN,FECHA_ALTA = DBO.FECHA_ALTA(@FECIN),[PLAN] =@P,MONTO = @
PAG
WHERE CODIGO_MUDULAR = @CODMODU
END
GO
--PROCEDIMIENTO ALMACENADO (ELIMINAR)
CREATE PROCEDURE USP_TITULARES_S_ELIMINAR
@CODIGO VARCHAR(4)
AS
DELETE FROM TITULARES_SEPELIOS
WHERE CODIGO_MUDULAR= @CODIGO
GO
--DEMOSTRACION
--INSERTAR
GO
EXECUTE USP_TITULARES_S_INSERTAR 'S001','S1','VARGAS','LUIS','01/01/20
11',1,700
--ACTUALIZAR
GO
EXECUTE USP_TITULARES_S_ACTUALIZAR 'S001','S2','JORGE','LUIS','01/01/2
010',2,800
--ELIMINAR
GO
EXECUTE USP_TITULARES_S_ELIMINAR 'S001'
--MOSTRANDO LA TABLA
GO
SELECT * FROM TITULARES_SEPELIOS

Pgina 5 de 5