Sei sulla pagina 1di 23

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 parmetro/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 parmetro ndep que es tipo smallint


(equivalente al short en visual).
El procedimiento hace una select que realiza grupos por nmero de deparamento y cuenta
cuantos empleados hay en cada departamento.

?
1EXEC NUMEMPDEPT 20

Ejecuta el procedimiento introduciendo el valor 20 para el parmetro ndep, con lo que


hara la select sobre el departamento 20.

Ejemplo 2

?
1CREATE PROCEDURE BUSCAEMP(
2@NDEP SMALLINT,
3@NOFICIO
AS
NVARCHAR(19))
4SELECT * FROM EMP
5WHERE DEPT_NO = @NDEP
6AND OFICIO = @NOFICIO
7

?
1EXEC BUSCAEMP 20,'Empleado'

PROCEDIMIENTOS ALMACENADOS CON PARMETROS CON VALORES


POR DEFECTO

Sintaxis:

Create Procedure Nombre @Variable tipo = Valor


As
Instrucciones

Donde Valor es el valor que le damos por defecto, este valor puede almacenar comodines
(como % que equivale a *).

Ejemplo 1

Crea un procedimiento con el parmetro 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
Debe devolver salario, oficio y comisin 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'

Sacara el salario, el oficio y la comisin de todos los que tengan apellido Garcia, sino
pusisemos parmetro, por defecto sacara 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'

Sacara oficio, salario y comisin 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 parmetros indicados (los parmetros sern 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,
7 @COMISION INT,
@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 declaracin
Declare @nombre tipo_dato

Sintaxis de asignacin directa


Set @nombre = valor

Sintaxis de asignacin 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 PARMETRO 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 DESPUS 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 tambin, 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),
USUARIO 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
,USER_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 ms prembulos 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
6SELECT * FROM EMP WHERE FECHA_ALT BETWEEN @FINICIAL AND @FFINAL
AND DEPT_NO = @DEPT_NO
7

?
1EXEC FECHASDEPT '01/01/1965','01/01/1985',20

2) Crear procedimiento que inserte un empleado.

?
1 CREATE PROCEDURE INSERTA_EMPLEADO
@EMP_NO INT,
2 @APELLIDO NVARCHAR(20),
3 @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, nmero y nmero de personas a partir


del nmero 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 tambin las personas
que trabajan en dicho departamento, pasndole como parmetro 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 JOIN 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 JOIN 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 comisin, pasndole 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 ningn valor, mostrar los datos de todos
los empleados.

?
1CREATE PROCEDURE OFICIOSALARIO @PAPELLIDO NVARCHAR(20) ='%' AS
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 parmetro.

?
1CREATE PROCEDURE SALARIO_OFICIOLIKE @PAPELLIDO VARCHAR(20) = 'REY' AS
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 nmero departamento, el nombre y nmero de


empleados, dndole como valor el nombre del departamento, si el nombre introducido no
es vlido, mostraremos un mensaje informativo comunicndolo.

?
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 JOIN DEPT AS D
14ON E.DEPT_NO = D.DEPT_NO
15WHERE D.DNOMBRE = @DEPT
16GROUP
END
BY D.DNOMBRE, E.DEPT_NO
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 funcin. El informe mostrar nmero de
empleados, media, suma y un informe personalizado de cada uno que muestre nmero de
empleado, apellido y salario.

?
1 CREATE PROCEDURE EMPPLANTILLA
@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
10IF (@CONSULTA IS NULL)
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 FUNCIN: ' + @VALOR
PRINT 'VERIFIQUE LOS DATOS INTRODUCIDOS'
20END
21ELSE
22BEGIN
23PRINT 'FUNCION'
24SELECT FUNCION AS [TURNO]
,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]
50,AVG(P.SALARIO) AS [MEDIA]
,COUNT(P.EMPLEADO_NO) AS [N EMPLEADOS]
51,SUM(P.SALARIO) AS [SUMA] FROM PLANTILLA AS P
52INNER JOIN 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
59INNER JOIN SALA AS S
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 JOIN HOSPITAL AS H
69ON H.HOSPITAL_COD = P.HOSPITAL_COD
70GROUP BY H.NOMBRE
71HAVING H.NOMBRE = @VALOR
72SELECT H.NOMBRE AS [HOSPITAL]
73,P.EMPLEADO_NO AS [N EMPLEADO]
,P.APELLIDO, P.SALARIO
74FROM PLANTILLA AS P
75INNER JOIN 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 parmetro 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 nmero
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
8 PRINT
END
'NO EXISTE NINGUN EMPLEADO CON ESTE APELLIDO: ' + @APE
9 ELSE
10BEGIN
11SELECT @JEFE = A.EMP_NO
12,@SUB = B.EMP_NO
FROM EMP AS A INNER JOIN 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 JOIN 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
32,A.DEPT_NO AS [N DEPARTAMENTO]
,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 JOIN 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 parmetros
indicados (los parmetros sern 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) Modificacin 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 nmero
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 usuario, 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
7 ,@COMISION INT
,@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
16AND COMISION = @COMISION
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)) + ' '
30++ CAST(@COMISION AS NVARCHAR(10)) + ' '
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)) + ' '
39++ CAST(@SALARIO AS NVARCHAR(10)) + ' '
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 nmero 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 cdigo del hospital o sala y por su nombre.

