הבלוג של גרי רשף

16/02/2011

פקודות בקרת ריצה (Control of Flow)

שייך לקטגוריה: Uncategorized — תגים: , , , , , — גרי רשף @ 20:33

ההיכרות הראשונה שלי עם עולם המחשבים הייתה בתחילת שנות השמונים באוניברסיטה, עם שפת Basic: שורות הפקודות היו ממוספרות, לא הייתה רקורסיה, לא הייתה חובה להגדיר משתנים, והכי חשוב: בעזרת פקודת Goto שהייתה אחת מסימני ההיכר שלה ניתן היה לקפוץ ממקום למקום בקוד. כל זה גרם לכך ששמה של השפה הלך לפניה לרעה, וכחלופה המליצו על שפת פסקאל שהייתה הרבה יותר חינוכית..

מתברר שפקודת Goto חיה ובועטת ב-TSQL יחד עם עוד כמה פקודות שמאפשרות "לקצר הליכים" במקרה הצורך.

קטונתי מלפסוק הלכות, ולכל היותר אציע להשתמש בהן בזהירות ובחסכנות, ולהתנער מראש מכל אחריות משפטית לנזק שיגרם לקוראי בלוג זה..

נניח שכתבנו פרוצדורה ארוכה הכוללת שני חלקים, וניתן להריץ אותה באופן גמיש בהתאם לפרמטר המועבר אליה-
להריץ את שני החלקים או רק את החלק הראשון.
אפשרות אחת לבצע זאת היא להכניס את כל החלק השני תחת תנאי If כך שאם התנאי מתקיים – חלק זה יתבצע, ואם לא אז לא:

Create Proc MyProc @Flag Bit As

....

....

....

If @Flag=1

    Begin

    ....

    ....

    End

Go

פתרון כזה מסורבל במידת מה מכיוון שהוא הופך את כל החלק השני לבלוק תחום על ידי Begin & End וזה קצת מקשה על הבנת מבנה הפרוצדורה אם היא מאוד ארוכה, ויכולות להיות לו שתי חלופות:

Return – לפקודה זו שני שימושים עיקריים:

1. להחזיר ערך מהפרוצדורה למשתמש, שיציין אם היא הצליחה או נכשלה, או כל אינדיקציה אחרת.

למשל- פרוצדורה שיוצרת טבלה זמנית ומחזירה ערך כמה שורות הוכנסו לתוכה:

--פרוצדורה

Create Proc MyProc As

Select *

Into #T

From sys.objects;

Return @@RowCount;

Go


--הפעלה שלה

Declare @RC Int;

Exec @RC=MyProc;

Select @RC;

Go

image

2. לעצור את הריצה של הקוד ולסיים את הפרוצדורה.

Create Proc MyProc @Flag Bit As

....

....

....

If @Flag=0 Return;

....

....

Go

GoTo – לפקודת Return הנ"ל יש בעייה כאשר יש לצאת מהפרוצדורה בצורה מסודרת ולא סתם כך לסיים אותה. למשל- בתחילתה נפתחת טרזקציה שיש לסגור. במקרה כזה ניתן להשתמש בפקודת GoTo שתעביר אותנו היישר לקו הסיום:

Create Proc MyProc @Flag Bit As

Begin Transaction

....

....

....

If @Flag=0 Goto Sium

....

....

Sium:

Commit

Go

דוגמה טכנית להמחשה- שלוש פקודות Print, כשבעזרת GoTo מדלגים מעל השניה ומבצעים רק את הראשונה והשלישית:

Print 1

Goto Sium

Print 2

Sium:

Print 3

clip_image004

בנוסף לנ"ל יש שתי פקודות בקרת ריצה עבור לולאות:

Continue – "מקפיצה את הריצה לאיטרציה הבאה בלולאה, וכמו במקרה של Return חוסכת את הצורך ליצור בלוק If.

Break – מסיימת את הלולאה.

דוגמה טכנית להמחשה- לולאה רצה על כל המספרים מ-1 ועד 10 ומדפיסה אותם,

מדלגת על 3 על ידי Continue,

וב-8 יוצאת מהלולאה על ידי Break:

Declare @I Int;

Set @I=0;

While @I<10

    Begin

    Set @I=@I+1;

    If @I=3 Continue

    If @I=8 Break

    Print @I;

    End

clip_image006

להגיב »

אין תגובות.

פיד RSS של התגובות על הרשומה הזו טרקבאק קישור

כתיבת תגובה

Fill in your details below or click an icon to log in:

WordPress.com Logo

אתה מגיב באמצעות חשבון WordPress.com שלך. Log Out / לשמור )

Twitter picture

אתה מגיב באמצעות חשבון Twitter שלך. Log Out / לשמור )

Facebook photo

אתה מגיב באמצעות חשבון Facebook שלך. Log Out / לשמור )

Connecting to %s

ערכת עיצוב: Shocking Blue Green. בלוג בוורדפרס.קום.

Follow

Get every new post delivered to your Inbox.

הצטרפו אל 25 שכבר עוקבים אחריו