Vous êtes sur la page 1sur 21

Todo sobre procedimientos almacenados y triggers

http://www.sqlserverya.com.ar/index.php?inicio=125

) 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

@FINICIAL DATETIME,

@FFINAL SMALLDATETIME ,

@DEPT_NO NVARCHAR(10)

AS

SELECT * FROM EMP WHERE FECHA_ALT BETWEEN @FINICIAL AND @FFINAL

AND DEPT_NO = @DEPT_NO

?
1

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

2) Crear procedimiento que inserte un empleado.

?
1
2
3
4
5
6

CREATE PROCEDURE INSERTA_EMPLEADO


@EMP_NO INT,
@APELLIDO NVARCHAR(20),
@OFICIO NVARCHAR(20),
@DIR INT,
@FECHA_ALT SMALLDATETIME,

@SALARIO INT,

@COMISION INT,

@DEPT_NO INT

10

AS

11

INSERT INTO EMP VALUES

12

(@EMP_NO,

13

@APELLIDO,

14
15
16
17
18

@OFICIO,
@DIR,
@FECHA_ALT,
@SALARIO,
@COMISION,
@DEPT_NO)

19

?
1

EXEC INSERTA_EMPLEADO 7895,'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.

?
1

CREATE PROCEDURE NUMEMP_DEPT @NDEP SMALLINT

AS SELECT COUNT(*) AS [NUM EMPLEADOS], DEPT_NO

FROM EMP

WHERE DEPT_NO = @NDEP

GROUP BY DEPT_NO

?
1

EXEC 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
3
4

CREATE PROCEDURE PERSONASDEPT @DEPT NVARCHAR(30)


AS
SELECT E.DEPT_NO AS [NUMERO DEPT]
, D.DNOMBRE AS [NOMBRE], COUNT(*) AS [NUMERO EMPLEADOS]

FROM EMP AS E

INNER JOIN DEPT AS D

ON E.DEPT_NO = D.DEPT_NO

WHERE D.DNOMBRE = @DEPT

GROUP BY D.DNOMBRE, E.DEPT_NO

10

SELECT E.DEPT_NO AS [N DEPARTAMENTO]

11

, D.DNOMBRE AS [DEPARTAMENTO]

12

, E.APELLIDO, E.SALARIO

13
14
15
16

FROM EMP AS E
INNER JOIN DEPT AS D
ON E.DEPT_NO = D.DEPT_NO
WHERE D.DNOMBRE = @DEPT

?
1

EXEC PERSONASDEPT 'CONTABILIDAD'

5) Crear procedimiento para devolver salario, oficio y comisin, pasndole el apellido.

?
1

CREATE PROCEDURE SALARIO_OFICIO @PAPELLIDO NVARCHAR(20) AS

SELECT OFICIO, SALARIO, COMISION FROM EMP WHERE APELLIDO = @PAPELLIDO

?
1

EXEC SALARIO_OFICIO 'GARCIA'

6) Igual que el anterior, pero si no le pasamos ningn valor, mostrar los datos de
todos los empleados.

?
1

CREATE PROCEDURE OFICIOSALARIO @PAPELLIDO NVARCHAR(20) ='%' AS

SELECT OFICIO, SALARIO, COMISION FROM EMP WHERE APELLIDO LIKE @PAPELLIDO

?
1

EXEC 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.

?
1

CREATE PROCEDURE SALARIO_OFICIOLIKE @PAPELLIDO VARCHAR(20) = 'REY' AS

SELECT OFICIO, SALARIO, COMISION FROM EMP WHERE APELLIDO LIKE '%' + @PAPELLIDO + '%

?
1

EXEC SALARIO_OFICIOLIKE 'S'

Parte 2

Ejercicios de procedimientos almacenados en SQL


Server - 2 de 2

Regresar al ndice

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
CREATE PROCEDURE DEPARTAMENTO @DEPT NVARCHAR(30)

2
3
4
5

AS
DECLARE @DEPTDEF NVARCHAR(30)
SET @DEPTDEF = NULL
SELECT @DEPTDEF = DNOMBRE FROM DEPT

WHERE DNOMBRE = @DEPT

IF (@DEPTDEF IS NULL)

PRINT 'DEPARTAMENTO INTRODUCIDO NO VALIDO: ' + @DEPT

ELSE

10

BEGIN

11

SELECT E.DEPT_NO AS [NUMERO DEPT]

12

, D.DNOMBRE AS [NOMBRE], COUNT(*) AS [NUMERO EMPLEADOS]

13

FROM EMP AS E

14
15
16
17

INNER JOIN DEPT AS D


ON E.DEPT_NO = D.DEPT_NO
WHERE D.DNOMBRE = @DEPT
GROUP BY D.DNOMBRE, E.DEPT_NO
END

18

?
1

EXEC 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)

AS

DECLARE @CONSULTA NVARCHAR(30)

5
6
7
8

SELECT @CONSULTA = NOMBRE


FROM HOSPITAL
WHERE NOMBRE = @VALOR
IF (@CONSULTA IS NULL)
BEGIN

9
10
11
12

SELECT @CONSULTA = NOMBRE FROM SALA


WHERE NOMBRE = @VALOR
IF (@CONSULTA IS NULL)
BEGIN

13

SELECT @CONSULTA = T FROM PLANTILLA

14

WHERE T = @VALOR

15

IF (@CONSULTA IS NULL)

16

BEGIN

17
18
19
20

SELECT @CONSULTA = FUNCION FROM PLANTILLA


WHERE FUNCION = @VALOR
IF (@CONSULTA IS NULL)
BEGIN
PRINT 'EL VALOR INTRODUCIDO NO ES UN

21
22
23
24

HOSPITAL, SALA, TURNO O FUNCIN: ' + @VALOR


PRINT 'VERIFIQUE LOS DATOS INTRODUCIDOS'
END
ELSE

25

BEGIN

26

PRINT 'FUNCION'

27

SELECT FUNCION AS [TURNO]

28

,AVG(SALARIO) AS [MEDIA]

29

,COUNT(EMPLEADO_NO) AS [N EMPLEADOS]

30

,SUM(SALARIO) AS [SUMA] FROM PLANTILLA

31

GROUP BY FUNCION

32
33
34
35
36
37
38
39
40

HAVING FUNCION = @VALOR


SELECT EMPLEADO_NO AS [N EMPLEADO]
,APELLIDO, SALARIO, FUNCION
FROM PLANTILLA
WHERE FUNCION = @VALOR
END
END
ELSE
BEGIN
PRINT 'TURNO'

41

SELECT T AS [TURNO]

42

,AVG(SALARIO) AS [MEDIA]

43

,COUNT(EMPLEADO_NO) AS [N EMPLEADOS]

44

,SUM(SALARIO) AS [SUMA] FROM PLANTILLA

45
46
47
48
49
50
51
52

GROUP BY T
HAVING T = @VALOR
SELECT T AS [TURNO]
,EMPLEADO_NO AS [N EMPLEADO]
,APELLIDO, SALARIO
FROM PLANTILLA
WHERE T = @VALOR
END
END

53

ELSE

54

BEGIN

55

PRINT 'SALA'

56

SELECT S.NOMBRE AS [SALA]

57

,AVG(P.SALARIO) AS [MEDIA]

58

,COUNT(P.EMPLEADO_NO) AS [N EMPLEADOS]

59

,SUM(P.SALARIO) AS [SUMA] FROM PLANTILLA AS P

60

INNER JOIN SALA AS S

61
62
63
64

ON S.HOSPITAL_COD = P.HOSPITAL_COD
GROUP BY S.NOMBRE
HAVING S.NOMBRE = @VALOR
SELECT S.NOMBRE AS [SALA]
,P.EMPLEADO_NO AS [N EMPLEADO]

65
66
67
68

,P.APELLIDO, P.SALARIO
FROM PLANTILLA AS P
INNER JOIN SALA AS S
ON S.HOSPITAL_COD = P.HOSPITAL_COD

69
70
71
72

WHERE S.NOMBRE = @VALOR

73

END

74

END

75

ELSE

76

BEGIN

77

PRINT 'HOSPITAL'

78
79
80
81

SELECT H.NOMBRE AS [HOSPITAL]


,AVG(P.SALARIO) AS [MEDIA]
,COUNT(P.EMPLEADO_NO) AS [N EMPLEADOS]
,SUM(P.SALARIO) AS [SUMA] FROM PLANTILLA AS P
INNER JOIN HOSPITAL AS H

82
83
84
85

ON H.HOSPITAL_COD = P.HOSPITAL_COD
GROUP BY H.NOMBRE
HAVING H.NOMBRE = @VALOR
SELECT H.NOMBRE AS [HOSPITAL]

86

,P.EMPLEADO_NO AS [N EMPLEADO]

87

,P.APELLIDO, P.SALARIO

88

FROM PLANTILLA AS P

89

INNER JOIN HOSPITAL AS H

90

ON H.HOSPITAL_COD = P.HOSPITAL_COD

91

WHERE H.NOMBRE = @VALOR

92

END

93
94
95

?
1

EXEC 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

@APE NVARCHAR(30)

AS

DECLARE @EMP INT, @JEFE INT, @SUB INT

5
6
7
8
9
10

SELECT @EMP = EMP_NO FROM EMP


