Repository navigation
Expand file tree
/
Copy path35_SQL_Stored-procedures.sql
More file actions
162 lines (128 loc) · 4.16 KB
/
Copy path35_SQL_Stored-procedures.sql
File metadata and controls
162 lines (128 loc) · 4.16 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
----------------SQL Stored Procedures---------------------
/*
To procedura lub procedury ktore wykonuja sie gdy je wywolamy.
Stored procedures sa szybsze niz sktypty pythona, poniewaz
sa one prekompilowane przez baze danych. W praktyce sa one
jednak czesto skomplikowane do debugowania i nie pozwala nam
nam na tyle co Python (np. na wersjonawanie, skomplikowana logike).
SYNTAX:
CREATE PROCEDURE ProcedureName AS
BEGIN
-- Sql statements
END
EXEC ProcedureName
*/
/*Step 1: For US Customers Find the Total Number of Customres and the Average Score*/
/*Step 2: Turining the Query Into a Stored Procedure*/
/*Step 3: Execute the Stored Procedure*/
/*Step 4: For German customers fing the total number of customers and the Average score*/
/*Step 5: find the total Nr. of Orders and total sales*/
USE SalesDB
GO
--DROP PROCEDURE GetCustomerSummary
GO
ALTER PROCEDURE GetCustomerSummary @Country NVARCHAR(50) = 'USA' -- to jest default value nie stale przypisanie
-- mozna tez ALTER jesli chcemy zmienic cos w istniejacej procedurze
AS
BEGIN
DECLARE @TotalCustomers INT;
DECLARE @AvgScore FLOAT;
SELECT
@TotalCustomers = COUNT(*),
@AvgScore = AVG(ISNULL(Score,0))
FROM Sales.Customers
WHERE Country = @Country;
/*
jesli nasze zapytanie przypisuje wartosci dla zmiennych to nie bedzie pokazywac nam
juz informacji w postaci tabeli, dlatego nie mozemy dawac aliasow, zmienne w zapytaniu
dajemy po lewej stronie
*/
PRINT 'Total Customers from ' + @Country + ':' + CAST(@TotalCustomers AS NVARCHAR); -- funkcja drukujaca z T-SQL
PRINT 'Average Score from ' + @Country + ':' + CAST(@AvgScore AS NVARCHAR);
/*
Nie mozemy miec innego typu danych niz string z PRINT dlatego musielismy zrzutowac nasze zmienne na string
*/
SELECT
COUNT(*) [NumberOfOrders],
SUM(Sales) [SumOfSales]
FROM Sales.Orders o
INNER JOIN Sales.Customers c ON
o.CustomerID = c.CustomerID AND
c.Country = @Country
END
GO
EXEC GetCustomerSummary @Country = 'Germany';
EXEC GetCustomerSummary;
-- zeby zobaczyc nasza procedure skladowana wchodzimy w:
-- nasza baze -> mozliwosci programowania -> procedury skladowane
-------Parametryzacja procedur skladowanych---------
/*
parametr okreslamy tak: @parametr
Mozemy tez mu przypisac domyslna wartosc w naszej procedurze (przyklad powyzej).
Paramert rozni sie od zmiennej w SQL. Parametr to wartosc ktora przekazujemy
do naszej procedury skladowanej. Zmienna natomiast dziala jak placeholder w naszej
strukturze.
*/
GO
ALTER PROCEDURE GetCustomerSummary2 @Country NVARCHAR(50) = 'USA'
AS
BEGIN
BEGIN TRY
-- ==============================
-- Step 1: Prepare & Cleanup Data
-- ==============================
SELECT 1 FROM Sales.Customers WHERE Score IS NULL AND Country = 'USA' -- NULL check
IF EXISTS (SELECT 1 FROM Sales.Customers WHERE Score IS NULL AND Country = @Country) -- standarowy mechanizm if TRUE
BEGIN
PRINT('Updating NULL Scores to 0');
UPDATE Sales.Customers
SET Score = 0
WHERE Score IS NULL AND Country = @Country;
END
ELSE
BEGIN
PRINT('No NULL Scores found')
END;
-- ==================
-- Generating Reports
-- ==================
DECLARE @TotalCustomers INT;
DECLARE @AvgScore FLOAT;
SELECT
@TotalCustomers = COUNT(*),
@AvgScore = AVG(Score)
FROM Sales.Customers
WHERE Country = @Country;
PRINT 'Total Customers from ' + @Country + ':' + CAST(@TotalCustomers AS NVARCHAR);
PRINT 'Average Score from ' + @Country + ':' + CAST(@AvgScore AS NVARCHAR);
SELECT
COUNT(*) [NumberOfOrders],
SUM(Sales) [SumOfSales],
1/0
FROM Sales.Orders o
INNER JOIN Sales.Customers c ON
o.CustomerID = c.CustomerID AND
c.Country = @Country
END TRY
BEGIN CATCH
-- ====================
-- Error Handling
-- ====================
PRINT('An error occured.');
PRINT('Error Message: ' + ERROR_MESSAGE());
PRINT('Error Number: ' + CAST(ERROR_NUMBER() AS NVARCHAR));
PRINT('Error Line: ' + CAST(ERROR_LINE() AS NVARCHAR));
PRINT('Error Procedure ' + ERROR_PROCEDURE());
END CATCH
END
EXEC GetCustomerSummary2 @Country = 'Germany';
EXEC GetCustomerSummary2;
---------Error Handling---------
/*
BEGIN TRY
-- SQL statements that might cause and error
END TRY
BEGIN CATCH
-- SQL statements to handle the error
END CATCH
*/