Procedimientos almacenados con parametros en SQL Server Crea el```f Sintaxis: Create Procedure Procedimiento @NombreParametro Tipo de dato As Instrucciones Posteriormente lo ejecutamos introduciendo un valor/res correspondiente al parámetro/os introducido. Exec Procedimiento Valor
Ejemplo 1 ? 1CREATE PROCEDURE NUMEMPDEPT @NDEP SMALLINT 2AS SELECT COUNT(*) AS [NUM EMPLEADOS], DEPT_NO 3FROM EMP 4WHERE DEPT_NO = @NDEP 5GROUP BY DEPT_NO Crea el procedimiento numempdept con el parámetro ndep que es tipo smallint (equivalente al short en visual). El procedimiento hace una select que realiza grupos por número de deparamento y cuenta cuantos empleados hay en cada departamento. ? 1EXEC NUMEMPDEPT 20 Ejecuta el procedimiento introduciendo el valor 20 para el parámetro ndep, con lo que haría la select sobre el departamento 20.
Ejemplo 2 ? 1CREATE PROCEDURE BUSCAEMP( 2@NDEP SMALLINT, NVARCHAR(19)) 3@NOFICIO AS 4SELECT * FROM EMP 5WHERE DEPT_NO = @NDEP 6AND OFICIO = @NOFICIO
7 ? 1EXEC BUSCAEMP 20,'Empleado'
PROCEDIMIENTOS ALMACENADOS CON PARÁMETROS CON VALORES POR DEFECTO Sintaxis: Create Procedure As Instrucciones
Nombre
@Variable
tipo
=
Valor
Donde Valor es el valor que le damos por defecto, este valor puede almacenar comodines (como % que equivale a *).
Ejemplo Crea un procedimiento con el parámetro ndept y le da por defecto valor 10. ? 1CREATE PROCEDURE NUMEMP @NDEPT SMALLINT = 10 2AS 3SELECT DEPT_NO, COUNT(*) AS [NUM EMPLEADOS] 4FROM EMP 5WHERE DEPT_NO = @NDEPT GROUP BY DEPT_NO 6 ? 1EXEC NUMEMP
Ejemplo 2
1
Debe devolver salario, oficio y comisión y le pasamos el apellido. ? 1CREATE PROCEDURE SALARIOOFICIO @PAPELLIDO VARCHAR(20) = 'REY' AS 2SELECT OFICIO, SALARIO, COMISION FROM EMP WHERE APELLIDO = @PAPELLIDO ? 1EXEC SALARIOOFICIO 'GARCIA' Sacaría el salario, el oficio y la comisión de todos los que tengan apellido Garcia, sino pusiésemos parámetro, por defecto sacaría los que tuviesen apellido Rey.
Ejemplo 3 ? 1CREATE PROCEDURE SALARIOOFICIOLIKE( 2@PAPELLIDO VARCHAR(20) = 'REY' ) 3AS 4SELECT OFICIO, SALARIO, COMISION 5FROM EMP WHERE APELLIDO LIKE '%' + @PAPELLIDO + '%' 6 ? 1EXEC SALARIOOFICIOLIKE 's' Sacaría oficio, salario y comisión de los empleados que tuviesen una s en su apellido.
Ejemplo
4
Introducir oficio y salario debe sacar el apellido de los empleados que tengan el mismo apellido y ganen mas del salario indicado. Debemos hacer que sino introduce nada saque todos los registros. ?
1CREATE PROCEDURE DOSPARAMETROS2( 2@OFICIO VARCHAR(12) = '%', @SALARIO VARCHAR(10) = '0' ) 3AS 4SELECT APELLIDO FROM EMP WHERE OFICIO LIKE @OFICIO AND SALARIO > 5@SALARIO ? 1EXEC DOSPARAMETROS2 'Empleado',1000
Ejemplo
5
Sacar todos los empleados que se dieron de alta entre una determinada fecha inicial y fecha final y que pertenecen a un determinado departamento. ? 1 CREATE PROCEDURE TRESPARAMETROS( 2@FINICIAL DATETIME = '01-01-1980', 3@FFINAL SMALLDATETIME = '12-07-2002' , 4@DEPT_NO NVARCHAR(10) = '%' 5) 6AS SELECT * FROM EMP WHERE FECHA_ALT BETWEEN @FINICIAL AND @FFINAL 7AND CAST(DEPT_NO AS VARCHAR(10)) LIKE @DEPT_NO 8 ? 1EXEC TRESPARAMETROS '01-01-1980','12-07-2002','30'
Ejemplo
6
Crear procedimiento que inserte un empleado. Crear otro procedimiento que borre un empleado que coincida con los parámetros indicados (los parámetros serán todos los campos de la tabla empleado) ? 1 2 CREATE PROCEDURE [INSERTA EMPLEADO]( 3 @EMP_NO INT, 4 @APELLIDO NVARCHAR(20), 5 @OFICIO NVARCHAR(20), 6 @DIR INT, 7 @FECHA_ALT SMALLDATETIME, @SALARIO INT, 8 @COMISION INT, 9 @DEPT_NO INT) 10AS 11INSERT INTO EMP VALUES 12(@EMP_NO, @APELLIDO, 13@OFICIO, 14@DIR, 15@FECHA_ALT, 16@SALARIO, @COMISION, 17@DEPT_NO) 18 19 ? EXEC [INSERTA EMPLEADO]
17855,'ALIAGA','EMPLEADO',7782,'23/05/2015',45000,0,30
? 1 CREATE PROCEDURE [BORRA EMPLEADO]( 2 @EMP_NO INT, @APELLIDO NVARCHAR(20), 3 @OFICIO NVARCHAR(20), 4 @DIR INT, 5 @FECHA_ALT SMALLDATETIME, 6 @SALARIO INT, INT, 7 @COMISION @DEPT_NO INT 8 ) 9 AS 10DELETE FROM EMP WHERE EMP_NO = @EMP_NO 11AND APELLIDO = @APELLIDO AND OFICIO = @OFICIO 12AND DIR = @DIR 13AND FECHA_ALT = @FECHA_ALT 14AND SALARIO = @SALARIO
15AND COMISION = @COMISION 16AND DEPT_NO = @DEPT_NO 17 18 19 ? EXEC [BORRA EMPLEADO]
17855,'ALIAGA','EMPLEADO',7782,'23/05/2015',45000,0,30
Variables en procedimientos almacenados de SQL Server
Sintaxis de declaración Declare @nombre tipo_dato Sintaxis de asignación directa Set @nombre = valor Sintaxis de asignación mediante consulta Select @nombre = campo from tabla
VARIABLES DE SALIDA EN PROCEDIMIENTOS ALMACENADOS Sintaxis Create Procedure Nombre @Variable tipodedato Output Instrucciones Print @Variable
Ejemplo 1: CREATE PROCEDURE TOTALSALCOM @APELLIDO NVARCHAR(25), @TOTAL INT OUTPUT --CREAMOS EL PROCEDIMIENTO CON UN PARÁMETRO Y UNA VARIABLE DE SALIDA AS --DECLARAMOS DOS VARIABLES PARA ALMACENAR VALORES DECLARE @SAL INT DECLARE @COM INT --ASIGNAMOS LOS VALORES CORRESPONDIENTES A LAS VARIABLES Y DESPUÉS LAS SUMAMOS Y LAS GUARDAMOS EN LA VARIABLE DE SALIDA. SELECT @SAL = SALARIO FROM EMP WHERE APELLIDO = @APELLIDO SELECT @COM = COMISION FROM EMP WHERE APELLIDO = @APELLIDO SET @TOTAL = @SAL + @COM --DEVOLVEMOS EL VALOR DE LA VARIABLE QUE QUEREMOS
PRINT @TOTAL
Y para ejecutarlo en el analizador de consultas, hemos de declarar la variable que vamos a recuperar también, para almacenar el valor que nos pasa el procedimiento almacenado en ella. Es decir, en este caso @total almacenará el valor pasado por la variable del mismo nombre que hay en el procedimiento: DECLARE @TOTAL INT EXEC TOTALSALCOM 'JIMENEZ', @TOTAL OUTPUT
Ejemplo 2: CREATE PROCEDURE TOTALES @NDEPT INT = NULL, @TOTAL INT OUTPUT AS IF @NDEPT IS NULL SELECT @TOTAL = SUM(SALARIO) FROM EMP ELSE SELECT @TOTAL = SUM(SALARIO) FROM EMP WHERE DEPT_NO = @NDEPT SELECT @TOTAL DECLARE @TOTAL INT EXEC TOTALES 10, @TOTAL OUTPUT
MAS EJEMPLOS: CREATE PROCEDURE DOSPARAMETROS( @OFICIO VARCHAR(12) = '%', @SALARIO INT = 0 ) AS IF @SALARIO = 0 PRINT 'NO HA INTRODUCIDO SALARIO' ELSE SELECT APELLIDO FROM EMP WHERE OFICIO LIKE @OFICIO AND SALARIO > @SALARIO EXEC DOSPARAMETROS 'EMPLEADO',1000
CREATE TABLE [CONTROL] ( APELLIDO VARCHAR(45), VARCHAR(45), FECHA SMALLDATETIME, NUMERO INT ) GO CREATE PROCEDURE BORRAREMP ( @APELLIDO VARCHAR(12) = '0000', @APE NVARCHAR(30) = '0', @NUM INT = 0) AS IF @APELLIDO = '0000' PRINT 'IMPOSIBLE BORRAR SI NO INTRODUCE UN APELLIDO' ELSE BEGIN SELECT @APE = APELLIDO FROM EMP WHERE APELLIDO = @APELLIDO SELECT @NUM = COUNT(APELLIDO) FROM EMP WHERE APELLIDO = @APE IF (@APE = '0') BEGIN PRINT 'APELLIDO NO ENCONTRADO, INTRODUZCA UN APELLIDO DE LA BASE DE DATOS' END ELSE BEGIN INSERT INTO CONTROL VALUES (@APE ,_NAME() ,GETDATE() ,@NUM) PRINT 'EL EMPLEADO ' + @APE + ' HA SIDO BORRADO DE LA BASE DE DATOS' DELETE FROM EMP WHERE APELLIDO = @APE END END EXEC BORRAREMP 'ALONSO','', 0
--ELIMINAR EL PROCEDIMIENTO ALMACENADO DROP PROCEDURE BORRAREMP
Ejercicios de procedimientos almacenados en SQL Server - 1 de 2
Saludos seguidores del manual TRANSACT SQL. Para poder realizar los ejercicios de procedimientos almacenados debes tener la base de datos Hospital, la cual puedes descargar desde el índice o desde los siguientes enlaces: DESCARGAR BD HOSPITAL - DESCARGAR REGISTROS BD HOSPITAL. Bien, sin más preámbulos iniciemos. 1) Sacar todos los empleados que se dieron de alta entre una determinada fecha inicial y fecha final y que pertenecen a un determinado departamento. ? 1 CREATE PROCEDURE FECHASDEPT 2@FINICIAL DATETIME, 3@FFINAL SMALLDATETIME , 4@DEPT_NO NVARCHAR(10) 5AS * FROM EMP WHERE FECHA_ALT BETWEEN @FINICIAL AND @FFINAL 6SELECT AND DEPT_NO = @DEPT_NO 7 ? 1EXEC FECHASDEPT '01/01/1965','01/01/1985',20
2) Crear procedimiento que inserte un empleado. ? 1 2 3
CREATE PROCEDURE INSERTA_EMPLEADO @EMP_NO INT, @APELLIDO NVARCHAR(20), @OFICIO NVARCHAR(20),
4 @DIR INT, 5 @FECHA_ALT SMALLDATETIME, @SALARIO INT, 6 @COMISION INT, 7 @DEPT_NO INT 8 AS 9 INSERT INTO EMP VALUES 10(@EMP_NO, @APELLIDO, 11@OFICIO, 12@DIR, 13@FECHA_ALT, 14@SALARIO, @COMISION, 15@DEPT_NO) 16 17 18 19 ? EXEC INSERTA_EMPLEADO
17895,'SUAREZ','EMPLEADO',0,'26/05/2015',16000,0,20
3) Crear un procedimiento que recupere el nombre, número y número de personas a partir del número de departamento. ? 1CREATE PROCEDURE NUMEMP_DEPT @NDEP SMALLINT 2AS SELECT COUNT(*) AS [NUM EMPLEADOS], DEPT_NO 3FROM EMP 4WHERE DEPT_NO = @NDEP 5GROUP BY DEPT_NO ? 1EXEC NUMEMP_DEPT 30
4) Crear un procedimiento igual que el anterior, pero que recupere también las personas que trabajan en dicho departamento, pasándole como parámetro el nombre. ? 1 2 CREATE PROCEDURE PERSONASDEPT @DEPT NVARCHAR(30) 3 AS 4 SELECT E.DEPT_NO AS [NUMERO DEPT] 5 , D.DNOMBRE AS [NOMBRE], COUNT(*) AS [NUMERO EMPLEADOS] FROM EMP AS E 6 INNER DEPT AS D 7 ON E.DEPT_NO = D.DEPT_NO 8 WHERE D.DNOMBRE = @DEPT 9 GROUP BY D.DNOMBRE, E.DEPT_NO 10SELECT E.DEPT_NO AS [Nº DEPARTAMENTO] , D.DNOMBRE AS [DEPARTAMENTO] 11, E.APELLIDO, E.SALARIO 12FROM EMP AS E 13INNER DEPT AS D 14ON E.DEPT_NO = D.DEPT_NO 15WHERE D.DNOMBRE = @DEPT 16 ? 1EXEC PERSONASDEPT 'CONTABILIDAD'
5) Crear procedimiento para devolver salario, oficio y comisión, pasándole el apellido. ? 1CREATE PROCEDURE SALARIO_OFICIO @PAPELLIDO NVARCHAR(20) AS 2SELECT OFICIO, SALARIO, COMISION FROM EMP WHERE APELLIDO = @PAPELLIDO ? 1EXEC SALARIO_OFICIO 'GARCIA'
6) Igual que el anterior, pero si no le pasamos ningún valor, mostrará los datos de todos los empleados. ? PROCEDURE OFICIOSALARIO @PAPELLIDO NVARCHAR(20) ='%' AS 1CREATE SELECT OFICIO, SALARIO, COMISION FROM EMP WHERE APELLIDO LIKE 2@PAPELLIDO ? 1EXEC OFICIOSALARIO 'SUAREZ'
7) Crear un procedimiento para mostrar el salario, oficio, apellido y nombre del departamento de todos los empleados que contengan en su apellido el valor que le pasemos como parámetro. ? PROCEDURE SALARIO_OFICIOLIKE @PAPELLIDO VARCHAR(20) = 'REY' AS 1CREATE SELECT OFICIO, SALARIO, COMISION FROM EMP WHERE APELLIDO LIKE '%' + 2@PAPELLIDO + '%' ? 1EXEC SALARIO_OFICIOLIKE 'S'
Ejercicios de procedimientos almacenados en SQL Server - 2 de 2 8) Crear un procedimiento que recupere el número departamento, el nombre y número de empleados, dándole como valor el nombre del departamento, si el nombre introducido no es válido, mostraremos un mensaje informativo comunicándolo. ? 1 2 CREATE PROCEDURE DEPARTAMENTO @DEPT NVARCHAR(30) 3 AS 4 DECLARE @DEPTDEF NVARCHAR(30) 5 SET @DEPTDEF = NULL 6 SELECT @DEPTDEF = DNOMBRE FROM DEPT WHERE DNOMBRE = @DEPT 7 IF (@DEPTDEF IS NULL) 8 PRINT 'DEPARTAMENTO INTRODUCIDO NO VALIDO: ' + @DEPT 9 ELSE 10BEGIN 11SELECT E.DEPT_NO AS [NUMERO DEPT] , D.DNOMBRE AS [NOMBRE], COUNT(*) AS [NUMERO EMPLEADOS] 12FROM EMP AS E 13INNER DEPT AS D 14ON E.DEPT_NO = D.DEPT_NO 15WHERE D.DNOMBRE = @DEPT BY D.DNOMBRE, E.DEPT_NO 16GROUP END 17 18 ? 1EXEC DEPARTAMENTO 'VENTAS'
9) Crear un procedimiento para devolver un informe sobre los empleados de la plantilla de un determinado hospital, sala, turno o función. El informe mostrará número de empleados, media, suma y un informe personalizado de cada uno que muestre número de empleado, apellido y salario. ? PROCEDURE EMPPLANTILLA 1 CREATE @VALOR NVARCHAR(30) 2 AS 3 DECLARE @CONSULTA NVARCHAR(30) 4 SELECT @CONSULTA = NOMBRE 5 FROM HOSPITAL WHERE NOMBRE = @VALOR 6 IF (@CONSULTA IS NULL) 7 BEGIN 8 SELECT @CONSULTA = NOMBRE FROM SALA 9 WHERE NOMBRE = @VALOR (@CONSULTA IS NULL) 10IF BEGIN 11SELECT @CONSULTA = T FROM PLANTILLA 12WHERE T = @VALOR 13IF (@CONSULTA IS NULL) 14BEGIN SELECT @CONSULTA = FUNCION FROM PLANTILLA 15WHERE FUNCION = @VALOR 16IF (@CONSULTA IS NULL) 17BEGIN 18PRINT 'EL VALOR INTRODUCIDO NO ES UN 19HOSPITAL, SALA, TURNO O FUNCIÓN: ' + @VALOR PRINT 'VERIFIQUE LOS DATOS INTRODUCIDOS' 20END 21ELSE 22BEGIN 23PRINT 'FUNCION' FUNCION AS [TURNO] 24SELECT ,AVG(SALARIO) AS [MEDIA] 25,COUNT(EMPLEADO_NO) AS [Nº EMPLEADOS] 26,SUM(SALARIO) AS [SUMA] FROM PLANTILLA 27GROUP BY FUNCION 28HAVING FUNCION = @VALOR SELECT EMPLEADO_NO AS [Nº EMPLEADO] 29,APELLIDO, SALARIO, FUNCION 30FROM PLANTILLA 31WHERE FUNCION = @VALOR 32END 33END ELSE 34BEGIN 35PRINT 'TURNO' 36SELECT T AS [TURNO] 37,AVG(SALARIO) AS [MEDIA] ,COUNT(EMPLEADO_NO) AS [Nº EMPLEADOS] 38,SUM(SALARIO) AS [SUMA] FROM PLANTILLA 39GROUP BY T 40HAVING T = @VALOR 41SELECT T AS [TURNO] 42,EMPLEADO_NO AS [Nº EMPLEADO] ,APELLIDO, SALARIO 43FROM PLANTILLA
44WHERE T = @VALOR 45END END 46ELSE 47BEGIN 48PRINT 'SALA' 49SELECT S.NOMBRE AS [SALA] AS [MEDIA] 50,AVG(P.SALARIO) ,COUNT(P.EMPLEADO_NO) AS [Nº EMPLEADOS] 51,SUM(P.SALARIO) AS [SUMA] FROM PLANTILLA AS P 52INNER SALA AS S 53ON S.HOSPITAL_COD = P.HOSPITAL_COD 54GROUP BY S.NOMBRE HAVING S.NOMBRE = @VALOR 55SELECT S.NOMBRE AS [SALA] 56,P.EMPLEADO_NO AS [Nº EMPLEADO] 57,P.APELLIDO, P.SALARIO 58FROM PLANTILLA AS P SALA AS S 59INNER ON S.HOSPITAL_COD = P.HOSPITAL_COD 60WHERE S.NOMBRE = @VALOR 61END 62END 63ELSE BEGIN 64PRINT 'HOSPITAL' 65SELECT H.NOMBRE AS [HOSPITAL] 66,AVG(P.SALARIO) AS [MEDIA] 67,COUNT(P.EMPLEADO_NO) AS [Nº EMPLEADOS] 68,SUM(P.SALARIO) AS [SUMA] FROM PLANTILLA AS P INNER HOSPITAL AS H 69ON H.HOSPITAL_COD = P.HOSPITAL_COD 70GROUP BY H.NOMBRE 71HAVING H.NOMBRE = @VALOR 72SELECT H.NOMBRE AS [HOSPITAL] AS [Nº EMPLEADO] 73,P.EMPLEADO_NO ,P.APELLIDO, P.SALARIO 74FROM PLANTILLA AS P 75INNER HOSPITAL AS H 76ON H.HOSPITAL_COD = P.HOSPITAL_COD 77WHERE H.NOMBRE = @VALOR END 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
94 95 ? 1EXEC EMPPLANTILLA 'GENERAL'
10) Crear un procedimiento en el que pasaremos como parámetro el Apellido de un empleado. El procedimiento devolverá los subordinados del empleado escrito, si el empleado no existe en la base de datos, informaremos de ello, si el empleado no tiene subordinados, lo informa remos con un mensaje y mostraremos su jefe. Mostrar el número de empleado, Apellido, Oficio y Departamento de los subordinados. ? 1 CREATE PROCEDURE JEFES 2 @APE NVARCHAR(30) 3 AS DECLARE @EMP INT, @JEFE INT, @SUB INT 4 SELECT @EMP = EMP_NO FROM EMP 5 WHERE APELLIDO = @APE 6 IF (@EMP IS NULL) 7 BEGIN 'NO EXISTE NINGUN EMPLEADO CON ESTE APELLIDO: ' + @APE 8 PRINT END 9 ELSE 10BEGIN 11SELECT @JEFE = A.EMP_NO 12,@SUB = B.EMP_NO FROM EMP AS A INNER EMP AS B 13ON A.EMP_NO = B.DIR 14WHERE B.DIR = @EMP 15ORDER BY B.DIR 16IF (@JEFE IS NULL) 17BEGIN SELECT A.EMP_NO AS [Nº DE EMPLEADO] 18,A.APELLIDO AS [JEFE], A.OFICIO 19,A.DEPT_NO AS [Nº DEPARTAMENTO] 20,B.EMP_NO AS [Nº EMPLEADO] 21,B.APELLIDO AS [SUBORDINADO] ,B.OFICIO 22,B.DEPT_NO AS [Nº DEPARTAMENTO] 23FROM EMP AS A 24INNER EMP AS B 25ON B.DIR = A.EMP_NO
26WHERE B.EMP_NO = @EMP 27ORDER BY B.DIR END 28ELSE 29BEGIN 30SELECT A.EMP_NO AS [Nº DE EMPLEADO] 31,A.APELLIDO AS [JEFE], A.OFICIO AS [Nº DEPARTAMENTO] 32,A.DEPT_NO ,B.EMP_NO AS [Nº EMPLEADO] 33,B.APELLIDO AS [SUBORDINADO] 34,B.OFICIO 35,B.DEPT_NO AS [Nº DEPARTAMENTO] 36FROM EMP AS A INNER EMP AS B ON A.EMP_NO = B.DIR 37WHERE B.DIR = @EMP 38ORDER BY B.DIR 39END 40END 41 42 43 44 45 46 47 48 ? 1EXEC JEFES 'GARCIA'
11) Crear procedimiento que borre un empleado que coincida con los parámetros indicados (los parámetros serán todos los campos de la tabla empleado). ? 1 CREATE PROCEDURE BORRA_EMPLEADO 2 @EMP_NO INT, 3 @APELLIDO NVARCHAR(20), @OFICIO NVARCHAR(20), 4 @DIR INT, 5 @FECHA_ALT SMALLDATETIME, 6 @SALARIO INT, 7 @COMISION INT, 8 @DEPT_NO INT AS 9 DELETE FROM EMP WHERE EMP_NO = @EMP_NO 10AND APELLIDO = @APELLIDO 11AND OFICIO = @OFICIO 12AND DIR = @DIR
13AND FECHA_ALT = @FECHA_ALT 14AND SALARIO = @SALARIO AND COMISION = @COMISION 15AND DEPT_NO = @DEPT_NO 16 17 18 ? 1EXEC BORRA_EMPLEADO 7895,'SUAREZ','EMPLEADO',0,'26/05/2015',16000,0,20
12) Modificación del ejercicio anterior, si no se introducen datos correctamente, informar de ello con un mensaje y no realizar la baja. Si el empleado introducido no existe en la base de datos, deberemos informarlo con un mensaje que devuelva el nombre y número de empleado del empleado introducido. Si el empleado existe, pero los datos para eliminarlo son incorrectos, informaremos mostrando los datos reales del empleado junto con los datos introducidos por el , para que se vea el fallo. ? 1 CREATE PROCEDURE BORRAEMPLEADO 2 @EMP_NO INT ,@APELLIDO NVARCHAR(20) 3 ,@OFICIO NVARCHAR(20) 4 ,@DIR INT 5 ,@FECHA_ALT SMALLDATETIME 6 ,@SALARIO INT INT 7 ,@COMISION ,@DEPT_NO INT 8 AS 9 DECLARE @VALOR NVARCHAR(30) 10SELECT @VALOR = EMP_NO 11FROM EMP WHERE EMP_NO = @EMP_NO AND APELLIDO = @APELLIDO 12AND OFICIO = @OFICIO 13AND DIR = @DIR 14AND FECHA_ALT = @FECHA_ALT 15AND SALARIO = @SALARIO COMISION = @COMISION 16AND AND DEPT_NO = @DEPT_NO 17IF (@VALOR IS NULL) 18BEGIN 19SELECT @VALOR = EMP_NO FROM EMP WHERE EMP_NO = @EMP_NO 20IF (@VALOR IS NULL) BEGIN 21PRINT 'EMPLEADO NO EXISTENTE EN LA BASE DE DATOS, VERIFIQUE LOS 22DATOS DEL SR ' + @APELLIDO 23END
24ELSE 25BEGIN PRINT 'DATOS INTRODUCIDOS ERRONEAMENTE: ' 26PRINT CAST(@EMP_NO AS NVARCHAR(4)) + ' ' + @APELLIDO + ' ' 27+ @OFICIO + ' ' + CAST(@DIR AS NVARCHAR(4)) + ' ' 28+ CAST(@FECHA_ALT AS NVARCHAR(12)) + ' ' 29+ CAST(@SALARIO AS NVARCHAR(10)) + ' ' AS NVARCHAR(10)) + ' ' 30++ CAST(@COMISION CAST(@DEPT_NO AS NVARCHAR(4)) 31SELECT @EMP_NO = EMP_NO, @APELLIDO = APELLIDO 32,@OFICIO = OFICIO, @DIR = DIR 33,@FECHA_ALT = FECHA_ALT, @SALARIO = SALARIO 34,@COMISION = COMISION, @DEPT_NO = DEPT_NO FROM EMP WHERE EMP_NO = @VALOR 35PRINT 'DATOS REALES DEL EMPLEADO: ' 36PRINT CAST(@EMP_NO AS NVARCHAR(4)) + ' ' + @APELLIDO + ' ' 37+ @OFICIO + ' ' + CAST(@DIR AS NVARCHAR(4)) + ' ' 38+ CAST(@FECHA_ALT AS NVARCHAR(12)) + ' ' AS NVARCHAR(10)) + ' ' 39++ CAST(@SALARIO CAST(@COMISION AS NVARCHAR(10)) + ' ' 40+ CAST(@DEPT_NO AS NVARCHAR(4)) 41END 42END 43ELSE BEGIN 44DELETE FROM EMP WHERE EMP_NO = @EMP_NO 45AND APELLIDO = @APELLIDO 46AND OFICIO = @OFICIO 47AND DIR = @DIR 48AND FECHA_ALT = @FECHA_ALT AND SALARIO = @SALARIO 49AND COMISION = @COMISION 50AND DEPT_NO = @DEPT_NO 51END 52 53 54 55 56 57 58 59 60 61 62 ? 1EXEC BORRAEMPLEADO 7895,'SUAREZ','EMPLEADO',0,'26/05/2015',16000,0,20
13) Crear un procedimiento para insertar un empleado de la plantilla del Hospital. Para poder insertar el empleado realizaremos restricciones: - No podrá estar repetido el número de empleado. - Para insertar, lo haremos por el nombre del hospital y por el nombre de sala, si no existe la sala o el hospital, no insertaremos y lo informaremos. - El oficio para insertar deberá estar entre los que hay en la base de datos, al igual que el Turno. - El salario no superará las 500.000 ptas. - (Opcional) Podremos insertar por el código del hospital o sala y por su nombre. ? 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 2 0 2 1 2 2 2 3
CREATE PROCEDURE INSERTAR_PLANTILLA @HOSPITAL NVARCHAR(30) ,@SALA NVARCHAR(30) ,@EMPLEADO INT ,@APELLIDO NVARCHAR(30) ,@FUNCION NVARCHAR(30) ,@TURNO NVARCHAR(2) ,@SALARIO INT AS DECLARE @HOSPITAL2 INT DECLARE @SALA2 INT DECLARE @EMPLEADO2 INT DECLARE @APELLIDO2 NVARCHAR(30) DECLARE @FUNCION2 NVARCHAR(30) DECLARE @TURNO2 NVARCHAR(2) SELECT @EMPLEADO2 = EMPLEADO_NO FROM PLANTILLA WHERE EMPLEADO_NO = @EMPLEADO IF (@EMPLEADO2 IS NULL) BEGIN SELECT @SALA2 = SALA_COD FROM SALA WHERE NOMBRE = @SALA SELECT @HOSPITAL2 = HOSPITAL_COD FROM HOSPITAL WHERE NOMBRE = @HOSPITAL IF (@SALA2 IS NULL OR @HOSPITAL2 IS NULL) BEGIN PRINT 'LA SALA O EL HOSPITAL INTRODUCIDO NO ESTÁN EN LOS DATOS:' PRINT 'SALA: ' + @SALA PRINT 'HOSPITAL: ' + @HOSPITAL PRINT '' PRINT 'NO SE HA REALIZADO LA INSERCIÓN' END ELSE BEGIN SELECT @FUNCION2 = FUNCION FROM PLANTILLA WHERE FUNCION = @FUNCION SELECT @TURNO2 = T FROM PLANTILLA WHERE T = @TURNO IF (@FUNCION2 IS NULL OR @TURNO2 IS NULL) BEGIN PRINT 'LA FUNCIÓN O EL TURNO INTRODUCIDOS NO SON VÁLIDOS' PRINT 'FUNCION: ' + @FUNCION PRINT 'TURNO: ' + @TURNO
2 4 2 5 2 6 2 7 2 8 2 9 3 0 3 1 3 2 3 3 3 4 3 5 3 6 3 7 3 8 3 9 4 0 4 1 4 2 4 3 4 4 4 5 4 6 4 7 4 8
PRINT '' PRINT 'NO SE HA REALIZADO LA INSERCIÓN' END ELSE BEGIN IF (@SALARIO > 500000) BEGIN PRINT 'EL SALARIO MÁXIMO PARA LOS TRABAJADORES DE LA PLANTILLA ES DE 500.000 PTAS' PRINT 'NO SE HA REALIZADO LA INSERCIÓN' END ELSE BEGIN INSERT INTO PLANTILLA(Hospital_Cod,Sala_Cod,Empleado_No,Apellido,Funcion,T,Salar io) VALUES (@HOSPITAL2, @SALA2, @EMPLEADO , @APELLIDO, @FUNCION, @TURNO, @SALARIO) PRINT 'INSERCIÓN REALIZADA CORRECTAMENTE' END END END END ELSE BEGIN PRINT 'EL NÚMERO DE EMPLEADO INTRODUCIDO ESTÁ REPETIDO: ' + CAST(@EMPLEADO AS NVARCHAR(4)) PRINT 'NO SE HA REALIZADO LA INSERCIÓN' END
4 9 5 0 5 1 5 2 5 3 5 4 5 5 5 6 5 7 5 8 5 9 6 0 6 1 6 2 6 3 6 4 6 5 6 6 6 7 6 8 6 9 7 0 7 1 7 2 ?
EXEC INSERTAR_PLANTILLA 'La Paz','Recuperación',9584,'Pablo
1S.','Enfermero','T',474890