Stored Procedures

advertisement
BIT275/276
Instructor: Craig Duckett
Email: cduckett@cascadia.edu
• http://www.dotnet-tricks.com/Tutorial/sqlserver/IbUO310312-Different-Types-of-SQL-Server-Stored-Procedures.html
• http://www.dotnet-tricks.com/Tutorial/sqlserver/KY3T010412-Different-Types-of-SQL-Server-Functions.html
Stored Procedure vs. View
A Stored Procedure:
 accepts parameters
 can NOT be used as building block in a larger query
 can contain several statements, loops, IF ELSE, etc.
 can perform modifications to one or several tables
 can NOT be used as the target of an INSERT, UPDATE or DELETE statement.
A View:
 does NOT accept parameters
 CAN be used as building block in a larger query
 can contain only one single SELECT query
 can NOT perform modifications to any table
 but can (sometimes) be used as the target of an INSERT, UPDATE or DELETE
statement.
Stored Procedure vs. Function
Basic Difference



Function must return a value but in Stored Procedure it is optional ( Procedure can return zero or n
values).
Functions can have only input parameters for it whereas Procedures can have input/output
parameters .
Functions can be called from Procedure whereas Procedures cannot be called from Function.
Advance Difference








Procedure allows SELECT as well as DML(INSERT/UPDATE/DELETE) statement in it whereas
Function allows only SELECT statement in it.
Procedures can not be utilized in a SELECT statement whereas Function can be embedded in a
SELECT statement.
Stored Procedures can NOT be used in the SQL statements anywhere in the
WHERE/HAVING/SELECT section whereas Function can be.
The most important feature of stored procedures over function is to retention and reuse the
execution plan while in case of function it will be compiled every time.
Functions that return tables can be treated as another rowset. This can be used in JOINs with other
tables.
Inline Function can be though of as views that take parameters and can be used in JOINs and other
Rowset operations.
Exception can be handled by TRY-CATCH block in a Procedure whereas a TRY-CATCH block can
NOT be used in a Function.
We can go for Transaction Management in Procedure whereas we can't go in Function.
Scripts v. Stored Procedures
 Script: Text file of SQL commands
 Stored Procedure: SQL commands stored in database
itself
 SPROC’s have more capabilities than a script
BATCH
 Batch is a logical group of SQL statements
 Run-time error will halt execution only of FURTHER
steps
 Can break up multiple steps using GO
 Not available in all tools
 GO causes editing tool to send statements to that point
for execution
 GO isn’t sent to SQL Server
Format of SPROC’s
CREATE PROCEDURE <name>
<parameter list>
AS
<instructions to execute>
EXECUTE
 EXEC(cute) statement
OR
 EXEC(cute) stored procedure name
 Statement or sproc runs in it’s own scope
 Can’t ‘share’ variables directly
 User’s security rules apply
 Can’t be used in User Defined Function (UDF)
Uses of Stored Procedures
 For returning data (select)
 For editing data
 For calculations
Parameters
 Method for sending data into and from a stored
procedure
 INPUT parameters are values sent in
 OUTPUT parameters are values returned

Must have a holding space (variable) for the returned data
 Defined before start of procedure (AS)
Declaring Parameters
 Include name and datatype
 Default value is optional
 Without a default value, parameter is required
 Direction is optional (input is default)
 An output parameter must have direction specified
Sample Input Parameter
CREATE PROC upFindStudent
@SID char(9)
AS
SELECT *
FROM Persons
Where SchoolID=@SID
Sample Output Parameter
CREATE PROC upFindStudentID
@First varchar(25),
@Last varchar(35),
@SID char(9) OUTPUT
AS
SELECT @SID=SchoolID
FROM Students_T
Where @First=Firstname and
@Last=Lastname
Return Values
 Result of stored procedure indicates success or failure
 Non-zero value indicates a problem
 Must be an integer
 Different from an output parameter
 Output parameter is about data
 RETURN <value>
 Causes immediate exit
Variables
 Create using DECLARE
 Need to start with ‘@’
 Can use SQL data types or custom data types
DECLARE @StudentName varchar(50)
Variable Assignment
 SET is usually used similar to procedural language
SET @Var=value
 SELECT is usually used when getting a value from a
query
SELECT @Var=Sum(PossiblePoints) FROM Assignments
Decision Making
 SQL supports two structures for branching:
 IF
 CASE
 Both structures are similar to other languages (IF …
THEN, SELECT CASE)
 Both structures tend to have specific places where used
IF Blocks
 IF … ELSE
 No end if
 Need to use Begin/End if have more than one
instruction to execute
IF StartDate < EndDate
Begin
…
End
ELSE
Simple Case Statement

CASE
Similar to SELECT CASE

Compares one value to different cases
CASE Category
WHEN ‘pop_comp’ THEN ‘Popular Computing’
WHEN ‘mod_cook’ THEN ‘Modern Cooking’
END

