PracticU

cursor - חלק 1

בלי כתוביותעם כתוביות
PracticU › קורס DBA אפליקטיבי - שפת SQL למתחילים › cursor - חלק 1
מילון מושגים:
שאילתה - בקשה למסד נתונים לשלוף, להוסיף, לעדכן או למחוק נתונים, לרוב בשפת SQL.
משתנה - שם שמפנה למקום בזיכרון שבו נשמר ערך שיכול להשתנות במהלך ריצת התוכנית, כמו מספר, טקסט או אובייקט.
לולאה - מבנה בקרה שחוזר על קטע קוד שוב ושוב כל עוד תנאי מתקיים או עבור כל פריט באוסף.
זיכרון - רכיב מהיר ונדיף שבו המחשב שומר נתונים ותוכניות בזמן ריצתם. תוכנו נמחק עם כיבוי המחשב.
טבלה - מבנה במסד נתונים שמאחסן נתונים בשורות ועמודות. כל שורה היא רשומה וכל עמודה היא שדה.
תנאי - ביטוי לוגי בקוד שתוצאתו אמת או שקר, וקובע אילו פקודות יתבצעו בהתאם לערכו.

cursor - חלק 1
השיעור מציג cursor ב-T-SQL: אובייקט שמאפשר לעבור על תוצאת SELECT שורה אחר שורה ולטפל בכל שורה בנפרד. בשיעור מוצג גם איך מגדירים cursor עם אפשרות גלילה.
השלבים העיקריים
1. למה cursor: שאילתת SELECT רגילה פועלת על כל הקבוצה בבת אחת. cursor מאפשר טיפול נקודתי בכל שורה לחוד.
2. הגדרה: DECLARE עם שם הקורסור, ואחריו FOR ופקודת SELECT. בדוגמה: עמודת EmployeeID מטבלת employees.
3. פתיחה: OPEN מפעילה את השאילתה ומכינה את השורות.
4. הבאת שורה: FETCH NEXT FROM עם INTO טוענת את השורה למשתנים מקומיים. זהו תהליך שחוזר על עצמו בתוך לולאה.
5. לולאה: WHILE @@FETCH_STATUS = 0 ממשיכה כל עוד ההבאה הצליחה. בדוגמה נכתבת ב-Notes ההערה This is an even row לשורה זוגית, ו-This is an odd row לשורה אי-זוגית.
6. סגירה ושחרור: בסוף מבצעים CLOSE ו-DEALLOCATE, כדי לשחרר את המקום שהקורסור תופס בזיכרון.
7. תמונת מצב: השורות נקבעות ב-OPEN. שינויים שמשתמש אחר עושה בטבלה במהלך הריצה לא משתקפים בקורסור.
8. גלילה: קורסור שהוגדר עם SCROLL מאפשר FETCH PRIOR, FIRST, LAST ו-ABSOLUTE. בלי SCROLL, FETCH PRIOR נכשל.
שימו לב
השחרור בסוף הוא חשוב, כי הקורסור הוא ישות שנשארת בזיכרון עד ששוחררה.
בסיום תוכלו לכתוב cursor פשוט שעובר על שורות ומעדכן כל אחת לפי תנאי.
השיעור הבא בקורס: cursor - חלק 2

פרקי ההרצאה: cursor - חלק 1

  1. 00:00

    מבוא לקרסור: עיבוד שורה אחר שורה

  2. 00:57

    הגדרת הקרסור ושם מזהה

  3. 01:53

    לולאת WHILE על FETCH_STATUS

  4. 02:43

    דוגמה: טיפול בשורות זוגיות ואי-זוגיות

  5. 03:40

    פתיחת הקרסור ושליפה ללולאה

  6. 07:47

    סגירת הקרסור ושחרור הזיכרון

  7. 09:00

    הרצת התוכנית ובדיקת העדכונים

  8. 10:15

    קרסור INSENSITIVE ונתונים מנותקים

תמלול ההרצאה: cursor - חלק 1

הטקסט המלא של הדקות הראשונות בהרצאה «cursor - חלק 1» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.

  1. 00:19

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

  2. 00:30

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

  3. 00:55

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

  4. 01:05

    אנחנו צריכים להגדיר cursor שאיתו אנחנו עובדים, לתת לו שם והשם חייב להיות תקני כמו כל שם של משתנה בתוך הdatabase שלנו. once הגדרנו את הcursor זהו אובייקט אישות של בזיכרון ואנחנו צריכים גם לעשות לו open.

  5. 01:21

    לפתוח אותו open של הקרסור אם פתחתי את הקרסור והקרסור הוא בעצם עטיפה של פקודת סלקט אז ברגע שאני עוטף את הפקודת סלקט ונותן לה שם כקרסור פתחתי אותה אני צריך להביא את השורה הראשונה השורה הראשונה השורה שאותה אנחנו רוצים להביא זה תהליך של פאצ'ינג

  6. 01:43

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

  7. 02:08

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

  8. 02:25

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

  9. 02:35

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

  10. 02:52

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

  11. 03:11

    כלומר אנחנו חייבים לתת כאן טיפול מענה ברמה נקודתית R שורה ולא טיפול עבור הטבלה. חבלה כולה אז ראשית כל דיקלר בואו נגדיר קודם כל את המשתנה שיעזור לנו משתנה שיהיה counter lcounter integer שאיתו אנחנו נרוץ לאחר שהגדרנו את המשתנה בואו נגדיר גם את הקרסור שלנו דיקלר אנחנו נותנים שם לקרסור כמו כל משתנה אחר בתוכנית קרסור for

  12. 03:40

    אנחנו מציינים בדיוק כמו שאנחנו מתחילים אובייקט של views פלואיז שאנחנו עוטפים שאילתת סלקט גם כאן for ומיד אנחנו קובעים את פקודת הסלקט שלנו Select Employee ID for Employees נשלוף רק את עמודת Employee ID מתוך הטבלה אבל זה הוא הקרסור זוהי קבוצת האוכלוסייה כל טבלת Employees אוקיי עכשיו כבר תביגי את הנתונים אז ראשית כל צריך לפתוח את הקרסור לפתוח

  13. 04:09

    Open Name ברגע שפתחתי אז אני יכול כבר לבטל את השלב השלישי כפי שהוא רשום כאן לפני תביא לי את המידע עצמו לאן תכניס לי את הנתון ה-employee ID ירוצו כאן רוב וירוב ובכל איטרציה ייכנסו לתוך L-Counter למונה שלנו לערך שמקבל את ה-employee ID בכל איטרציה ערך אחר

  14. 04:40

    אוקיי, קיבלתי את הערך הראשון, כעת אני כבר יכול להיכנס ללולה אז אם כן הגענו לשלב הרביעי של יצירת קרס של עבודה מול קרסורים while what strudel strudel fetch סטטוס שווה לאפס כל עוד הוא שווה לאפס אנחנו יכולים להמשיך להיכנס לתוכנית שלנו כחלק מה-while לבצע את התוכנית קודם

  15. 05:03

    כל בואו נעטוף את זה בביגין ובתוך החלק של הביגין אנחנו רוצים לבדל בין שורות איזוגיות ובין שורות אי-זוגיות אז בואו ונכתוב את זה if l-count הערך שהתקבל כלומר השורה הנוכחית שעליה אנחנו רוצים האם פלואי הידיד אם הוא זוגי אם הוא מודול הוא שתיים כלומר אם אני מחלק אותו בשתיים ולוקח את השארית

  16. 05:29

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

  17. 05:39

    עד בטבלות פלואי מעדכן את העמודה של נוטס שווה לשורה הזאת, היא בעצם שורה זוגית. This is an even law. אנחנו מעדכנים את השורה שהיא בעצם שורה זוגית, אבל אנחנו לא עושים את זה על כל טבלת אינפלואי, אז בואו נוסיף את החלק של ה-worklose.

  18. 06:02

    Worklose לא יהיה פריידי שווה לערך שעליו אנחנו נמצאים את השורה שבה אנחנו עומדים, היא מיוצגת על ידי l-count שווה ל-strudel l-count.

  19. 06:16

    מצוין זה החלק הראשון של ה-if זה הטיפול במקרה של שורות זוגיות בואו ננסה להוסיף שורות אי-זוגיות ולכן מספיק לנו ב-else לא צריך כאן else if כי זה בעצם המשלים של כל שאר השורות else if העדכון יתבצע בהתאמה a vet employees that notes שווה is an odd row מצוין אנחנו מעדכנים במידה

  20. 06:47

    ויש לנו שורות אי-זוגיות נכניס את הערך המתאים לתוך עמודה נעוץ, אבל זה רק במידה ששוב פעם, חלק של הוול קלוז ואונגלואי איי-די שווה ל-L אונגלואי איי-די.

  21. 07:04

    וואנס יצרנו את העדכון, חברים וחברות, אני שמח לבשר שאנחנו מאוד מאוד קרובים לסיום, יש לנו כבר טיפול בכל אחת מהשורות בנפרד בהתאם לערך שלה, בהתאם למיקומה, בהתאם לאונגלואי איי-די, כל מה שמותר לנו כרגע לעשות זה בעצם לסגור את חלק של הביגיל, אבל רגע בואו נביא את ה-fetch, fetch next from the main, להביא את השורה

  22. 07:29

    הבאה שהרי אנחנו רצים כברור בהירור שורה אחר שורה על מנת לעדכן. fetch next from the main אנחנו צריכים להכניס את זה שוב פעם כפי שרשמנו מקודם into strudel l_com.

  23. 07:42

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

  24. 08:14

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

  25. 08:37

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

  26. 08:53

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

  27. 09:06

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

  28. 09:21

    ווילס ניימפסי קלאס ניימפ נאוטס פלוי איי-די פרומין פלואיידס בואו נשלוף את המידע F5 והנה הפלא ופלא איזה יופי כל שורה קיבלה טיפול ומענה מיוחד בהתאם למיקומה בהתאם למספר עם פלוי איי-די במידה והוא אי-זוגי קיבלנו this is an out or במידה והוא זוגי this is an even row וכו'

  29. 09:55

    וכו' בול נקודתי ברמה של שורה כזו או אחרת. אין ספק, יכולנו למצוא את זה גם ללא קרסור, אני כבר חושב על רעיון שימוש ב-case, שימוש בשתי סקריפטים, שני אפדייטים שונים, אבל בכל זאת רצינו כאן לתרגל איך אנחנו כאן בעצם משתמשים בחלק של הקרסור, צובעים אוכלוסייה ורצים עליה row by row.

  30. 10:23

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

  31. 10:42

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

  32. 10:54

    מה זה נותן לי? מצוין. עד עכשיו בכל הקרסורים שלנו, תמיד עשינו fetch next גם כאן בתחילת הקרסור fetch next כלומר תמיד התקדמנו קדימה לשורה הבאה ב-scroll אנחנו יכולים לנוע קדימה ואחור next and period לזוז קדימה ואחור בכלל כל השימוש ב-next עצמו שופך לנו מגוון של אפשרויות

  33. 11:20

    אנחנו יכולים להביא את ה-next כמו שראינו בדוגמה שלפנינו מהcursor name לתת את השם אנחנו יכולים לא לקחת את ה-next אלא להביא את הקודם, את השורה הקודמת, לחזור אחורה מול קרסור name.

  34. 11:36

    בנוסף אנחנו יכולים להביא את השורה הראשונה fetch first from שוב פעם שם הקרסור במקרה שלנו זה main זה יכול להיות דבר אחר מתוך הקרסור להביא את השורה הראשונה. אנחנו יכולים לדלג לשורה האחרונה אנחנו יכולים להביא כל אחת ואחת מהשורות כשאנחנו רוצים נקסט פרייר פרסט לאסט אני יכול גם להביא שורה נקודתית אבסולוט אין אני רוצה את שורה המספר 6 שורה המספר 7 וואטאבר

  35. 12:09

    כל שורה אני מציין את המספר רושם אבסולוט המספר ואנחנו מביאים אותו מתוך הקרסור שלנו עם הנוספת שאנחנו יכולים לא בצורה אבסולוטית אלא כחלק יחסי אוקיי אני כרגע נמצא בשורה המספר 3 מכאן ואילך אני רוצה שתי שורות קדימה תן לי ספר Related ליחס למקום שבו אני נמצא אני רוצה שתי שורות קדימה רושם שתיים וממשיך From cursor mate אם כן ראינו מגוון רחב של

לקורס המלא: קורס SQL ו‑DBA אפליקטיבי

ההרצאה הקודמת: פקודת case - חלק 3

ההרצאה הבאה: cursor - חלק 2

קורסים נוספים במסלול

  • קורס NoSQL - MongoDB
  • קורס SSIS
  • קורס BI - ניתוח מסדי נתונים - Qlik Sense
  • קורס Power BI