stored procedures and functions rose-hulman institute of technology curt clifton
Post on 19-Dec-2015
219 views
TRANSCRIPT
![Page 1: Stored Procedures and Functions Rose-Hulman Institute of Technology Curt Clifton](https://reader036.vdocument.in/reader036/viewer/2022062421/56649d3f5503460f94a19165/html5/thumbnails/1.jpg)
Stored Procedures and Functions
Rose-Hulman Institute of Technology
Curt Clifton
![Page 2: Stored Procedures and Functions Rose-Hulman Institute of Technology Curt Clifton](https://reader036.vdocument.in/reader036/viewer/2022062421/56649d3f5503460f94a19165/html5/thumbnails/2.jpg)
Outline Stored Procedures or “Sprocs” Functions Statements Reference
![Page 3: Stored Procedures and Functions Rose-Hulman Institute of Technology Curt Clifton](https://reader036.vdocument.in/reader036/viewer/2022062421/56649d3f5503460f94a19165/html5/thumbnails/3.jpg)
Defining Stored Procedures Named Collections of Transact-SQL
Statements Accept Input Parameters and Return Values Return Status Value to Indicate Success or
Failure Encapsulate Repetitive Tasks
![Page 4: Stored Procedures and Functions Rose-Hulman Institute of Technology Curt Clifton](https://reader036.vdocument.in/reader036/viewer/2022062421/56649d3f5503460f94a19165/html5/thumbnails/4.jpg)
Advantages of Stored Procedures Share Application Logic Shield Database Schema Details Provide Security Mechanisms Improve Performance Reduce Network Traffic
![Page 5: Stored Procedures and Functions Rose-Hulman Institute of Technology Curt Clifton](https://reader036.vdocument.in/reader036/viewer/2022062421/56649d3f5503460f94a19165/html5/thumbnails/5.jpg)
Entries into sysobjects and syscomments tables
Entries into sysobjects and syscomments tables
Compiled plan placed inprocedure cache
Compiled plan placed inprocedure cacheCompilationCompilation
OptimizationOptimization
CreationCreationCreationCreation
ExecutionExecution(first time(first time
or recompile)or recompile)
ExecutionExecution(first time(first time
or recompile)or recompile)
ParsingParsing
Initial Processing of Sprocs
![Page 6: Stored Procedures and Functions Rose-Hulman Institute of Technology Curt Clifton](https://reader036.vdocument.in/reader036/viewer/2022062421/56649d3f5503460f94a19165/html5/thumbnails/6.jpg)
Execution Plan Retrieved
Unused plan is aged out
Execution Plan Execution Context
SELECT *FROM dbo.memberWHERE member_no = ?
Connection 1
8082
Connection 2
Connection 3
24
1003
Subsequent Processing of Sprocs
![Page 7: Stored Procedures and Functions Rose-Hulman Institute of Technology Curt Clifton](https://reader036.vdocument.in/reader036/viewer/2022062421/56649d3f5503460f94a19165/html5/thumbnails/7.jpg)
USE NorthwindGOCREATE PROC dbo.OverdueOrdersAS SELECT * FROM dbo.Orders WHERE RequiredDate < GETDATE() AND ShippedDate IS NullGO
Creating Stored Procedures Create in Current Database Using the CREATE
PROCEDURE (or CREATE PROC) Statement
Can Make Recursive Calls (but stack is limited) Use sp_help to Display Information
sp_help <procedure name>
![Page 8: Stored Procedures and Functions Rose-Hulman Institute of Technology Curt Clifton](https://reader036.vdocument.in/reader036/viewer/2022062421/56649d3f5503460f94a19165/html5/thumbnails/8.jpg)
EXEC OverdueOrders
INSERT INTO CustomersEXEC EmployeeCustomer
Executing Stored Procedures Executing a Stored Procedure by Itself
Executing a Stored Procedure Within an INSERT Statement
![Page 9: Stored Procedures and Functions Rose-Hulman Institute of Technology Curt Clifton](https://reader036.vdocument.in/reader036/viewer/2022062421/56649d3f5503460f94a19165/html5/thumbnails/9.jpg)
Guidelines for Creating Sprocs dbo User Should Own All Stored Procedures
E.g., dbo.OverdueOrders One Stored Procedure for Each Task! One Task for Each Stored Procedure! Create, Test, and Troubleshoot Avoid sp_ Prefix in Stored Procedure Names
Used for system store procedures
![Page 10: Stored Procedures and Functions Rose-Hulman Institute of Technology Curt Clifton](https://reader036.vdocument.in/reader036/viewer/2022062421/56649d3f5503460f94a19165/html5/thumbnails/10.jpg)
USE NorthwindGOALTER PROC dbo.OverdueOrdersASSELECT CONVERT(char(8), RequiredDate, 1) RequiredDate, CONVERT(char(8), OrderDate, 1) OrderDate, OrderID, CustomerID, EmployeeID FROM OrdersWHERE RequiredDate < GETDATE() AND ShippedDate IS NullORDER BY RequiredDateGO
USE NorthwindGOALTER PROC dbo.OverdueOrdersASSELECT CONVERT(char(8), RequiredDate, 1) RequiredDate, CONVERT(char(8), OrderDate, 1) OrderDate, OrderID, CustomerID, EmployeeID FROM OrdersWHERE RequiredDate < GETDATE() AND ShippedDate IS NullORDER BY RequiredDateGO
Altering and Dropping Sprocs Altering Stored Procedures
Check dependencies: sp_depends dbo.OverdueOrders
Dropping sprocs: DROP dbo.OverdueOrders
![Page 11: Stored Procedures and Functions Rose-Hulman Institute of Technology Curt Clifton](https://reader036.vdocument.in/reader036/viewer/2022062421/56649d3f5503460f94a19165/html5/thumbnails/11.jpg)
Using Parameters in Sprocs Using Input Parameters Executing Using Input Parameters Returning Values Using Output Parameters
![Page 12: Stored Procedures and Functions Rose-Hulman Institute of Technology Curt Clifton](https://reader036.vdocument.in/reader036/viewer/2022062421/56649d3f5503460f94a19165/html5/thumbnails/12.jpg)
CREATE PROCEDURE dbo.[Year to Year Sales] @BeginningDate DateTime, @EndingDate DateTime ASIF @BeginningDate IS NULL OR @EndingDate IS NULLBEGIN RAISERROR('NULL values are not allowed', 14, 1) RETURNENDSELECT O.ShippedDate, O.OrderID, OS.Subtotal, DATENAME(yy,ShippedDate) AS YearFROM ORDERS O INNER JOIN [Order Subtotals] OS ON O.OrderID = OS.OrderIDWHERE O.ShippedDate BETWEEN @BeginningDate AND @EndingDateGO
CREATE PROCEDURE dbo.[Year to Year Sales] @BeginningDate DateTime, @EndingDate DateTime ASIF @BeginningDate IS NULL OR @EndingDate IS NULLBEGIN RAISERROR('NULL values are not allowed', 14, 1) RETURNENDSELECT O.ShippedDate, O.OrderID, OS.Subtotal, DATENAME(yy,ShippedDate) AS YearFROM ORDERS O INNER JOIN [Order Subtotals] OS ON O.OrderID = OS.OrderIDWHERE O.ShippedDate BETWEEN @BeginningDate AND @EndingDateGO
Using Input Parameters Validate All Incoming Parameter Values First Provide Default Values or Null Checks
![Page 13: Stored Procedures and Functions Rose-Hulman Institute of Technology Curt Clifton](https://reader036.vdocument.in/reader036/viewer/2022062421/56649d3f5503460f94a19165/html5/thumbnails/13.jpg)
EXEC AddCustomer 'ALFKI2', 'Alfreds Futterkiste', 'Maria Anders', 'Sales Representative', 'Obere Str. 57', 'Berlin', NULL, '12209', 'Germany', '030-0074321'
EXEC AddCustomer 'ALFKI2', 'Alfreds Futterkiste', 'Maria Anders', 'Sales Representative', 'Obere Str. 57', 'Berlin', NULL, '12209', 'Germany', '030-0074321'
EXEC AddCustomer @CustomerID = 'ALFKI', @ContactName = 'Maria Anders', @CompanyName = 'Alfreds Futterkiste', @ContactTitle = 'Sales Representative', @Address = 'Obere Str. 57', @City = 'Berlin', @PostalCode = '12209', @Country = 'Germany', @Phone = '030-0074321'
EXEC AddCustomer @CustomerID = 'ALFKI', @ContactName = 'Maria Anders', @CompanyName = 'Alfreds Futterkiste', @ContactTitle = 'Sales Representative', @Address = 'Obere Str. 57', @City = 'Berlin', @PostalCode = '12209', @Country = 'Germany', @Phone = '030-0074321'
Executing Sprocs with Parms By name:
By position:
![Page 14: Stored Procedures and Functions Rose-Hulman Institute of Technology Curt Clifton](https://reader036.vdocument.in/reader036/viewer/2022062421/56649d3f5503460f94a19165/html5/thumbnails/14.jpg)
Returning Values: Output ParmsCREATE PROCEDURE dbo.MathTutor @m1 smallint, @m2 smallint, @result smallint OUTPUTAS SET @result = @m1 * @m2GO
DECLARE @answer smallintEXECUTE MathTutor 5,6, @answer OUTPUTSELECT 'The result is: ', @answer
The result is: 30
CREATE PROCEDURE dbo.MathTutor @m1 smallint, @m2 smallint, @result smallint OUTPUTAS SET @result = @m1 * @m2GO
DECLARE @answer smallintEXECUTE MathTutor 5,6, @answer OUTPUTSELECT 'The result is: ', @answer
The result is: 30Results of StoredResults of StoredProcedureProcedure
Results of StoredResults of StoredProcedureProcedure
Executing StoredExecuting StoredProcedureProcedure
Executing StoredExecuting StoredProcedureProcedure
Creating Stored Creating Stored ProcedureProcedure
Creating Stored Creating Stored ProcedureProcedure
![Page 15: Stored Procedures and Functions Rose-Hulman Institute of Technology Curt Clifton](https://reader036.vdocument.in/reader036/viewer/2022062421/56649d3f5503460f94a19165/html5/thumbnails/15.jpg)
Handling Error Messages RETURN Statement Exits Query or Procedure
Unconditionally sp_addmessage Creates Custom Error Messages @@error Contains Error Number for Last Executed
Statement RAISERROR Statement
Returns user-defined or system error message Sets system flag to record error
![Page 16: Stored Procedures and Functions Rose-Hulman Institute of Technology Curt Clifton](https://reader036.vdocument.in/reader036/viewer/2022062421/56649d3f5503460f94a19165/html5/thumbnails/16.jpg)
What Is a User-defined Function? Scalar Functions (do not reference tables)
Similar to a built-in function Multi-Statement Table-valued Functions
Content like a stored procedure Referenced like a view
In-Line Table-valued Functions Similar to a view with parameters Returns a table as the result of single SELECT statement
![Page 17: Stored Procedures and Functions Rose-Hulman Institute of Technology Curt Clifton](https://reader036.vdocument.in/reader036/viewer/2022062421/56649d3f5503460f94a19165/html5/thumbnails/17.jpg)
USE NorthwindCREATE FUNCTION fn_NonNull (@myinput nvarchar(30)) RETURNS nvarchar(30)BEGIN IF @myinput IS NULL SET @myinput = 'Not Applicable' RETURN @myinputEND
USE NorthwindCREATE FUNCTION fn_NonNull (@myinput nvarchar(30)) RETURNS nvarchar(30)BEGIN IF @myinput IS NULL SET @myinput = 'Not Applicable' RETURN @myinputEND
Creating a User-defined Function
![Page 18: Stored Procedures and Functions Rose-Hulman Institute of Technology Curt Clifton](https://reader036.vdocument.in/reader036/viewer/2022062421/56649d3f5503460f94a19165/html5/thumbnails/18.jpg)
ALTER FUNCTION dbo.fn_NewRegion <New function content>
ALTER FUNCTION dbo.fn_NewRegion <New function content>
DROP FUNCTION dbo.fn_NewRegionDROP FUNCTION dbo.fn_NewRegion
Altering and Dropping Functions Altering Functions
Retains assigned permissions Causes the new function definition to replace
existing definition Dropping Functions
![Page 19: Stored Procedures and Functions Rose-Hulman Institute of Technology Curt Clifton](https://reader036.vdocument.in/reader036/viewer/2022062421/56649d3f5503460f94a19165/html5/thumbnails/19.jpg)
Three Examples of Functions Scalar User-defined Function Multi-Statement Table-valued Function In-Line Table-valued Function
![Page 20: Stored Procedures and Functions Rose-Hulman Institute of Technology Curt Clifton](https://reader036.vdocument.in/reader036/viewer/2022062421/56649d3f5503460f94a19165/html5/thumbnails/20.jpg)
Scalar User-defined Function RETURNS Clause Specifies Data Type Function Is Defined Within a BEGIN and
END Block Return Type Is Any Data Type Except text,
ntext, image, cursor, or timestamp
![Page 21: Stored Procedures and Functions Rose-Hulman Institute of Technology Curt Clifton](https://reader036.vdocument.in/reader036/viewer/2022062421/56649d3f5503460f94a19165/html5/thumbnails/21.jpg)
Example
SELECT dbo.fn_DateFormat(GETDATE(), ':')SELECT dbo.fn_DateFormat(GETDATE(), ':')
Creating a function:
Calling the function:
USE NorthwindCREATE FUNCTION fn_DateFormat
(@indate datetime, @separator char(1))RETURNS Nchar(20)ASBEGIN RETURN CONVERT(Nvarchar(20), datepart(mm,@indate)) + @separator + CONVERT(Nvarchar(20), datepart(dd, @indate)) + @separator + CONVERT(Nvarchar(20), datepart(yy, @indate))END
USE NorthwindCREATE FUNCTION fn_DateFormat
(@indate datetime, @separator char(1))RETURNS Nchar(20)ASBEGIN RETURN CONVERT(Nvarchar(20), datepart(mm,@indate)) + @separator + CONVERT(Nvarchar(20), datepart(dd, @indate)) + @separator + CONVERT(Nvarchar(20), datepart(yy, @indate))END
![Page 22: Stored Procedures and Functions Rose-Hulman Institute of Technology Curt Clifton](https://reader036.vdocument.in/reader036/viewer/2022062421/56649d3f5503460f94a19165/html5/thumbnails/22.jpg)
Multi-Statement Table-valued Fn. BEGIN and END Enclose Multiple
Statements RETURNS Clause Specifies table Data Type RETURNS Clause Names and Defines the
Table
![Page 23: Stored Procedures and Functions Rose-Hulman Institute of Technology Curt Clifton](https://reader036.vdocument.in/reader036/viewer/2022062421/56649d3f5503460f94a19165/html5/thumbnails/23.jpg)
USE NorthwindGOCREATE FUNCTION fn_Employees (@length nvarchar(9))RETURNS @fn_Employees table (EmployeeID int PRIMARY KEY NOT NULL, [Employee Name] nvarchar(61) NOT NULL)ASBEGIN IF @length = 'ShortName' INSERT @fn_Employees SELECT EmployeeID, LastName FROM Employees ELSE IF @length = 'LongName' INSERT @fn_Employees SELECT EmployeeID, (FirstName + ' ' + LastName) FROM EmployeesRETURNEND
USE NorthwindGOCREATE FUNCTION fn_Employees (@length nvarchar(9))RETURNS @fn_Employees table (EmployeeID int PRIMARY KEY NOT NULL, [Employee Name] nvarchar(61) NOT NULL)ASBEGIN IF @length = 'ShortName' INSERT @fn_Employees SELECT EmployeeID, LastName FROM Employees ELSE IF @length = 'LongName' INSERT @fn_Employees SELECT EmployeeID, (FirstName + ' ' + LastName) FROM EmployeesRETURNEND
SELECT * FROM dbo.fn_Employees('LongName')OrSELECT * FROM dbo.fn_Employees('ShortName')
SELECT * FROM dbo.fn_Employees('LongName')OrSELECT * FROM dbo.fn_Employees('ShortName')
Example Creating the Function
Calling it:
![Page 24: Stored Procedures and Functions Rose-Hulman Institute of Technology Curt Clifton](https://reader036.vdocument.in/reader036/viewer/2022062421/56649d3f5503460f94a19165/html5/thumbnails/24.jpg)
In-Line Table-valued Function Content of the Function Is a SELECT
Statement Do Not Use BEGIN and END RETURN Specifies table as the Data Type Format Is Defined by the Result Set
![Page 25: Stored Procedures and Functions Rose-Hulman Institute of Technology Curt Clifton](https://reader036.vdocument.in/reader036/viewer/2022062421/56649d3f5503460f94a19165/html5/thumbnails/25.jpg)
USE NorthwindGOCREATE FUNCTION fn_CustomerNamesInRegion ( @RegionParameter nvarchar(30) )RETURNS tableASRETURN ( SELECT CustomerID, CompanyName FROM Northwind.dbo.Customers WHERE Region = @RegionParameter )
USE NorthwindGOCREATE FUNCTION fn_CustomerNamesInRegion ( @RegionParameter nvarchar(30) )RETURNS tableASRETURN ( SELECT CustomerID, CompanyName FROM Northwind.dbo.Customers WHERE Region = @RegionParameter )
SELECT * FROM fn_CustomerNamesInRegion('WA') SELECT * FROM fn_CustomerNamesInRegion('WA')
Example Creating the Function
Calling it:
![Page 26: Stored Procedures and Functions Rose-Hulman Institute of Technology Curt Clifton](https://reader036.vdocument.in/reader036/viewer/2022062421/56649d3f5503460f94a19165/html5/thumbnails/26.jpg)
Types of Statements (1/2) RETURN <expression> DECLARE <name> <type>
used to declare local variables BEGIN . . . END
Coalesce groups of statements Separate by semicolons Like { … } in Java, C, …
![Page 27: Stored Procedures and Functions Rose-Hulman Institute of Technology Curt Clifton](https://reader036.vdocument.in/reader036/viewer/2022062421/56649d3f5503460f94a19165/html5/thumbnails/27.jpg)
Types of Statements (2/2) SET <variable> = <expression>;
Assignment SELECT <var1> = <expr1>, <var2> =
<expr2> … Multi-variable assignment
IF <expr> <statement> [ELSE <statement>] WHILE <expr> <statement>
![Page 28: Stored Procedures and Functions Rose-Hulman Institute of Technology Curt Clifton](https://reader036.vdocument.in/reader036/viewer/2022062421/56649d3f5503460f94a19165/html5/thumbnails/28.jpg)
Example: Assignment/Query When right-hand side is single value:
SET @p = (SELECT price FROM SellsWHERE rest = 'Joe''s' AND soda = 'Pepsi');
![Page 29: Stored Procedures and Functions Rose-Hulman Institute of Technology Curt Clifton](https://reader036.vdocument.in/reader036/viewer/2022062421/56649d3f5503460f94a19165/html5/thumbnails/29.jpg)
Multi-variable Assignment Example:
SELECT @ph = phone, @addr = addrFROM CustomerWHERE name = 'Rumi'
![Page 30: Stored Procedures and Functions Rose-Hulman Institute of Technology Curt Clifton](https://reader036.vdocument.in/reader036/viewer/2022062421/56649d3f5503460f94a19165/html5/thumbnails/30.jpg)
IF statements Basic form:
IF <condition> <statement>
Need BEGIN … END for multi-statement body: IF <condition>
BEGIN<statement>;<statement>;
END Can use ELSE if needed:
IF <condition> <statement> ELSE <statement>
![Page 31: Stored Procedures and Functions Rose-Hulman Institute of Technology Curt Clifton](https://reader036.vdocument.in/reader036/viewer/2022062421/56649d3f5503460f94a19165/html5/thumbnails/31.jpg)
WHILE Loops Syntax: WHILE <condition> <statement> Again, use BEGIN … END for longer body Can be like “normal” while loops:
WHILE (SELECT avg(price) FROM Sells) < 3BEGIN
UPDATE SellsSET price = price * 1.05IF (SELECT max(price) FROM Sells) > 5
BREAKEND
Or use “cursors” to loop through query results
![Page 32: Stored Procedures and Functions Rose-Hulman Institute of Technology Curt Clifton](https://reader036.vdocument.in/reader036/viewer/2022062421/56649d3f5503460f94a19165/html5/thumbnails/32.jpg)
Cursor ExampleDECLARE @name nvarchar(10); DECLARE @result int;DECLARE NameCursor CURSOR LOCAL FOR
SELECT LTRIM(RTRIM(username)) FROM [dbo].[Students]OPEN NameCursorFETCH NEXT FROM NameCursor INTO @nameWHILE @@FETCH_STATUS = 0BEGIN
if ( 0 = (select count(*) from master.sys.syslogins where loginname=@name) ) BEGIN
EXEC('CREATE LOGIN ' + @name + ' WITH PASSWORD=''' + @name + '''')exec sp_addsrvrolemember @loginame=@name, @rolename='dbcreator'set @result = @result + 1
ENDelse
select (@name + ' Already There') as resultFETCH NEXT FROM NameCursor INTO @name
END
![Page 33: Stored Procedures and Functions Rose-Hulman Institute of Technology Curt Clifton](https://reader036.vdocument.in/reader036/viewer/2022062421/56649d3f5503460f94a19165/html5/thumbnails/33.jpg)
Remember CRUD! Want interface code to easily manipulate data Define stored procedures to:
Create new entries in tables Retrieve data from tables Update entries in tables Delete entries from tables