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

16/02/2011

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

Filed under: 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 feed for comments on this post. TrackBack URI

להשאיר תגובה

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

הלוגו של WordPress.com

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

תמונת Twitter

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

תמונת Facebook

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

תמונת גוגל פלוס

אתה מגיב באמצעות חשבון Google+ שלך. לצאת מהמערכת / לשנות )

מתחבר ל-%s

יצירה של אתר חינמי או בלוג ב־WordPress.com.

%d בלוגרים אהבו את זה: