Вы находитесь на странице: 1из 9

Carrera Profesional de Computacin e Informtica

LENGUAJE DE PROGRAMACIN II
Docente: Ing. Marko Castillo Pea

SEMANA 09

Periodo Lectivo Semestre

2011-I

IMPLEMENTACION DE PROCEDIMIENTOS ALAMACENADOS

I. Objetivos
Despus de completar esta sesin, el alumno ser capaz de: II. Describir cmo se procesa un procedimiento almacenado. Crear, ejecutar, modificar y eliminar un procedimiento almacenado. Crear procedimientos almacenados que acepten parmetros. Ejecutar procedimientos almacenados extendidos. Crear mensajes personalizados de error.

Introduccin terica

Transact-SQL no es realmente un lenguaje de programacin similar a las herramientas de tercera y cuarta generacin sin embargo permite utilizar SQL para realizar tareas complejas que requieren saltos, bucles, decisiones. Transact-SQL se utiliza a menudo en la creacin de procedimientos almacenados y triggers (desencadenadores) de tal forma que las aplicaciones clientes que se conectan a SQL Server solo se preocupan por la presentacin de los datos para el usuario final, mientras que la lgica de los procesos se maneja en el servidor. Variables: Las variables locales se identifican como aquellos objetos que comienzan con el carcter arroba '@' una vez. Las variables globales se identifican como los objetos que tienen 2 arrobas al inicio '@@', como ejemplo de variables globales tenemos: @@rowcount, @@error. Las variables locales se declaran al inicio de un proceso por lotes o un procedimiento almacenado. La forma de asignarle valores a una variable es con la instruccin SELECT. Select @variable=campo from tabla
El control de flujo en Transact-SQL Construccin IFELSE GOTO etiqueta WAITFOR WHILE BREAK CONTINUE RETURN [n] Descripcin Define una decisin. Define un salto incondicional Establece un tiempo para la ejecucin de una instruccin. El tiempo puede ser un intervalo de retardo o un instante especificado de ejecucin (una hora concreta del da) Bucle bsico de SQL Acompaa al bucle WHILE y le indica finalizarlo inmediatamente. Acompaa al bucle WHILE y le indica continuar con la siguiente iteracin. Salida incondicional del procedimiento o proceso por lotes, se puede definir un nmero entero como estado devuelto y puede asignarse a
Trainer: Ing. Mark Castillo

BEGIN...END CASE

cualquier variable. Utilizado en conjunto con IF..ELSE o WHILE para agrupar un conjunto de instrucciones. Implementada en la instruccin SELECT y UPDATE y permite realizar consultas y actualizaciones condicionales.

PRINT Es una instruccin para imprimir un dato en la pantalla, la sintaxis es: PRINT "cadena"; cadena puede ser tambin una variable de tipo varchar. Por ejemplo: PRINT Hola a todos

Procedimientos Almacenados
Los procedimientos almacenados son conjuntos de sentencias en leguaje Transact SQL que pueden almacenarse en el propio servidor. Los procedimientos almacenados son un mtodo para encapsular tareas repetitivas; por lo que son ms potentes y permiten almacenar funciones y procedimientos compuestos por varias instrucciones, introducir saltos, bucles, etc. Creacin de procedimientos almacenados (Store Procedures) La instruccin general para crear procedimientos almacenados es la siguiente:

