אתגר החודש – אתגר ינואר 2012 - ilDBA Portal

אתגר החודש – אתגר ינואר 2012

01/01/2012 | פורסם על ידי

שלום,

אתגר חודש ינואר ויתקיים בסביבת Oracle – בנושא SQL.

באתגר יש שלוש שאלות:

יש טבלה שנראית ככה:
create table ildba ( Property_name varchar2(10), Property_datatype varchar2(10), Property_value varchar2(1000) )
  • מה לא בסדר בשאילתא הבאה, איך מתקנים את זה:
Select property_name From ildba Where property_datatype='date' and to_date(property_value)>sysdate-1;
  • בהמשך לשאלה לעיל, למה כאשר ה-DB שלנו היה 9i לא היתה בעיה עם השאילתא, ועכשיו בגרסת 10g או 11g אנחנו מקבלים שגיאה?

שאלה נוספת. יש לנו טבלה שנראית ככה:

create table ilDBA( id number, code varchar2(30), description varchar2(50)
);

אנו שולפים מהטבלה פרטים על שני id's שונים, כאשר לשניהם קיימת רשומה עם code=99201.

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

select * from ilDBA where id = 222 and code = 99201;

אבל כאשר אנו שולפים את המידע על id אחר, מתקבלת פתאום שגיאה:

select * from ilDBA where id = 333 and code = 99201; ERROR: ORA-01722: invalid number
  • למה השגיאה מתרחשת לי על חלק מהid's, ואיך ניתן לתקן את זה?

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

.

כדי להשתתף באתגר יש להירשם לאתר ולשלוח את הפתרונות ל-ildba@brillix.co.il

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

————————————————

עידכון 4.3.2012

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

פתרון האתגר:

  1. בשאילתא, אנחנו רואים שה- property_value הוא עמודה כללית שמכילה ערך טקסטואלי, ובשאילתות נצטרך לבצע המרה בהתאם ל-property_datatype .
    בשאילתא שהצענו, התנאים הם ש- property_datatype='DATE' ושהערך to_date(property_value) שווה לתאריך מסויים.
    על פניו נראה שאין בעיה עם השאילתא – אנחנו מנסים לבצע את ה- to_date רק לרשומות שאכן יש בהם date,
    אבל אנחנו צריכים לזכור שביצוע התנאים והסדר שלהם מושפע מה- Optimizer .
    ה- Optimizer יכול להחליט שעדיף לו לעשות קודם את ההמרה של ה-to_date מבחינת כמות הרשומות שהתנאי יחזיר,
    ואם אכן זה מה שהוא יעשה נקבל שגיאת המרה (conversion) של המידע (כי פונקצית ה-to_date תקבל כערך משהו שלא מייצג תאריך חוקי).
    לעומת במקרה ההפוך שבו ה- Optimizer יבצע את התנאי על property_datatype קודם,
    ולא יתבצע בכלל נסיון המרה שכזה על רשומה שיש בה ערך שאמור להיות מספרי או טקסטואלי.

  2. יש הבדל בין גרסאות שונות של אורקל מכיוון שזה תלוי ב-Optimizer ובסטטיסטיקות.
    למשל ב- 9i, אם לא היו לנו סטטיסטיקות על הטבלה, היינו עובדים עם ה- RULE based optimizer,
    ה-RBO היה בודק קודם את התנאי וראשון ורק אז את השני (כלומר, הולך עליהם לפי הסדר) ולכן לא היינו מקבלים שגיאה במקרה הזה.

  3. עמודת ה-code הינה עמודה טקסטואלית (varchar2), אך היא יכולה להכיל ערכים מספריים.
    מכיוון שבשתי השאילתות לעיל אנו מבצעים הגבלת רשומות לפי מספר, אורקל יצטרך לבצע המרה של הערכים (implicit conversion) בעמודת code ממחרוזת למספר.
    בדוגמא שנתנו, לקחנו מצב היפוטתי בו שבתישאול לפי id=222, כל הערכים בעמודת code הינם מספריים, ולכן ההמרה הצליחה וחזרו התשובות הרצויות.
    אם זאת, בדוגמא של תישאול לפי id=333, לקחנו מצב היפוטתי, בו היו כמה ערכים טקסטואליים בעמודת code, וברגע שהתבצעה ההמרה, ונתקלנו בערך הטקסטואלי, תחזור השגיאה של invalid number.

נתראה באתגר הבא !
מערכת ilDBA

לא ניתן להגיב.



מאמרים קשורים

אתגר

אתגר החודש – אתגר ספטמבר 2011

כמו בכל חודש אנו מביאים לכם חידה הקשורה לבסיסי נתונים, בין פותרי החידה תורגל שובר של נופשונית. והחודש חידה הקשורה [...]
אתגר

אתגר החודש – אתגר אוגוסט 2011

כמו בכל חודש אנו מביאים לכם חידה הקשורה לבסיסי נתונים, בין פותרי החידה תורגל שובר של נופשונית. והחודש חידה הקשורה הקשחת בסיס נתונים [...]
אתגר

אתגר החודש – אתגר יולי 2011

אתגר יולי יהיה בשפת SQL / [...]
Copyright 2019 ilDBA Portal. Brought to you by Brillix - Israel Leading DBA company. Sponsored by: DBSnaps - Database Video Tutorialss
Website Security Test
%d בלוגרים אהבו את זה: