Está en la página 1de 15

FACULTAD DE INGENIERÍA DE SISTEMAS E INFORMATICA

PROCEDIMIENTOR ALMACENADOS, FUNCIONES, TRIGGERSY Y


CURSORES

DOCENTE:
ING. JOSE EDGAR GARCIA DIAZ, MGR.

CURSO:
BASE DE DATOS II – G1

PARTICIPANTES:

- PIPA VILLANUEVA ZENDER OSMAR


- CRISTIAN JAIR RUIZ VILLAVERDE
-TELLO TUESTA DEL PIERO ALEXANDER
-POLO NUÑEZ GERSON ANTHONY
-VASQUEZ CANAYO RUSBELT
-ROJAS GÓMEZ LUIS FELIPE

IQUITOS, PERÚ
2023
PROCEDIMIENTO ALMACENADOS
1. creacion del procedimiento almacenado para obtener el precio maximo de un titulo
ingresando el tipo

CREATE PROCEDURE obtenerPrecioMaxdeTitulo(@tipo VARCHAR(12))


AS
BEGIN
SELECT t.title, t.price precio,t.type FROM titles t
where type = @tipo
group by title,t.type,t.price
having t.price = (select max(price) from titles where type
= @tipo)
END
go
exec obtenerPrecioMaxdeTitulo 'psychology'

2. Este procedimiento almacenado devuelve todos los libros que


escribió un autor

CREATE PROCEDURE TitulosAutor


@NombreAutor VARCHAR(50)
AS
BEGIN
SELECT t.title, t.pubdate
FROM titles t
INNER JOIN titleauthor ta ON t.title_id = ta.title_id
INNER JOIN authors a ON ta.au_id = a.au_id
WHERE a.au_lname + ', ' + a.au_fname = @NombreAutor;
END
GO
3. listar todos los títulos y su correspondiente autor

CREATE PROCEDURE listarTitulosAutores


AS
BEGIN
SELECT titles.title, authors.au_fname, authors.au_lname
FROM titles
JOIN titleauthor ON titles.title_id =
titleauthor.title_id
JOIN authors ON titleauthor.au_id = authors.au_id
ORDER BY titles.title ASC
END

4. Eliminar un autor y sus títulos relacionados

CREATE PROCEDURE eliminarAutorYTItulosRelacionados


@id_autor VARCHAR(11)
AS
BEGIN
DELETE FROM titleauthor
WHERE au_id = @id_autor

DELETE FROM titles


WHERE title_id IN (
SELECT title_id
FROM titleauthor
WHERE au_id = @id_autor
)

DELETE FROM authors


WHERE au_id = @id_autor
END
5. insertar un nuevo título y sus autores

CREATE PROCEDURE insertarTituloYAutores


@titulo VARCHAR(80),
@tipo VARCHAR(20),
@precio FLOAT,
@au_ids VARCHAR(255)
AS
BEGIN
BEGIN TRANSACTION

DECLARE @id_titulo VARCHAR(6)


EXECUTE dbo.nuevo_id_titulo @id_titulo OUTPUT

INSERT INTO titles (title_id, title, type, price)


VALUES (@id_titulo, @titulo, @tipo, @precio)

DECLARE @au_id VARCHAR(11)


DECLARE @posicion INT

WHILE CHARINDEX(',', @au_ids) > 0


BEGIN
SELECT @posicion = CHARINDEX(',', @au_ids)
SELECT @au_id = SUBSTRING(@au_ids, 1, @posicion-1)

INSERT INTO titleauthor (title_id, au_id)


VALUES (@id_titulo, @au_id)

SELECT @au_ids = STUFF(@au_ids, 1, @posicion, '')


END

INSERT INTO titleauthor (title_id, au_id)


VALUES (@id_titulo, @au_ids)

COMMIT TRANSACTION
END
FUNCION
1. crear una función de tabla en línea que me permita mostrar los editores y la cantidad
de los títulos que estuvieron a sus servicios

create function editores_cantidad (@idEditor int)


returns table
as
return
(

select p.pub_name Editor,count(t.title_id)


cantidad from publishers p
join titles t on t.pub_id = p.pub_id
where p.pub_id = @idEditor
group by p.pub_name
)

2. Esta función devuelve el total de libros vendidos por autor

CREATE FUNCTION TotalVentas (@au_id varchar(11))


RETURNS INT
AS
BEGIN
DECLARE @TotalVentas INT

SELECT @TotalVentas = SUM(qty)


FROM sales
WHERE stor_id IN (
SELECT stor_id
FROM titleauthor
WHERE au_id = @au_id
)

RETURN @TotalVentas
END