CREATE PROC [ EDURE ] nombre [ { @parametros tipo_dato } [ = valor_por_defecto ] [ OUTPUT ] ] [ ,...n ] [ WITH { RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ] [ FOR REPLICATION ] AS instrucciones_sql [ ...n ] Donde: Nombre: es el nombre del procedimiento que se va a crear. Parmetros: parmetros de entrada y salida del procedimiento Tipo_Dato: tipo de dato asociado al parmetro. Valor_Por_Defecto: valor asignado por defecto al parmetro Instrucciones_Sql: instrucciones SQL

Ejemplo de un procedimiento sin parmetros


Ejemplo 1 Instruccin Sql Select Autores.NomAut,Autores.ApeAut,Autores.NacAut From Autores Where NacAut='Per' Order By ApeAut Procedimiento con instruccin anterior Create Procedure AutoresPeruanos As Select Autores.NomAut,Autores.ApeAut,Autores.NacAut From Autores Where NacAut='Per' Order By ApeAut Go
Trainer: Ing. Mark Castillo

Ejecutando el Procedimiento Exec AutoresPeruanos Resultados:

3
Ejemplo 2 Create Procedure ObtenerLibros As Select * From libros Go Exec ObtenerLibros Resultado:

Nota: los procedimientos almacenados los puede encontrar en la base de datos donde los trabaja, en la opcin programacin.

Trainer: Ing. Mark Castillo

Ejemplo 3 Create Procedure Biblioteca As Select * From Autores Select * From Libros Select * From Lectores Go Exec Biblioteca Resultado:

Ejemplo 4 (Procedimiento para ver el nombre de la base de datos) Create Procedure NombreBD As Select DB_NAME() As NombreBD Go Exec NombreBd Resultado:

Trainer: Ing. Mark Castillo

Ejemplo de un procedimiento con parmetros


Ya conocemos la sintaxis bsica para la creacin de procedimientos que es: CREATE PROCEDURE NOMBRE AS Sentencias Ahora si queremos utilizar parmetros de entrada antes de escribir el comando AS, debemos digitar los datos que recibir el procedimiento y el tipo de dato de la siguiente manera: CREATE PROCEDURE NOMBRE @parametro1 tipo,@parametro2 tipo, AS Es necesario aclarar, que un procedimiento almacenado puede recibir parmetros de entrada y devolver parmetros de salida. Ejemplo 1 Crear un procedimiento para recuperar el nombre del autor, cuyo cdigo se pasa por parmetro. Create Procedure ObtenerNombre @CodAut Char(3) As Select * from Autores Where CodAut=@CodAut Go Con esta sentencia, se crea un procedimiento almacenado, de nombre ObtenerNombre, al que se le pasa un parmetro, llamado @CodAut, de tipo varchar, que realiza una consulta para obtener el nombre del Autor de la tabla Autores, cuyo cdigo coincida con el parmetro. De esta forma, si queremos obtener el nombre del Autor cuyo cdigo sea 'A01', deberemos ejecutar el procedimiento pasndole como argumento este valor. Las llamadas a procedimientos almacenados se pueden realizar de las siguientes formas: Pasando los argumentos en el mismo orden que en el que se han declarado. Exec ObtenerNombre 'A01' Resultado:

Pasando los argumentos nombrados. En este caso no hace falta que los parmetros vayan en el mismo orden.
Exec ObtenerNombre @CodAut='A01'

Resultado:

Trainer: Ing. Mark Castillo

Ejemplo 2 Crear un procedimiento para buscar lectores por apellidos. Create Procedure BuscarLectores @ApeLec Varchar(30) As Select * From Lectores Where ApeLec Like @ApeLec+'%' Go exec BuscarLectores 'A' Resultado:

Ejemplo 3 El siguiente ejemplo muestra un procedimiento almacenado, denominado addLectores que inserta un registro en la tabla "LECTORES". Create Procedure AddLectores @CodLec Char(3),@NomLec Varchar(25),@ApeLec Varchar(30),@DirLec Varchar(40) As Insert Into Lectores (CodLec,NomLec,ApeLec,DirLec) Values @CodLec,@NomLec,@ApeLec,@DirLec) Como puede ver el procedimiento pide cuatro parmetros @CodLec, @NomLec @ApeLec y @DirLec del tipo varchar, cuando se llame al procedimiento deber digitarse primero el Cdigo y despus los dems, porque ese es el orden que se le ha fijado en el desarrollo del procedimiento. Para llamar este procedimiento utilice la siguiente sentencia Exec Addlectores '016','Mark','Castillo Pea','Av Dolores 666 - SAN BORJA' Para comprobar que se ingreso el registro utilice la siguiente instruccin y busque el registro que acaba de ingresar con el procedimiento Select * from Lectores Resultado:

Trainer: Ing. Mark Castillo

Si alguien ingresa un valor nulo Exec Addlectores '017','Gloria','Aquino Rosas',' ' El procedimiento lo aceptara sin enviar ningn error, entonces podemos modificar el procedimiento de la siguiente manera: Alter Procedure Addlectores @CodLec Char(3),@NomLec Varchar(25),@ApeLec Varchar(30),@DirLec Varchar(40) As If ((@CodLec='') Or (@NomLec='') Or (@ApeLec='') Or (@DirLec='')) Begin Print 'No se puede insertar valores nulos' Return End Else Begin Insert Into Lectores (CodLec,NomLec,ApeLec,DirLec) Values (@CodLec,@NomLec,@ApeLec,@DirLec) End Los BEGIN y END son el inicio y fin del if y RETURN provoca la salida del procedimiento tras enviar un mensaje a la pantalla del usuario Ahora si alguien ingresa un valor nulo Exec Addlectores '017','Gloria','Aquino Rosas',' ' Al Ejecutarlo se vera el siguiente mensaje

Reglas de procedimientos almacenados


