Sie sind auf Seite 1von 6

----------------Exercicios de VIEWS----------------------

/*5. Visualizar todos os pedidos, exibindo: nmero, data, total,


nome do cliente, nome do funcionrio, nome do estgio e
estagirio.*/
CREATE VIEW vw_pedidos
AS
SELECT p.ped_numero Numero,
p.ped_data Data,
p.ped_valor Total,
c.pes_nome Cliente,
f.pes_nome Funcionario,
e.pes_nome Estagiario
FROM pedidos p
INNER JOIN pessoas c
ON c.pes_codigo = p.cli_codigo
INNER JOIN pessoas e
ON e.pes_codigo = p.est_codigo
INNER JOIN pessoas f
ON f.pes_codigo = p.fun_codigo

GO

/*10. Visualize a quantidade de funcionrios subordinados de


cada supervisor, exibindo: cdigo do supervisor, nome do
supervisor e a quantidade de subordinados.*/
CREATE VIEW qtd_subordinados
AS
SELECT s.pes_codigo Codigo,
s.pes_nome Nome,
Count(f.pes_codigo) QTD
FROM funcionarios f
INNER JOIN pessoas s
ON f.sup_codigo = s.pes_codigo
GROUP BY s.pes_codigo,
s.pes_nome

GO

-----------Funes Escalares---------------------------------
/*5. Faa uma funo para calcular a quantidade de pedidos
registrados por um funcionrio, recebendo como entrada o
cdigo do funcionrio e retornando a quantidade de
pedidos registrados.*/
CREATE FUNCTION Contar_pedidos_funcionario (@fun_codigo INT)
returns INT
AS
BEGIN
RETURN
(SELECT Count(pedidos.ped_numero)
FROM pedidos
WHERE pedidos.fun_codigo = @fun_codigo)
END

go

/*10. Faa uma funo calcular o total faturado de um produto,


recebendo como entrada o cdigo do produto e retornando
o total calculado.*/
CREATE FUNCTION Totalizar_faturamento_prod (@prd_codigo INT)
returns MONEY
AS
BEGIN
RETURN
(SELECT Sum(itp_qtd * itp_valor)
FROM itens_pedidos
WHERE prd_codigo = @prd_codigo)
END

go

/*15. Faa uma funo para calcular a quantidade de produtos


com preo inferior a um preo informado, recebendo como
entrada o preo informado e retornando a quantidade de
produtos.*/
CREATE FUNCTION Qtd_prod_valor (@valor INT)
returns INT
AS
BEGIN
RETURN
(SELECT Count(*)
FROM produtos
WHERE produtos.prd_valor < @valor)
END

go

-------Exerccios: funes do tipo table---------------


/*5. Faa uma funo para buscar os funcionrios um com
determinado status. Deve-se receber como entrada o status
e retornar: cdigo do funcionrio, nome e salrio*/
CREATE FUNCTION Buscar_funcionario_status (@Status INT)
returns TABLE
AS
RETURN
(SELECT p.pes_codigo Codigo,
p.pes_nome Nome,
f.fun_salario
FROM funcionarios f
INNER JOIN pessoas p
ON p.pes_codigo = f.pes_codigo
WHERE p.pes_status = @Status)

go

/*10. Faa uma funo para buscar os pedidos de um perodo.


Deve-se receber data inicial e final e, retornar: nmero do
pedido, data, valor (ped_valor) e status. Dica: use between*/
CREATE FUNCTION Buscar_pedidos (@dataInicial DATE,
@dataFinal DATE)
returns TABLE
AS
RETURN
(SELECT p.ped_numero 'N Pedido',
p.ped_data 'Data',
p.ped_valor Valor,
p.ped_status 'Status'
FROM pedidos p
WHERE p.ped_data BETWEEN @dataInicial AND @dataFinal)

go

----------5. Exerccios: stored procedures-------------------


/*5. Faa uma procedure para efetuar um aumento do estoque
de um produto, caso o produto esteja com o status igual a 1
(ativo). Deve-se receber o cdigo do produto e a
quantidade a ser aumentada no estoque e, retornar 1
(insucesso) ou 0 (sucesso).*/
go

CREATE PROCEDURE Aumentar_estoque (@prd_codigo INT,


@qtd INT)
AS
BEGIN
BEGIN try
UPDATE produtos
SET prd_qtd = prd_qtd + @qtd
WHERE prd_codigo = @prd_codigo
AND prd_status = 1

IF ( @@ROWCOUNT = 1 )
RETURN 0

RETURN 1
END try

BEGIN catch
RETURN 1
END catch
END

go