SELECT a.au_fname+' '+a.au_lname as Autor,dbo.TotalVentas('213-46-


8915') as 'Ventas totales' from authors a where au_id='213-46-8915'
3.

CREATE FUNCTION Libros_por_autor (@authorsId VARCHAR(11))


RETURNS TABLE
AS
RETURN
(
SELECT * FROM titleauthor WHERE au_id='472-27-2349'
)

select * from authors

4.FUNCIONES CON VALOR DE TABLA

--OBTENER TODOS LOS AUTORES Y SUS TÍTULOS

CREATE FUNCTION autoresYTitulos()


RETURNS @resultados TABLE (
au_id VARCHAR(11),
au_nombre VARCHAR(40),
au_apellido VARCHAR(40),
titulo VARCHAR(80),
tipo VARCHAR(20),
precio FLOAT
)
AS
BEGIN
INSERT INTO @resultados
SELECT authors.au_id, authors.au_fname, authors.au_lname,
titles.title, titles.type, titles.price
FROM authors
JOIN titleauthor ON authors.au_id = titleauthor.au_id
JOIN titles ON titleauthor.title_id = titles.title_id

RETURN
END
5.Obtener los títulos vendidos por año

CREATE FUNCTION titulosMasVendidosPorAnio(@anio INT)


RETURNS @resultados TABLE (
titulo VARCHAR(80),
ventas_totales INT
)
AS
BEGIN
INSERT INTO @resultados
SELECT TOP 5 titles.title, SUM(sales.qty)
FROM titles
JOIN sales ON titles.title_id = sales.title_id
WHERE YEAR(sales.ord_date) = @anio
GROUP BY titles.title
ORDER BY SUM(sales.qty) DESC

RETURN
END
TRIGGERS
1. crear un trigger que actualiza con un precio especifico al insertar un registro en la
tabla title

CREATE TRIGGER actualizar_precio_automaticamente


ON titles
AFTER INSERT
AS
BEGIN
UPDATE titles
SET price = 40.00
WHERE title_id IN (SELECT title_id FROM inserted);
END;
go

2. Este trigger se activara cada vez que se inserte un nuevo


registro en la tabla "Sales", Verificara si la cantidad de
libros vendidos es mayor a 50 y en caso de ser afirmativo este
actualizara el precio de del libro en la tabla "Title"
incrementara en un 10%

CREATE TRIGGER ActulizarPrecio


ON sales
AFTER INSERT
AS
BEGIN
UPDATE titles
SET price = price * 1.1
WHERE title_id IN (
SELECT title_id
FROM inserted
WHERE qty >= 50
);
END

INSERT INTO sales (stor_id, ord_num, ord_date, qty, payterms,title_id)


VALUES ('6380', 'B3001', CONVERT(datetime, '04/15/2023', 101), 60, 'Net
30','BU1032');

select * from titles


select * from sales
3.crear un trigger que no te permita borrar a un empleado

create trigger NO_Borrar


on employee for delete
as begin
print 'No se permiten borrar registros'
rollback transaction
end

select * from employee

delete from employee where job_id=12

4. consultas que utilizan un trigger en la base de datos pubs


--Registrar cambios en la tabla "sales" en otra tabla "sales_hisoty"

CREATE TRIGGER tr_sales_history ON sales


AFTER INSERT, UPDATE, DELETE
AS
BEGIN
IF EXISTS(SELECT * FROM inserted)
BEGIN
INSERT INTO sales_history (title_id, stor_id, ord_num, qty,
payterms, sales_date, sale_type)
SELECT i.title_id, i.stor_id, i.ord_num, i.qty, i.payterms,
GETDATE(), 'I'
FROM inserted i
END

IF EXISTS(SELECT * FROM deleted)


BEGIN
INSERT INTO sales_history (title_id, stor_id, ord_num, qty,
payterms, sales_date, sale_type)
SELECT d.title_id, d.stor_id, d.ord_num, d.qty, d.payterms,
GETDATE(), 'D'
FROM deleted d
END
END
5.Este trigger registra los cambios en la tabla "sales" en la tabla
"sales_history", agregando una fila por cada inserción, actualización
o eliminación. La columna "sale_type" indica si la fila es una
inserción ('I') o una eliminación ('D').
--2 ACTUALIZAR EL PRECIO DE UN LIBRO EN LA TABLA "TITLES" CUANDO SE
ACTUALIZA SU TIPO DE
--LIBRO EN LA TABLA "PUB_INFO"

CREATE TRIGGER tr_actualizar_precio_base ON pub_info


AFTER UPDATE
AS
BEGIN
IF UPDATE (type)
BEGIN
UPDATE titles
SET price = CASE pub_info.type
WHEN 'business' THEN titles.price *
1.1
WHEN 'mod_cook' THEN titles.price *
0.9
ELSE titles.price
END
FROM titles
JOIN pub_info ON titles.pub_id = pub_info.pub_id
JOIN inserted ON inserted.pub_id = pub_info.pub_id
WHERE titles.type = inserted.type
END
END
CURSORES
1.

DECLARE @au_id varchar(11)


DECLARE @total_sales money

DECLARE author_cursor CURSOR FOR


SELECT au_id FROM authors

OPEN author_cursor

FETCH NEXT FROM author_cursor INTO @au_id

WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @total_sales = SUM(qty * price)
FROM sales s
JOIN titles t ON s.title_id = t.title_id
WHERE t.au_id = @au_id

PRINT 'Author ' + @au_id + ' has total sales of ' + CONVERT(varchar(20),
@total_sales)

FETCH NEXT FROM author_cursor INTO @au_id


END

CLOSE author_cursor
DEALLOCATE author_cursor
--obtener los títulos de todos los libros de la editorial Pubs y mostrarlos en la
consola.
-- Declaramos variables para el cursor
DECLARE @title_id varchar(6)
DECLARE @title varchar(80)

-- Declaramos el cursor
DECLARE cursor_titles CURSOR FOR
SELECT title_id, title
FROM titles

-- Abrimos el cursor
OPEN cursor_titles

-- Recorremos el cursor y mostramos los títulos en la consola


FETCH NEXT FROM cursor_titles INTO @title_id, @title
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT @title
FETCH NEXT FROM cursor_titles INTO @title_id, @title
END

-- Cerramos el cursor
CLOSE cursor_titles
DEALLOCATE cursor_titles
2.Este cursor imprime el titulo y el precio de cada libro

DECLARE @titulo varchar(80), @precio money

DECLARE Titulo_cursor CURSOR FOR


SELECT title, price
FROM titles

OPEN Titulo_cursor

FETCH NEXT FROM Titulo_cursor INTO @titulo, @precio

WHILE @@FETCH_STATUS = 0
BEGIN
PRINT 'Titulo: ' + @titulo
PRINT 'Precio: ' + CONVERT(varchar(10), @precio)

FETCH NEXT FROM Titulo_cursor INTO @titulo, @precio


END

CLOSE Titulo_cursor
DEALLOCATE Titulo_cursor
3.CONSULTAS UTILIZANDO EL CURSOR EN LA BASE DE DATOS PUBS
--1 OBTENER EL NÚMERO TOTAL DE VENTAS DE CADA LIBRO EN LA TABLA
"SALES" Y MOSTRAR EL RESULTADO
--EN UN TABLA

DECLARE @title_id VARCHAR(20), @qty INT, @total_sales MONEY

DECLARE cur_sales CURSOR FOR


SELECT title_id, qty FROM sales

CREATE TABLE #sales_summary


(
title_id VARCHAR(20),
total_sales MONEY
)

OPEN cur_sales

FETCH NEXT FROM cur_sales INTO @title_id, @qty

WHILE @@FETCH_STATUS = 0
BEGIN
SET @total_sales = @qty * (SELECT price FROM titles WHERE
title_id = @title_id)
IF EXISTS (SELECT * FROM #sales_summary WHERE title_id =
@title_id)
BEGIN
UPDATE #sales_summary SET total_sales = total_sales +
@total_sales WHERE title_id = @title_id
END
ELSE
BEGIN
INSERT INTO #sales_summary (title_id, total_sales) VALUES
(@title_id, @total_sales)
END
FETCH NEXT FROM cur_sales INTO @title_id, @qty
END

CLOSE cur_sales
DEALLOCATE cur_sales

SELECT * FROM #sales_summary


4.Este código utiliza un cursor para recorrer la tabla "sales" y
calcular el número total de ventas de cada libro multiplicando la
cantidad vendida por el precio de cada libro. Los resultados se
almacenan en una tabla temporal llamada "#sales_summary" y se
muestran al final
--2 OBTENER EL NÚMERO DE AUTORES DE CADA EDITORIAL EN LA TABLA
"PUBLISHER" Y MOSTRAR EL RESULTADO EN UN TABLA

DECLARE @pub_id VARCHAR(4), @au_id VARCHAR(11)

DECLARE cur_authors CURSOR FOR


SELECT pub_id, au_id FROM titleauthor

CREATE TABLE #authors_summary


(
pub_id VARCHAR(4),
num_authors INT DEFAULT 0
)

OPEN cur_authors

FETCH NEXT FROM cur_authors INTO @pub_id, @au_id

WHILE @@FETCH_STATUS = 0
BEGIN
IF EXISTS (SELECT * FROM #authors_summary WHERE pub_id = @pub_id)
BEGIN
UPDATE #authors_summary SET num_authors = num_authors + 1
WHERE pub_id = @pub_id
END
ELSE
BEGIN
INSERT INTO #authors_summary (pub_id, num_authors) VALUES
(@pub_id, 1)
END
FETCH NEXT FROM cur_authors INTO @pub_id, @au_id
END

CLOSE cur_authors
DEALLOCATE cur_authors

SELECT * FROM #authors_summary


5.Este código utiliza un cursor para recorrer la tabla "titleauthor"
y contar el número de autores de cada editorial en la tabla
"Publisher". Los resultados se almacenan en una tabla temporal
llamada "#authors_summary" y se muestran al final.
--3 UTILIZAR UN CURSOR PARA MOSTRAR LOS TITULOS Y SUS PRECIOS DE LA
TABLA "TITLES"

DECLARE @title_id varchar(20), @price money


DECLARE cur_titles CURSOR FOR
SELECT title_id, price FROM titles
OPEN cur_titles
FETCH NEXT FROM cur_titles INTO @title_id, @price
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT 'Título: ' + @title_id + ', Precio: ' + CAST(@price AS
varchar)
FETCH NEXT FROM cur_titles INTO @title_id, @price
END
CLOSE cur_titles
DEALLOCATE cur_titles

También podría gustarte