Stored Procedure אוסף מקומפל של הצהרות SQL המאוחסנות יחד כאובייקט בעל שם.
פרוצדורות יכולות להכיל פקודות SQL ופקודות TSQL.
- הפרוצדורות עוברות קימפול פעם אחת.
- אפשר לקרוא לפרוצדורה אחת מתוך השנייה.
- אפשר להעביר פרמטרים לפרוצדורות.
יתרונות של פרוצדורות:
- הפרוצדורות מאפשרות שיתוף קוד עבור אפליקציות שונות. כל שינוי מתבצע פעם אחת ואין צורך לעדכן . כל אפליקציה בנפרד.
- חוסך מה-user להכיר את מבנה ה-database. הפעולות עבורו מבוצעות דרך הפרוצדורה.
- משתמש יכול לקבל הרשאה להריץ פרוצדורה בעוד אין לו הרשאה לגשת לטבלאות ותצפיות בסיס הנתונים.
- פרוצדורות משפרות ביצועים.
- פרוצדורות מורידות עומס מהרשת שכן במקום לשלוח מספר הוראות כל אחת בנפרד ולקבל משוב על כל אחת מהן, נשלחת בקשה אחת ותגובה אחת.
יצירת פרוצדורה
-- מבנה
CREATE PROCEDURE שם הפרוצדורה AS קוד הפרוצדורה
דוגמא:
CREATE PROCEDURE getEmployees AS
Select * from employees
הרצת הקוד יוצרת את הפרוצדורה ולא מריצה אותה.
הרצת פרוצדורה
-- מבנה
EXE[CUTE] שם הפרוצדורה
דוגמא:
EXECUTE getEmployees
מחיקת פרוצדורה
-- מבנה
DROP PROCEDURE שם הפרוצדורה
דוגמא:
DROP PROCEDURE getEmployees
שילוב פקודות DML בפרוצדורה
הדוגמה הבאה מכניסה את העובדים שהועסקו עד היום (לא כולל) לטבלת הלקוחות.
-- הפרוצדורה בוחרת את העובדים המתאימים
CREATE PROCEDURE EmployeeCustomer
AS
SELECT upper(substring(LastName,1,4)+substring(FirstName,1,1)),
’Northwind Traders’, rtrim(FirstName)+' '+ LastName,’employee’,
Address, City ,Region , PostalCode ,
country ,(‘(206) 555-1234’+’ x’+extension), NULL
FROM employees
WHERE HireDate<GETDATE()
-- ובהרצת הקוד משלבת שאילתה נוספת המבצעת את הכנסת הנתונים לטבלה האחרת
INSERT INTO Customers
EXEC EmployeeCusromer
שינוי פרוצדורה
-- מבנה
ALTER PROCEDURE שם הפרוצדורה
AS
קוד הפרוצדורה החדש
שימוש בפרמטרים
ניתן לשלוח ערכים לפרוצדורה על ידי שימוש בפרמטרי INPUT וניתן לקבל חזרה ערכים על ידי שימוש בפרמטרי OUTPUT.
- פרוצדורה תקבל פרמטרים לאחר הגדרת שמה.
- לפני שם כל פרמטר יופיע הסימן @ ולאחריו יצוין סוג ה-DataType שלו.
- הפרמטרים יכולים לקבל ערך ברירת מחדל ואף ערך NULL. במידה והוגדר ערך ברירת מחדל לפרמטר המשתמש לא יהיה חייב לשלוח ערך עבור פרמטר זה.
-- מבנה
@parameter data_type [=default]
הרצת פרוצדורה עם פרמטרים
דוגמה לפרוצדורה עם פרמטר INPUT.
הדוגמה יוצרת פרוצדורה המקבלת שני פרמטרים של תאריך ומחזירה את ההזמנות שתאריך המשלוח שלהם בין טווח הערכים שהתקבל בפרמטרים.
CREATE PROCEDURE ShippedByDate
(@beginningDate dateTime, @EndingDate DateTime)
As
IF @BeginningDate Is NULL OR @EndingDate IS NULL
Begin
PRINT(‘Null Values are not Allowed’)
RETURN
End
SELECT ShippedDate, OrderId
FROM Orders
WHERE shippedDate between @beginningDate and @endingDate
הרצת הפרוצדורה.
EXEC ShippedByDate '12-01-96','12-31-96'
בדוגמה נכתבת פרוצדורה המוסיפה לקוח חדש לטבלת הלקוחות.
CREATE PROCEDURE AddCustomer (@CustomerId nchar(5), @CompanyName nvchar(40)
@ContactName nvarchar (30) =NULL,
@ContactTitle nvarchar (30) =NULL,
@Address nvarchar (60) =NULL,
@City nvarchar (15) =NULL,
@Region nvarchar (15)= NULL,
@PostalCode nvarchar (10)= NULL,
@Country nvarchar (15)= NULL,
@Phone nvarchar (24) =NULL,
@Fax nvarchar (24)= NULL )
AS
INSERT INTO Customers
VALUES (@CustomerId, @CompanyName,@ ContactName,@ContactTitle,
@Address,@ City,@ Region,@ PostalCode,@ Country,
@Phone,@ Fax)
הרצת הפרוצדורה
-- דרך א
EXEC AddCustomer ‘ALFKI2’,’Alfreds Futterkiste’ ,
‘Maria Anders’,’Sales Representive’,’Obere Str .57’,
’Berlin’,Null,12209,’Germany’,’030-0074321’,Null
-- דרך ב, ציון הפרמטרים שאליהם מועברים ערכים. אם יש ברירת מחדל לא חייב להעביר ערך.
EXEC AddCustomer @CustomerId=’ALFAKI’, @ContactName=’Maria Anders’, @CompanyName=’Alfreds Futterkiste’,
@ContactTitle = ’Sales Representive’,
@Address= ’Obere Str .57’,
@City = ’Berlin’,
@Region = Null,
@PostalCode = 12209,
@Country = ’Germany’,
@Phone = ’030-0074321’,
@Fax = Null
החזרת פרמטרים מפרוצדורה – OUTPUT
פרוצדורה יכולה להחזיר פרמטרים לתכנית הקוראת.
-- מבנה
@parameter data_type OUTPUT
דוגמה לפרוצדורה עם פרמטר OUTPUT. הפרוצדורה מקבלת שני מספרים ומחשבת את מכפלתם.
CREATE PROCEDURE MathMult
@m1 smallint,
@m2 smallint,
@result smallint OUTPUT
AS
SET @result=@m1*@m2
הרצת הפרוצדורה
מאחר והפרוצדורה מחזירה ערך, חובה להגדיר משתנה אשר יקבל את הערך אותו מחזירה הפרוצדורה.
-- הצהרה על משתנה אשר יקבל את הערך המוחזר
DECLARE @answer smallint
-- הרצת הפרוצדורה
EXEC MathMult 5,6,@answer OUTPUT
-- הדפסת הפרוצדורה
SELECT 'The result is : ' ,@answer
החזרת נתונים ע"י קוד החזרה – RETURN
ניתן להחזיר ערכים כקוד החזרה מפרוצדורה ע"י שימוש במילה RETURN.
דוגמא: הפרוצדורה בודקת האם קיים סופר מסוים בבסיס הנתונים בטבלת Authors , במידה והסופר קיים מוחזר הערך 1 אחרת 0 .
CREATE PROCEDURE checkAuthor
@AuFName varchar(20),
@AuLName varchar(40)
AS
IF EXISTS (SELECT *
FROM Authors
WHERE au_fname=@AuFName AND au_lname=@AuLName)
RETURN (1)
ELSE
RETURN(0)
הרצת הפרוצדורה
הרצת הפרוצדורה מחייבת הגדרת משתנה שיקלוט את הערך המוחזר, שוב הפניה אליו בעזרת משפט SELECT.
DECLARE @returnCode int
EXEC @returnCode=CheckAuthor 'Johnson', 'White'
SELECT @returnCode
System procedure
פרוצדורות מערכת המבצעות פעולות אדמיניסטרטיביות רבות ושמורות בבסיס הנתונים master. פרוצדורות אלה מזוהות על ידי השם התחילי _sp ודומות לפרוצדורות בשפות תכנות אחרות בכך שהן מקבלות פרמטרים עבור הפונקציות מחזירות ערכים וכד'.
דוגמה: נקבל מידע לגבי מבנה אובייקט הטבלה Orders
EXEC Sp_help Orders