Entre las reglas para la programacin de procedimientos almacenados, cabe citar las siguientes: La propia definicin CREATE PROCEDURE puede incluir cualquier nmero y tipo de instrucciones SQL, excepto las siguientes instrucciones CREATE, que no pueden ser utilizadas nunca dentro de un procedimiento almacenado: CREATE DEFAULT CREATE PROCEDURE CREATE RULE CREATE TRIGGER CREATE VIEW

Se puede crear otros objetos de base de datos dentro de un procedimiento almacenado. Puede hacer referencia a un objeto creado en el mismo procedimiento almacenado, siempre que se cree antes de que se haga referencia al objeto. Puede hacer referencia a tablas temporales dentro de un procedimiento almacenado. Si ejecuta un procedimiento almacenado que llama a otro procedimiento almacenado, el procedimiento al que se llama puede tener acceso a todos los objetos creados por el primer procedimiento, incluidas las tablas temporales. El nmero mximo de parmetros en un procedimiento almacenado es de 1,024. El nmero mximo de variables locales en un procedimiento almacenado est limitado nicamente por la memoria disponible.
Trainer: Ing. Mark Castillo

Use de variables locales.


Una Variable Local de Transact-SQL es un objeto que contiene un valor individual de datos de un tipo especfico Las variables locales se definen debajo de la sentencia AS y llevan el prefijo DECLARE. Create PROCEDURE AddLectores1 @apellido varchar(15), @nombre varchar(15) AS DECLARE @nom varchar(15)--variable local DECLARE @ape varchar(15)--variable local Ahora vamos a ver que el nombre completo del usuario (nombre y apellidos) no debe repetirse en la base de datos, para ello utilizamos el siguiente cdigo ALTER PROCEDURE AddLectores1 @CodLec Char(3),@NomLec Varchar(25),@ApeLec Varchar(30),@DirLec Varchar(40) AS DECLARE @nom varchar(15) --variable local DECLARE @ape varchar(15) --variable local --revisamos que las variables no sean nulas --PRIMER IF EXTERNO si las variales son diferentes de null entra al if --de lo contario sale y mande que no pueden ser valores nulos If ((@CodLec<>'') AND (@NomLec<>'') AND (@ApeLec<>'') AND (@DirLec<>'')) BEGIN --guardamos el nombre y el apellido en las variables locales @non y @ape SELECT @nom=NomLec, @ape=ApeLec from Lectores Where NomLec=@NomLec And Apelec=@ApeLec --IF INTERNO comparamos el valor capturado en @nom y @ape y los comparamos --con los parametros de entrada IF((@nom=@NomLec) AND (@ape=@Apelec)) BEGIN PRINT 'EL USUARIO YA EXISTE EN LA BASE DE DATOS' RETURN END--END DEL IF INTERNO ELSE--ELSE DEL IF INTERNO BEGIN Insert Into Lectores (CodLec,NomLec,ApeLec,DirLec) Values (@CodLec,@NomLec,@ApeLec,@DirLec) PRINT 'EL REGISTRO SE HA INGRESADO CORRECTAMENTE' END--END DEL ELSE INTERNO END--END DEL IF EXTERNO ELSE--ELSE DEL IF EXTERNO BEGIN PRINT 'NO SE PUEDEN INGRESAR VALORES NULOS' RETURN END--END DEL ELSE EXTERNO

Trainer: Ing. Mark Castillo

Si alguien ingresa un valor repetido Exec Addlectores1 '017','Mark','Castillo Pea','Av Dolores 666 - SAN BORJA' Se vera el siguiente mensaje

Modificacin y eliminacin de procedimientos almacenados


Para modificar un procedimiento almacenado existente y conservar la asignacin de los permisos, use la instruccin ALTER PROCEDURE. SQL Server sustituye la definicin anterior del procedimiento almacenado cuando se modifica con ALTER PROCEDURE. Sintaxis ALTER PROC [ EDURE ] nombreProcedimiento [ ; nmero ] [ { @tipoDatos parmetro } [ VARYING ] [ = valorPredeterminado ] [ OUTPUT ] ] [ ,...n ] [ WITH { RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ] [ FOR REPLICATION ] AS instruccinSQL [...n]

Eliminacin de procedimientos almacenados


Use la instruccin DROP PROCEDURE para quitar procedimientos almacenados definidos por el usuario de la base de datos actual. Antes de quitar un procedimiento almacenado, ejecute el procedimiento almacenado sp_depends para determinar si los objetos dependen de l. Sintaxis DROP PROCEDURE { procedimiento } [ ,...n ]

Trainer: Ing. Mark Castillo

Вам также может понравиться