-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSQLQuery_27.sql
More file actions
181 lines (152 loc) · 4.08 KB
/
SQLQuery_27.sql
File metadata and controls
181 lines (152 loc) · 4.08 KB
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
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
DROP PROCEDURE sp_operacoes
GO
USE master
GO
DROP DATABASE exer_loja
GO
CREATE DATABASE exer_loja
GO
USE exer_loja
GO
CREATE TABLE produtos
(
codigo INT NOT NULL,
nome VARCHAR(30),
valor_unitario DECIMAL(7,2),
qtd_estoque INT
PRIMARY KEY(codigo)
)
GO
CREATE TABLE venda
(
codigo_venda INT NOT NULL,
data_compra DATE NOT NULL,
codigo_produto INT NOT NULL,
quantidade INT NOT NULL
FOREIGN KEY(codigo_produto) REFERENCES produtos(codigo)
PRIMARY KEY(codigo_venda, data_compra, codigo_produto)
)
GO
CREATE FUNCTION fn_estoque(@margem INT)
RETURNS INT
AS
BEGIN
DECLARE @quantidade INT,
@contador INT,
@totalProd INT
SET @quantidade = 0
SET @contador = 0
SET @totalProd = (SELECT COUNT(codigo) FROM produtos)
WHILE(@contador < @totalProd)
BEGIN
SET @contador = @contador + 1
IF((SELECT qtd_estoque FROM produtos WHERE codigo = @contador) < @margem)
BEGIN
SET @quantidade = @quantidade + 1
END
END
RETURN @quantidade
END
GO
CREATE FUNCTION fn_tab_estoque(@margem INT)
RETURNS @tempTable TABLE
(
codigo INT,
nome VARCHAR(30),
qtd_estoque INT
)
AS
BEGIN
INSERT INTO @tempTable(codigo, nome, qtd_estoque) SELECT codigo, nome, qtd_estoque FROM produtos WHERE qtd_estoque < @margem
RETURN
END
GO
CREATE PROCEDURE sp_operacoes(@entrada CHAR(1), @codigo INT, @nome VARCHAR(30), @valor_unitario DECIMAL(7,2), @qtd_estoque INT, @saida VARCHAR(30) OUTPUT)
AS
IF(@entrada = 'I' OR @entrada = 'i')
BEGIN
BEGIN TRY
INSERT INTO produtos VALUES
(@codigo, @nome, @valor_unitario, @qtd_estoque)
SET @saida = 'Produto inserido'
END TRY
BEGIN CATCH
IF((SELECT 1 FROM produtos WHERE codigo = @codigo) = 1)
BEGIN
RAISERROR('Produto já presente no banco', 16, 1)
END
ELSE
BEGIN
RAISERROR('Error ao processar inserção', 16, 1)
END
END CATCH
END
ELSE
BEGIN
IF(@entrada = 'U' OR @entrada = 'u')
BEGIN
BEGIN TRY
BEGIN
UPDATE produtos
SET nome = @nome, valor_unitario = @valor_unitario, qtd_estoque = @qtd_estoque
WHERE codigo = @codigo
SET @saida = 'Produto atualizado'
END
END TRY
BEGIN CATCH
IF((SELECT 1 FROM produtos WHERE codigo = @codigo) = 1)
BEGIN
RAISERROR('Error ao processar atualização', 16, 1)
END
ELSE
BEGIN
RAISERROR('Produto não encontrado', 16, 1)
END
END CATCH
END
ELSE
BEGIN
IF(@entrada = 'D' OR @entrada = 'd')
BEGIN
BEGIN TRY
DELETE produtos
WHERE codigo = @codigo
SET @saida = 'Produto deletado'
END TRY
BEGIN CATCH
IF((SELECT 1 FROM produtos WHERE codigo = @codigo) = 1)
BEGIN
RAISERROR('Error ao processar deleção', 16, 1)
END
ELSE
BEGIN
RAISERROR('Produto não encontrado', 16, 1)
END
END CATCH
END
ELSE
BEGIN
RAISERROR('Operação inválida', 16, 1)
END
END
END
GO
INSERT INTO produtos VALUES
(1, 'Bola', 14.87, 6),
(2, 'carrinho', 21.40, 10)
GO
SELECT * FROM produtos
GO
CREATE TRIGGER t_insertVenda ON venda
AFTER INSERT
AS
BEGIN
DECLARE @quantidade INT
SELECT @quantidade = quantidade FROM INSERTED
IF(@quantidade = 0)
BEGIN
ROLLBACK TRANSACTION
END
END
SELECT * FROM venda
DELETE FROM venda