יצירת קובץ CSV מתוך PL/SQL

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

השיטה שתוארה בפוסט הקודם היא שיטה מעולה כל עוד לא מנסים לשרשר יותר מדי שדות ואז אורך הרשומה הופך להיות מגבלה רצינית. בשיטה הקודמת שירשור ערכים שעובר גודל מסויים (לא בדקתי מהי, נדמה לי שזה 4000 – המגבלה של פונקציות SQL באופן כללי) נכשל עם הודעת שגיאה: ORA-01489: result of string concatenation is too long.

כדי לפתור את הבעיה הזו כתבתי סקריפט שמייצר קוד PL/SQL. אם נריץ את הקוד שהסקריפט הזה מייצר אז יודפסו למסך השורות של קובץ ה-CSV.

המשך קריאה…

ניקוי קבצים ישנים ב-OH דרך OPatch

לפני תקופה מסויימת קיבלתי הודעה ממערכת השו"ב כי הדיסק שעליו יושב ה-Oracle Home התמלא ואם אני יכול לבדוק מה אפשר למחוק שם כדי לפנות מקום. במסגרת החיפושים "מה תופס מקום" מצאתי ספריה תחת ה-Oracle Home שלי בשם .patch_storage שתפסה כמה ג'יגות (4) של מקום.

בבדיקה ב-MOS (מה שנקרא פעם Metalink והיום נקרא My Oracle Support) – במסמך מספר 550522.1 התברר לי שזו הספרייה שמאפשרת לנו לעשות rollback ל-patchs, patchsets, CPU וכו' אבל החל מגרסת opatch 10.2.0.4.5 התווסף כלי שמאפשר לנו לקנות את כל הקבצים המיותרים בספריה מבלי לפגוע ביכולת לחזור לאחור. הקבצים המיותרים כוללים לדוגמה patch-ים מגרסאות קודמות (לדוגמה אם שידרגנו גרסאת major ועברנו לגרסה 10.2.0.4 אז ניתן למחוק את כל הפאצ'ים שהותקנו על 10.2.0.3) או שאינם רלוונטים יותר.
המשך קריאה…

תיקון חוסר סנכרון ב-data guard כאשר נוצר קובץ במקום לא סטנדרטי

כאשר מוסיפים Data file לסביבת primary של Dataguard יש להוסיף את הקובץ גם בסביבת ה-standby כדי שהסינכרון ימשיך לעבוד. ל-dataguard ישנה היכולת ליצור בעצמו את הקובץ שנוצר ב-primary גם בסביבות הגיבוי, אם הגדרנו לו מראש מעין טבלת תרגום ל-File system ב-primary ו-File system ב-standby. טבלת ההמרה הזו מתבצעת בפרמטר LOG_FILE_NAME_CONVERT.

הבעיה מתחילה כאשר יצרנו קובץ במקום "לא סטנדרטי" (כלומר שלא מוגדר ב-LOG_FILE_NAME_CONVERT) ואז סביבת ה-standby לא יודעת איפה ליצור את הקובץ ומפסיקה לעשות apply עד שנטפל בבעיה.

המשך קריאה…

השהיית פקודה כאשר יש בעיית מקום ב-tablespace

נניח שיש לנו טרנזאקציה של פקודת insert ארוכה במיוחד (כזו שלוקחת שעות) ובאמצע ה-insert מרפי קופץ לביקור ונגמר המקום ב-tablespace של הטבלה. על פניו, אירוע מצער שאי אפשר להתגבר אליו אלא להתחיל מחדש, נכון? אז זהו שלא. ישנו פיצ'ר בשם Resumable Space Allocation שמאפשר לנו להכניס את ה-session להשהייה ולהמתין פרק זמן מוגדר כדי שנוכל לטפל בבעיה. ברגע שנטפל בבעיה, ה-session שלנו ימשיך כרגיל באופן אוטומטי, כאילו לא קרה שום דבר.

זה לא פיצ'ר חדש במיוחד – למעשה הוא קיים כבר מגרסה 9i – אבל הופתעתי היום לגלות שיש מפתחים (ויותר גרוע, DBA-ים) שפשוט לא מכירים את זה. בוא נראה איך אפשר להשתמש בכלי החשוב הזה.
המשך קריאה…

עמודות וירטואליות

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

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

המשך קריאה…

יצירת קובץ CSV על ידי שימוש ב-SQLPLUS

היום התבקשתי על ידי אחת המפתחות לעזור לה לשמור שליפה של 230 עמודות ולמעלה מ-50 מליון רשומות לקובץ CSV. מבחינתי זו הזדמנות טובה לתעד את זה המסקנות שלי מהבעיה והפתרון היחסית גנרי שיצרתי בשבילו.

שליפות ב-sqlplus מחזירות בדרך כלל את הרשומות באחד משתי דרכים: הדרך הראשונה היא fixed length columns (כלומר העמודה הראשונה מתחילה תמיד במיקום 1, העמודה השנייה תמיד במיקום 7 וכן הלאה). הדרך השנייה היא כ-HTML ועל זה נדבר בהזדמנות אחרת. קובץ CSV הוא בסופו של דבר קובץ טקסט לכל דבר שבו העמודות (ערכים) מופרדים על ידי פסיקים (ומכאן שמו: Comma-separated values).

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

המשך קריאה…