-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSQLQuery_24.sql
152 lines (131 loc) · 4.1 KB
/
SQLQuery_24.sql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
/*
Exercício:
Considere a tabela Produto com os seguintes atributos:
Produto (Codigo | Nome | Valor)
Considere a tabela ENTRADA e a tabela SAÍDA com os seguintes atributos:
(Codigo_Transacao | Codigo_Produto | Quantidade | Valor_Total)
Cada produto que a empresa compra, entra na tabela ENTRADA. Cada produto que a empresa vende, entra na tabela SAIDA.
Criar uma procedure que receba um código (‘e’ para ENTRADA e ‘s’ para SAIDA), criar uma exceção de erro para código inválido, receba o codigo_transacao, codigo_produto e a quantidade e preencha a tabela correta,
com o valor_total de cada transação de cada produto.
*/
USE master
GO
DROP DATABASE loja
GO
CREATE DATABASE loja
GO
USE loja
GO
CREATE TABLE Produto
(
codigo INT,
nome VARCHAR(100),
valor DECIMAL(5,2)
PRIMARY KEY(codigo)
)
GO
CREATE TABLE ENTRADA
(
Codigo_Transacao INT,
Codigo_Produto INT,
Quantidade INT,
Valor_Total INT
PRIMARY KEY(Codigo_Transacao)
FOREIGN key(Codigo_Produto) REFERENCES Produto(codigo)
)
GO
CREATE TABLE SAIDA
(
Codigo_Transacao INT,
Codigo_Produto INT,
Quantidade INT,
Valor_Total INT
PRIMARY KEY(Codigo_Transacao)
FOREIGN key(Codigo_Produto) REFERENCES Produto(codigo)
)
GO
CREATE PROCEDURE sp_Loja(@codigo CHAR(1), @codigo_Produto INT, @codigo_transacao INT, @nome VARCHAR(100), @valor DECIMAL(5,2), @quantidade INT, @saida VARCHAR(MAX) OUTPUT)
AS
DECLARE @contador INT,
@tabela VARCHAR(20),
@query VARCHAR(150),
@erro VARCHAR(MAX),
@valorT DECIMAL(5,2)
SET @valorT = @quantidade * @valor
IF(@codigo = 'e')
BEGIN
SET @tabela = 'ENTRADA'
SET @query = 'INSERT INTO ' + @tabela + ' VALUES ' +
'(' + CAST(@codigo_transacao AS VARCHAR(2)) + ', ' + CAST(@codigo_Produto AS VARCHAR(2)) + ', ' + CAST(@quantidade AS VARCHAR(3)) + ', ' + CAST(@valorT AS VARCHAR(6)) + ')'
PRINT @query
BEGIN TRY
INSERT INTO Produto VALUES (@codigo_Produto, @nome, @valor)
EXEC (@query)
SET @saida = 'Operação na tabela ' + @tabela+' realizada com sucesso.'
END TRY
BEGIN CATCH
SET @erro = ERROR_MESSAGE()
IF (@erro LIKE '%primary%')
BEGIN
RAISERROR('ID de produto duplicado', 16, 1)
END
ELSE
BEGIN
PRINT @erro
RAISERROR('Erro de processamento', 16, 1)
END
END CATCH
END
ELSE
IF(@codigo = 's')
BEGIN
SET @tabela = 'SAIDA'
SET @query = 'INSERT INTO ' + @tabela + ' VALUES ' +
'(' + CAST(@codigo_transacao AS VARCHAR(2)) + ', ' + CAST(@codigo_Produto AS VARCHAR(2)) + ', ' + CAST(@quantidade AS VARCHAR(3)) + ', ' + CAST(@valorT AS VARCHAR(6)) + ')'
PRINT @query
BEGIN TRY
INSERT INTO Produto VALUES (@codigo_Produto, @nome, @valor)
EXEC (@query)
SET @saida = 'Operação na tabela ' + @tabela+' realizada com sucesso.'
END TRY
BEGIN CATCH
SET @erro = ERROR_MESSAGE()
IF (@erro LIKE '%primary%')
BEGIN
RAISERROR('ID de produto duplicado', 16, 1)
END
ELSE
BEGIN
PRINT @erro
RAISERROR('Erro de processamento', 16, 1)
END
END CATCH
END
ELSE
BEGIN
RAISERROR('Erro, tabela inválida', 16, 1)
END
--Válido
DECLARE @out1 VARCHAR(MAX)
EXEC sp_Loja 'e', 1, 1, 'Bola', 3.45, 5,
@out1 OUTPUT
PRINT @out1
--Válido
DECLARE @out2 VARCHAR(MAX)
EXEC sp_Loja 's', 2, 1, 'Agulha', 2.00, 3,
@out2 OUTPUT
PRINT @out2
--inválido
DECLARE @out3 VARCHAR(MAX)
EXEC sp_Loja 'q', 2, 1, 'Bola', 3.45, 5,
@out3 OUTPUT
PRINT @out3
--inválido
DECLARE @out4 VARCHAR(MAX)
EXEC sp_Loja 'e', 1, 1, 'Bola', 3.45, 5,
@out4 OUTPUT
PRINT @out4
--inválido
SELECT * FROM Produto
SELECT * FROM ENTRADA
SELECT * FROM SAIDA