?
1 CREATE PROCEDURE INSERTAR_PLANTILLA
@HOSPITAL NVARCHAR(30)
2 ,@SALA NVARCHAR(30)
3 ,@EMPLEADO INT
4 ,@APELLIDO NVARCHAR(30)
5 ,@FUNCION NVARCHAR(30)
6 ,@TURNO NVARCHAR(2)
,@SALARIO INT
7 AS
8 DECLARE @HOSPITAL2 INT
9 DECLARE @SALA2 INT
1 DECLARE @EMPLEADO2 INT
DECLARE @APELLIDO2 NVARCHAR(30)
0
DECLARE @FUNCION2 NVARCHAR(30)
1 DECLARE @TURNO2 NVARCHAR(2)
1 SELECT @EMPLEADO2 = EMPLEADO_NO FROM PLANTILLA
1 WHERE EMPLEADO_NO = @EMPLEADO
2 IF (@EMPLEADO2 IS NULL)
BEGIN
1 SELECT @SALA2 = SALA_COD FROM SALA
3 WHERE NOMBRE = @SALA
1 SELECT @HOSPITAL2 = HOSPITAL_COD FROM HOSPITAL
4 WHERE NOMBRE = @HOSPITAL
1 IF (@SALA2 IS NULL OR @HOSPITAL2 IS NULL)
BEGIN
5 PRINT 'LA SALA O EL HOSPITAL INTRODUCIDO NO ESTN EN LOS
1 DATOS:'
6 PRINT 'SALA: ' + @SALA
1 PRINT 'HOSPITAL: ' + @HOSPITAL
PRINT ''
7
1 PRINT 'NO SE HA REALIZADO LA INSERCIN'
8 END
1 ELSE
9 BEGIN
2 SELECT @FUNCION2 = FUNCION FROM PLANTILLA
WHERE FUNCION = @FUNCION
0 SELECT @TURNO2 = T FROM PLANTILLA
2 WHERE T = @TURNO
1 IF (@FUNCION2 IS NULL OR @TURNO2 IS NULL)
2 BEGIN
PRINT 'LA FUNCIN O EL TURNO INTRODUCIDOS NO SON
2 VLIDOS'
2 PRINT 'FUNCION: ' + @FUNCION
3 PRINT 'TURNO: ' + @TURNO
2 PRINT ''
4 PRINT 'NO SE HA REALIZADO LA INSERCIN'
END
2 ELSE
5 BEGIN
2 IF (@SALARIO > 500000)
6 BEGIN
PRINT 'EL SALARIO MXIMO PARA LOS TRABAJADORES
2 DE LA PLANTILLA ES DE 500.000 PTAS'
7 PRINT 'NO SE HA REALIZADO LA INSERCIN'
2 END
8 ELSE
2 BEGIN
INSERT INTO
9 PLANTILLA(Hospital_Cod,Sala_Cod,Empleado_No,Apellido,Funcion,T,Salar
3 io)
0 VALUES (@HOSPITAL2, @SALA2, @EMPLEADO
3 , @APELLIDO, @FUNCION, @TURNO, @SALARIO)
PRINT 'INSERCIN REALIZADA CORRECTAMENTE'
1 END
3 END
2 END
3 END
3 ELSE
BEGIN
3 PRINT 'EL NMERO DE EMPLEADO INTRODUCIDO EST REPETIDO: ' +
4 CAST(@EMPLEADO AS NVARCHAR(4))
3 PRINT 'NO SE HA REALIZADO LA INSERCIN'
5 END
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
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','Recuperacin',9584,'Pablo
1S.','Enfermero','T',474890

Potrebbero piacerti anche