Stored procedure

Stored Procedure אוסף מקומפל של הצהרות SQL המאוחסנות יחד כאובייקט בעל שם.

פרוצדורות יכולות להכיל פקודות SQL ופקודות TSQL.

  • הפרוצדורות עוברות קימפול פעם אחת.
  • אפשר לקרוא לפרוצדורה אחת מתוך השנייה.
  • אפשר להעביר פרמטרים לפרוצדורות.

יתרונות של פרוצדורות:

  1. הפרוצדורות מאפשרות שיתוף קוד עבור אפליקציות שונות. כל שינוי מתבצע פעם אחת ואין צורך לעדכן . כל אפליקציה בנפרד.
  2. חוסך מה-user להכיר את מבנה ה-database. הפעולות עבורו מבוצעות דרך הפרוצדורה.
  3. משתמש יכול לקבל הרשאה להריץ פרוצדורה בעוד אין לו הרשאה לגשת לטבלאות ותצפיות בסיס הנתונים.
  4. פרוצדורות משפרות ביצועים.
  5. פרוצדורות מורידות עומס מהרשת שכן במקום לשלוח מספר הוראות כל אחת בנפרד ולקבל משוב על כל אחת מהן, נשלחת בקשה אחת ותגובה אחת.

יצירת פרוצדורה

-- מבנה
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