Searched CASE
 No test expression
 Each WHEN has a boolean test
CASE
WHEN Points >= 90 THEN ‘A’
WHEN Points < 90 AND Extra > 0
THEN ‘A’
END
Looping (While)
 Typically used with a CURSOR
 Cursor data type allows a table to be stored in memory
and each row/field to be accessed
 BREAK allows early exit from loop
 CONTINUE forces control to start of loop
 Working with sets is preferred over loops (SQL is
about sets)
Finding Identity Values
 When need to find the value used to identify the last
row added
 @@Identity
 Scope_Identity
 Ident_Current
@@Identity
 System variable, created/maintained automatically
 Returns the last identity value used as a result of
INSERT or SELECT INTO
 Not limited to current scope; may not get correct value
 Returns Null if operation failed or a value wasn’t
generated
 Returns last number created if multiple inserts occur
(i.e. SELECT INTO)
Scope_Identity()
 Return the last identity values generated in any table
in the current session.
 Returns values inserted only within the current scope
 Not affected by other operations.
Ident_Current()
 Not limited by scope and session;
 Limited to a specified table (table name specified as an
argument value).
@@Rowcount
 System variable, created/maintained automatically
 Number of rows returned or affected by the last
statement
 0 (zero) is often used as a logical test
 If no records found for where clause, notify system or
process
Errors
 Errors can occur because of SQL statement
 Invalid syntax, or data type
 Errors can also reflect business rules
 Data doesn’t match requirements
@@Error
 System variable, created/maintained automatically
 Value set after each SQL statement;
 0 (zero) means statement was successful
 Number other than zero is typically a specific error
 Can store value in variable and test
Try/Catch
 Similar to .Net languages
 Need to include BEGIN/END
BEGIN TRY
<code>
END TRY
BEGIN CATCH
<error handling code>
END CATCH
Raise Error
 Used to send information to calling program
 Syntax:
RaisError (Message string OR Message ID, Severity,
State)
 Severity – <14 information; 15-19 warning or user
can correct; 20+ fatal
 State – way to differentiate problems if needed;
typically use 1
 RAISERROR (50001,16,1)
Error Message
 Message ID or String
 Use ID if have custom or TSQL error to use
 Use String for ‘on the fly’ message
 Stored Error Messages are server-specific
 Can add message to server
 ID Number must be greater than 50000
Custom Error Messages
 Messages can include a parameter with % to allow
addition to message
 ‘D’ – signed integer
 ‘O’ – unsigned octal
 ‘P’ – pointer
 ‘S’ – string
 ‘U’ – unsigned integer
 ‘X’ or ‘x’ – unsigned hexadecimal
Severity & State
 1 – 18: Informational (range can vary – not exact)
 11 – 16 typically raise error at client
 19 – 25: Severe error
 20+ is fatal error and connection will terminate
 State is ‘ad hoc’ and can help if same error happens in
multiple places
 Range of 1 – 127
Sample Error Message
 RaisError(‘Operation cannot be completed because
field %s cannot be null’,1,1,’fieldname’)
Transactions
 Provides method for canceling an operation
 Can restore rows, columns to original state in event of
error or business logic failure
 Use when changes will either be committed or
discarded in entirety
ACID
 Atomicity: All of the changes will be accepted or none of
the changes will be accepted
 Consistency: Data is either in its original or changed state
 Isolation: If multiple transactions occur, data is never
available in an intermediate state
 Durability: Once finished, all changes are complete and
changes can only be done by another transaction/unit of
work
Using A Transaction
 Begin Tran: Identifies the start
 Commit Tran: Write changes
 Rollback Tran: Cancel changes
 Be sure to issue a Commit or Rollback
 Connection Stays Open Until Transaction is terminated
Locking & Concurrency
 Locking allows a transaction to ensure that it can
rollback
 Prevents other operations from changing that data
 Concurrency refers to multiple actions running against
database at the same time
 What happens if you want to change data I’m working
with?
Sample Locking Levels
 Database
 Table
 Extent (memory)
 Page (subset of extent)
 Key
 Row
Cursors
 Processing based on each row
 not set operations
 Declare @Cursor Cursor
 Set @Cursor = Cursor For (select statement)
 Open @Cursor
 Fetch Next From @Cursor into (variables matching
field list in select)
Using a Cursor
Declare @Students Cursor
Set @Cursor = Cursor For (Select FirstName, LastName From
Students)
Open @Students
While @@Fetch_Status = 0
Begin
Fetch Next From @Students Into @First, @Last
Print @First + ‘ ‘+ @Last
End
Close @Students
Deallocate @Students
@@Fetch_Status
 0 success;
 -1 failed (read record outside recordset);
 -2 missing record (eg. someone else deleted)
Download