WHERE APELLIDO = @APE
IF (@EMP IS NULL)
BEGIN
PRINT 'NO EXISTE NINGUN EMPLEADO CON ESTE APELLIDO: ' + @APE
END
ELSE

11

BEGIN

12

SELECT @JEFE = A.EMP_NO

13

,@SUB = B.EMP_NO

14

FROM EMP AS A INNER JOIN EMP AS B

15
16
17
18

ON A.EMP_NO = B.DIR
WHERE B.DIR = @EMP
ORDER BY B.DIR
IF (@JEFE IS NULL)
BEGIN

19
20
21
22

SELECT A.EMP_NO AS [N DE EMPLEADO]


,A.APELLIDO AS [JEFE], A.OFICIO
,A.DEPT_NO AS [N DEPARTAMENTO]
,B.EMP_NO AS [N EMPLEADO]

23

,B.APELLIDO AS [SUBORDINADO]

24

,B.OFICIO

25

,B.DEPT_NO AS [N DEPARTAMENTO]

26

FROM EMP AS A

27

INNER JOIN EMP AS B

28

ON B.DIR = A.EMP_NO

29

WHERE B.EMP_NO = @EMP

30

ORDER BY B.DIR

31
32
33
34
35
36
37
38

END
ELSE
BEGIN
SELECT A.EMP_NO AS [N DE EMPLEADO]
,A.APELLIDO AS [JEFE], A.OFICIO
,A.DEPT_NO AS [N DEPARTAMENTO]
,B.EMP_NO AS [N EMPLEADO]
,B.APELLIDO AS [SUBORDINADO]
,B.OFICIO

39
40
41
42
43

,B.DEPT_NO AS [N DEPARTAMENTO]
FROM EMP AS A INNER JOIN EMP AS B
ON A.EMP_NO = B.DIR
WHERE B.DIR = @EMP

44
45
46

ORDER BY B.DIR
END
END

47
48

?
1

EXEC 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

@EMP_NO INT,

@APELLIDO NVARCHAR(20),

@OFICIO NVARCHAR(20),
@DIR INT,

5
6

@FECHA_ALT SMALLDATETIME,

@SALARIO INT,

8
9
10
11
12
13
14
15

@COMISION INT,
@DEPT_NO INT
AS
DELETE FROM EMP WHERE EMP_NO = @EMP_NO
AND APELLIDO = @APELLIDO
AND OFICIO = @OFICIO
AND DIR = @DIR
AND FECHA_ALT = @FECHA_ALT
AND SALARIO = @SALARIO

16

AND COMISION = @COMISION

17

AND DEPT_NO = @DEPT_NO

18

?
1

EXEC 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

@EMP_NO INT

,@APELLIDO NVARCHAR(20)

,@OFICIO NVARCHAR(20)

5
6
7
8
9
10
11

,@DIR INT
,@FECHA_ALT SMALLDATETIME
,@SALARIO INT
,@COMISION INT
,@DEPT_NO INT
AS
DECLARE @VALOR NVARCHAR(30)
SELECT @VALOR = EMP_NO

12

FROM EMP WHERE EMP_NO = @EMP_NO

13

AND APELLIDO = @APELLIDO

14

AND OFICIO = @OFICIO

15

AND DIR = @DIR

16

AND FECHA_ALT = @FECHA_ALT

17

AND SALARIO = @SALARIO

18

AND COMISION = @COMISION

19

AND DEPT_NO = @DEPT_NO

20
21
22
23

IF (@VALOR IS NULL)
BEGIN
SELECT @VALOR = EMP_NO FROM EMP WHERE EMP_NO = @EMP_NO
IF (@VALOR IS NULL)
BEGIN

24

PRINT 'EMPLEADO NO EXISTENTE EN LA BASE DE DATOS, VERIFIQUE LOS

25

DATOS DEL SR ' + @APELLIDO

26

END

27

ELSE

28

BEGIN

29
30
31
32
33
34
35
36

PRINT 'DATOS INTRODUCIDOS ERRONEAMENTE: '


PRINT CAST(@EMP_NO AS NVARCHAR(4)) + ' ' + @APELLIDO + ' '
+ @OFICIO + ' ' + CAST(@DIR AS NVARCHAR(4)) + ' '
+ CAST(@FECHA_ALT AS NVARCHAR(12)) + ' '
+ CAST(@SALARIO AS NVARCHAR(10)) + ' '
+ CAST(@COMISION AS NVARCHAR(10)) + ' '
+ CAST(@DEPT_NO AS NVARCHAR(4))
SELECT @EMP_NO = EMP_NO, @APELLIDO = APELLIDO
,@OFICIO = OFICIO, @DIR = DIR

37

,@FECHA_ALT = FECHA_ALT, @SALARIO = SALARIO

38

,@COMISION = COMISION, @DEPT_NO = DEPT_NO

39