/*10. Faa uma procedure para alterar o nome, crdito e renda de


um cliente. Deve-se recebe como entrada o cdigo do
cliente e os novos valores para nome, crdito e renda. Use
controle de transao e tratamento de erros (try..catch).*/
CREATE PROCEDURE Alterar_cliente (@codCli INT,
@novoNome VARCHAR(max),
@novoCredito MONEY,
@novaRenda MONEY)
AS
BEGIN
BEGIN try
BEGIN TRAN

UPDATE pessoas
SET pes_nome = @novoNome
WHERE ( pes_codigo = @codCli )

UPDATE clientes
SET cli_credito = @novoCredito,
cli_renda = @novaRenda
WHERE ( pes_codigo = @codCli )

COMMIT TRAN

RETURN 0
END try

BEGIN catch
ROLLBACK TRAN

RETURN 1
END catch
END

go

/*15. Faa uma procedure para cadastrar um cliente. Elabore de


duas maneiras:
a) Utilize controle de transao e de exceo (try..catch);*/
CREATE PROCEDURE Cad_cli (@pes_nome VARCHAR(50),
@pes_cpf VARCHAR(12),
@cli_renda MONEY,
@cli_credito MONEY)
AS
BEGIN
BEGIN try
BEGIN TRAN

INSERT INTO pessoas


VALUES (@pes_nome,
@pes_cpf,
1)

INSERT INTO clientes


VALUES (@@IDENTITY,
@cli_renda,
@cli_credito)

COMMIT TRAN

RETURN 0
END try

BEGIN catch
ROLLBACK TRAN

RETURN 1
END catch
END

go

/*b) Faa os controle manuais utilizando select e if*/


CREATE PROCEDURE Cad_cli2 (@pes_nome VARCHAR(50),
@pes_cpf VARCHAR(12),
@cli_renda MONEY,
@cli_credito MONEY)
AS
BEGIN
DECLARE @pes_codigo INT

IF ( (SELECT Count(pes_codigo)
FROM pessoas
WHERE pessoas.pes_cpf = @pes_cpf) = 0 )
BEGIN
INSERT INTO pessoas
VALUES (@pes_nome,
@pes_cpf,
1)
END

SET @pes_codigo = @@IDENTITY

IF ( (SELECT Count(pes_codigo)
FROM clientes
WHERE clientes.pes_codigo = @pes_codigo) = 0 )
BEGIN
INSERT INTO clientes
VALUES (@pes_codigo,
@cli_renda,
@cli_credito)
END
END
go

/*20. Repita a procedure anterior, mas, alm de copiar, tambm


remove o pedido e seus itens de suas tabelas originais. */
-- Tabela Pedidos ------------------------
CREATE TABLE copy_pedidos
(
ped_numero INT NOT NULL,
ped_data DATETIME,
ped_valor DECIMAL(7, 2) CHECK (ped_valor > 0),
ped_status INT CHECK (ped_status IN (1, 2, 3, 4)),
fun_codigo INT NOT NULL,
cli_codigo INT NOT NULL,
est_codigo INT,
FOREIGN KEY (fun_codigo) REFERENCES funcionarios (pes_codigo),
FOREIGN KEY (cli_codigo) REFERENCES clientes (pes_codigo),
FOREIGN KEY (est_codigo) REFERENCES estagiarios (pes_codigo),
PRIMARY KEY (ped_numero)
)

go

-- Tabela Itens_Pedidos--------------------
CREATE TABLE copy_itens
(
ped_numero INT NOT NULL,
prd_codigo INT NOT NULL,
itp_qtd INT NOT NULL,
itp_valor DECIMAL(7, 2) NOT NULL,
PRIMARY KEY (ped_numero, prd_codigo),
FOREIGN KEY (ped_numero) REFERENCES pedidos (ped_numero),
FOREIGN KEY (prd_codigo) REFERENCES produtos (prd_codigo)
)

go

CREATE PROCEDURE Copy_pedido (@ped_numero INT)


AS
BEGIN
BEGIN try
BEGIN TRAN

INSERT INTO copy_pedidos


SELECT ped_numero,
ped_data,
ped_valor,
ped_status,
fun_codigo,
cli_codigo,
est_codigo
FROM pedidos
WHERE ped_numero = @ped_numero

INSERT INTO copy_itens


SELECT ped_numero,
prd_codigo,
itp_qtd,
itp_valor
FROM copy_itens
WHERE ped_numero = @ped_numero

DELETE itens_pedidos
WHERE ped_numero = @ped_numero
DELETE pedidos
WHERE ped_numero = @ped_numero

COMMIT TRAN
RETURN 0
END TRY

BEGIN CATCH
ROLLBACK TRAN
RETURN Error_number()
END catch
END

Das könnte Ihnen auch gefallen