
UPDATE בתוך פונקציה נדחה עם השגיאה Invalid use. Stored procedure יכולה לעדכן נתונים.הטקסט המלא של הדקות הראשונות בהרצאה «Stored Procedure vs Function» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
שלום לכולם, בסרטון הקצר הזה אנחנו ננסה להבין מה ההבדל בין stored procedure לפונקציות. הרבה שואלים אותי את השאלה הזאת, וזאת שאלה באמת מעניינת.
אז בואו נתחיל מזה. ההבדל הכי גדול, שפונקציה לא יכולה לשנות נתונים בטבלה. זאת אומרת שאם יש לי פה טבלה, נניח אמפלואיסט, טבלת עובדים, והנה אני רואה את הנתונים של טבלת עובדים, אם אני רוצה לשנות בנתונים אני לא יכול מתוך פונקציה.
לעומת זאת, סטורט פרוסיג'ר אני כן יכול. פונקציה זה משהו הרבה יותר קטן שנועד לחישובים קטנים, אוקיי? להחזיר איזשהו ערך כחלק מסלקט, אבל הוא לא יכול לשנות נתונים על בסיס קבוע בדאטה בייס, שזה הדבר הכי חשוב.
בואו תראו, נניח אני עושה פונקציה חדשה, בואו נעשה לה, נקרא לה, נניח myTest, מיי טסט פאנקשן, נגיד לה שהיא מקבלת איזשהו פרמטר, נניח היא מקבלת איזשהו פרמטר, בואו נשאיר, נקרא לו פראם אחד, ושיהיה אינטג'ר, אוקיי?
אנחנו קוראים להם איזשהו פרמטר, אוקיי? קוראים להם פרמטר והיא מחזירה חזרה, שימו לב, פונקציה, בניגוד לסטורט פרוסידג'ר, מחזירה משהו בתוך השם שלה.
יופי. נשתמש אפילו בטמפלייט המוכן שיש לנו כדי לזרז את העניינים, יש לנו מכריזים על משתנה רזולט, נניח כלשהו, נקרא לו שטרודל רזולט, שיהיה לנו יפה.
מחזירים חזרה רזולט בסוף, ואומרים שהרזולט הזה שווה לפרמטר שקיבלנו כפול נניח 10. אוקיי? יפה מאוד.
אז הנה אנחנו עושים, אפשר לעשות פה סט, ויש לנו פונקציה מוכנה. עושים Update, פונקציה אכן עובדת. שימו לב, אני יכול לרשום פה כמה שורות, אני יכול גם לעשות כפול נניח 100 והנה פונקציה עובדת.
רק מה? במקום create, אלתר, כי כבר עשינו אותה. מה אני לא יכול לעשות? אני יכול לעשות סלקט, כן? אפשר לעשות סט, אפשר לעשות סלקט, מי שמעוניין לדעת.
הכל עובד. מה אני לא יכול לעשות? זה update. שימו לב מה קורה כשאני עושה update. אני עושה update, נניח טבלת employees, עושה set, לא יודע מה, first name שווה aaa, פר אימפלואי איי-די שווה נניח אחד בוא רק נראה שיש לנו באמת אימפלואי איי-די אחד יש לנו אימפלואי איי-די אחד
אז יופי תסתכלו מה קורה כשאני רוצה לעשות בתוך הפונקציה update מה הוא כותב לי invalid use אסור לעשות update אסור לעשות update בתוך הפונקציה זאת אומרת פונקציה נועדה רק לאסוף כמה חישובים קטנים ולתת את זה למי שקרא לה זה יותר קטן כזה לעומת זאת לעומת זאת סטורט פרוסיג'ר כן יכול לעשות את זה. עוד מעט תהפוך את זה לסטורט פרוסיג'ר ותראו
שהוא כן יכול לעשות את זה. אז איך אני משתמש בפונקציה? איך אני משתמש בפונקציה? אני עושה דבר כזה, נניח אני רוצה להשתמש ב-MyTest Function.
אז בואו נשתמש בה למטה פה, רק בואו נצמצם קצת שורות שתוכלו לראות הכל על המסך. נוריד פה איזה שורות מיותרות, כל זה נוריד, שיהיה לכם ככה.
זהו, עד הגו. עכשיו אני עושה סלקט לדוגמה כוכבית From Employees, אוקיי? עשיתי כוכבית Employees, יש לי תוצאות. העמודה הראשונה, אני יכול להגיד לה שזה MyTest Function, ולתת לה בסוגריים נניח 8, פסיק, כל העמודות מתוך ה-Employee.
אתם רואים? זאת אומרת, אני יכול להשתמש בה תוך כדי משהו. ואז הוא אומר שהוא לא רואה אותה. למה הוא לא רואה אותה? הנה, הוא רואה אותה. צריך לרשום לו גם את היוזר שיצר אותה, את הסכמה.
הנה, אתם רואים? כי הוא קרא, החזיר במקום 8, 800. כי עשינו פה פער רם כפול 8. לדוגמה, אנחנו יכולים לעשות לו as celery, אוקיי?
ואז הוא נותן לנו פה עמודת סלרי, 800, אוקיי? זה השם שבא לי. אוקיי, אם אני אעשה פה 9, כמובן שהיא יכולה לעשות דברים יותר מורכבים, אוקיי?
אז פונקציה יכולה להיות חלק מתוך ה-select, היא לא יכולה לשנות מידע, ויש לה עוד כל מיני מגבלות, אבל זה העיקר שלה. לעומת זאת, אם היינו עושים סטורט פרוסיג'ר, אוקיי?
במקום פאנקשן, היינו עושים פרוסיג'ר, אוקיי? מיי טסט, בואו נעשה פרוסיג'ר חדש, נעשה את זה בחלון נפרד שיהיה לנו קל. ניו סטורט פרוסיג'ר, אני עושה סטורט פרוסיג'ר חדש, מוחק את כל ההתחלה הזאת, עושה קריאט סטורט פרוסיג'ר, מיי טסט סטורט פרוסיג'ר SP, הוא גם יקבל פרמטר אחד, פראם אחד,
הוא יהיה מסוג אינטג'ר אוקיי לא צריך עוד פרמטר יכולתי לעשות פסיק ועוד פרמטר לא צריך no count זה אומר שלא יחזיר כמה שורות לא מעניין אותי הכל אותו דבר ככה אני עושה פראם אחד שווה בוא נעשה סלקט סלקט פשוט נחזיר ישר תוצאה פראם אחד כפול 100 אתם יודעים מה תיק כוכבית
from employees אוקיי זה מה שהוא עושה הוא מחזיר לי את כל השורות מתוך אמפלואיז, ועוד עמודה אחת של 100, בסדר? יופי, עשינו פרוצדורה כזאת, עכשיו בוא נקרא לה אקזק, אקזיקיוט, פרוצדורה ונותנים לה איזשהו מספר, נניח 8 כפרמטר.
עובד? עובד. יכלתי גם לעשות שטרודל, פראם 1 שווה 8. כמובן שאתם נותנים פרמטרים בעלי משמעות, אוקיי?
הלאה, מה עוד אני יכול לעשות? אני יכול לעשות פה Update, אני יכול פה לשנות, זה היתרון של Store Procedure.
עוד פרוציג'ר הרבה יותר קזת update last name last last name שנייה from update employees שנייה קודם כל update employees set last name שווה נעשה first name first name שווה yoni where employee id שווה 1 נכון יופי שימו לב הדבר הזה כן עובד עכשיו הוא לא נותן לי בגלל שזה כבר נוצר אלתר אלתר זה לשנות יופי נותן לי עכשיו אני מריץ את הפרוצדורה, שימו לב, היא
לא יכולה להיות בתוך סלקט. והשם הראשון שיש לנו,