FROM EMP WHERE EMP_NO = @VALOR

40

PRINT 'DATOS REALES DEL EMPLEADO: '

41

PRINT CAST(@EMP_NO AS NVARCHAR(4)) + ' ' + @APELLIDO + ' '

42

+ @OFICIO + ' ' + CAST(@DIR AS NVARCHAR(4)) + ' '

43

+ CAST(@FECHA_ALT AS NVARCHAR(12)) + ' '

44
45
46
47
48
49
50
51
52

+ CAST(@SALARIO AS NVARCHAR(10)) + ' '


+ CAST(@COMISION AS NVARCHAR(10)) + ' '
+ CAST(@DEPT_NO AS NVARCHAR(4))
END
END
ELSE
BEGIN
DELETE FROM EMP WHERE EMP_NO = @EMP_NO
AND APELLIDO = @APELLIDO
AND OFICIO = @OFICIO

53
54
55

AND DIR = @DIR

56

AND FECHA_ALT = @FECHA_ALT

57

AND SALARIO = @SALARIO

58

AND COMISION = @COMISION

59

AND DEPT_NO = @DEPT_NO

60

END

61
62

?
1

EXEC 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)

,@SALA NVARCHAR(30)

,@EMPLEADO INT

5
6
7
8
9
10
11

,@APELLIDO NVARCHAR(30)
,@FUNCION NVARCHAR(30)
,@TURNO NVARCHAR(2)
,@SALARIO INT
AS
DECLARE @HOSPITAL2 INT
DECLARE @SALA2 INT
DECLARE @EMPLEADO2 INT

12

DECLARE @APELLIDO2 NVARCHAR(30)

13

DECLARE @FUNCION2 NVARCHAR(30)

14

DECLARE @TURNO2 NVARCHAR(2)

15

SELECT @EMPLEADO2 = EMPLEADO_NO FROM PLANTILLA

16

WHERE EMPLEADO_NO = @EMPLEADO

17

IF (@EMPLEADO2 IS NULL)

18

BEGIN

19

SELECT @SALA2 = SALA_COD FROM SALA

20
21
22
23
24

WHERE NOMBRE = @SALA


SELECT @HOSPITAL2 = HOSPITAL_COD FROM HOSPITAL
WHERE NOMBRE = @HOSPITAL
IF (@SALA2 IS NULL OR @HOSPITAL2 IS NULL)
BEGIN

25

PRINT 'LA SALA O EL HOSPITAL INTRODUCIDO NO ESTN EN LOS

26

DATOS:'

27

PRINT 'SALA: ' + @SALA

28

PRINT 'HOSPITAL: ' + @HOSPITAL

29

PRINT ''

30
31
32
33
34
35
36

PRINT 'NO SE HA REALIZADO LA INSERCIN'


END
ELSE
BEGIN
SELECT @FUNCION2 = FUNCION FROM PLANTILLA
WHERE FUNCION = @FUNCION
SELECT @TURNO2 = T FROM PLANTILLA

37

WHERE T = @TURNO

38

IF (@FUNCION2 IS NULL OR @TURNO2 IS NULL)

39

BEGIN

40

PRINT 'LA FUNCIN O EL TURNO INTRODUCIDOS NO SON

41

VLIDOS'

42

PRINT 'FUNCION: ' + @FUNCION

43

PRINT 'TURNO: ' + @TURNO

44

PRINT ''

45
46
47
48
49
50
51
52

PRINT 'NO SE HA REALIZADO LA INSERCIN'


END
ELSE
BEGIN
IF (@SALARIO > 500000)
BEGIN
PRINT 'EL SALARIO MXIMO PARA LOS TRABAJADORES
DE LA PLANTILLA ES DE 500.000 PTAS'
PRINT 'NO SE HA REALIZADO LA INSERCIN'

53
54
55

END

56

ELSE

57

BEGIN

58

INSERT INTO PLANTILLA(Hospital_Cod,Sala_Cod,Empleado_No,Apellido,Funcion,T,Salari

59
60
61
62

VALUES (@HOSPITAL2, @SALA2, @EMPLEADO


, @APELLIDO, @FUNCION, @TURNO, @SALARIO)
PRINT 'INSERCIN REALIZADA CORRECTAMENTE'
END
END

63
64
65
66

END
END
ELSE
BEGIN

67

PRINT 'EL NMERO DE EMPLEADO INTRODUCIDO EST REPETIDO: ' +

68

CAST(@EMPLEADO AS NVARCHAR(4))

69

PRINT 'NO SE HA REALIZADO LA INSERCIN'

70

END

71
72

?
1

EXEC INSERTAR_PLANTILLA 'La Paz','Recuperacin',9584,'Pablo S.','Enfermero'

Vous aimerez peut-être aussi