שינוי התנהגות ב-execute immediate בין גרסה 10 לגרסה 11

במסגרת הבדיקות של גרסה 11 נתקלנו בתקלה מוזרה – קוד pl/sql שעבד בגרסאות קודמות הפסיק לעבוד בגרסה החדשה.

הקוד שעבד קודם הוא:

SQL> begin
2 execute immediate 'alter view vemp compile;';
3 end;
4 /
PL/SQL procedure successfully completed.

אבל כאשר ניסינו לשים אותו בגרסה 11.2.0 קיבלנו את ההודעה הבאה:

SQL> begin
2 execute immediate 'alter view vemp compile;';
3 end;
4 /
begin
*
ERROR at line 1:
ORA-00911: invalid character
ORA-06512: at line 2

הבעיה היא כמובן בנקודה-פסיק (;) שנמצא בסוף פקודת ה-alter שמנסים להריץ דינמית.

על פי התיעוד של גרסה 10, לפקודות SQL אסור שיהיה להן נקודה-פסיק (;) בסוף הפקודה. למרות זאת, בגלל באג בגרסה 10, פקודות execute immediate של פקודת alter הסכימה לקבל את הפקודה למרות הנקודה-פסיק. הבאג תוקן ועכשיו הקוד נופל. יש לתקן את הקוד שלא יכיל נקודה-פסיק מכוון שזו ההתנהגות המצופה.

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

2 תגובות
  1. נעמה גל-אור
    נעמה גל-אור says:

    אכן מאפיין של שדרוגי גרסאות. יש דרך לעשות trace כדי לגלות את כל המקומות הללו?

    הגב
  2. Zohar Elkayam
    Zohar Elkayam says:

    בגלל האופי של הבאג (פקודת alter שרצה בצורה דינמית עם נקודה-פסיק בסוף הפקודה) אין דרך מהירה לאתר את כל המקרים בצורה ממוכנת ויש לעבור על כל הקוד שמריץ execute immediate ולוודא שלא יצרנו באג כזה. כמובן שאיתור קוד שמריץ execute immediate אפשר למצוא בצורה ממוכנת (אבל לפעמים הוא מריץ משתנה ואז צריך לקרוא את הקוד יותר לעומק)… 🙂

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

    הגב

השאירו תגובה

Want to join the discussion?
Feel free to contribute!

השאר תגובה

This site uses Akismet to reduce spam. Learn how your comment data is processed.