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

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

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

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


שיטה זו תעבוד מצויין בגרסאות חדשות יותר (כלומר אחרי גרסה 10) – שם בוטלו ההגבלות על אורך השורה של dbms_output ועל גודל ה-buffer ש-dbms_output יכול להדפיס. בגרסאות קודמות הסקריפט לא כל כך יעבוד או יעבוד על פלטים קטנים יחסית.

כדי ש-sqlplus יציג את ההדפסה ויבטל את ההגבלה על גודל הפלט יש לכתוב את הפקודה הבאה:

set serveroutput on size unlimited

הסקריפט שמייצר את בלוק ה-PL/SQL:

declare
    line_cmd     clob;
    p_view_owner varchar2(40) := 'SCOTT';
    p_view_name  varchar2(40) := 'MY_TABLE';
    p_delimiter  varchar2(5) := ',';
begin
    dbms_output.put_line('begin');

    line_cmd := '    for x in (select * from ' || p_view_owner || '.' || p_view_name || ') loop';
    for i in (select '        dbms_output.put(x.' || column_name || ' || ''' || p_delimiter ||
                     ''');' col
                from dba_tab_columns
               where table_name = upper(p_view_name)
                 and owner = upper(p_view_owner)
               order by COLUMN_ID)
    loop
        dbms_output.put_line(line_cmd);
        line_cmd := i.col;
    end loop;

    line_cmd := replace(line_cmd, '|| ''' || p_delimiter || '''', '') || q'{
        dbms_output.new_line;
    end loop;
end;
/}';
    dbms_output.put_line(line_cmd);

end;
/

שווה לשים לב לטריק שעשיתי בשורות 21-25 – שם השתמשתי בשיטה חדשה שנוספה בגרסה 10 ליצור מחרוזות עם תווים שמורים (כמו שורה חדשה או גרש (‘)): שימוש באות q ואז בחירת דלימיטר עצמאי – במקרה שלי סוגריים מסולסלים.

אם יש הערות או שאלות אתם מוזמנים לשאול או להעיר – אני מבטיח לענות לכולם…:)

2 תגובות

Trackbacks & Pingbacks

  1. […] פעם פעם, מזמן מזמן, כתבתי על איך ניתן לייצר קבצי CSV על ידי שימוש בפיצ'רים של SQL*Plus ואחרי זה כתבתי עוד פוסט על איך ניתן לייצר קבצי CSV על ידי שימוש בקוד PL/SQL. […]

  2. […] פעם פעם, מזמן מזמן, כתבתי על איך ניתן לייצר קבצי CSV על ידי שימוש בפיצ'רים של SQL*Plus ואחרי זה כתבתי עוד פוסט על איך ניתן לייצר קבצי CSV על ידי שימוש בקוד PL/SQL. […]

השאירו תגובה

Want to join the discussion?
Feel free to contribute!

השאר תגובה

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