מדריך ליצירת קובץ CSV באמצעות SQL*UnLoader

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

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

הכלי פותח על ידי FangXin Lou שהוא Oracle Ace מסין.

מה התוכנה מאפשרת לנו לעשות

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

התוכנה הפשוטה הזו מגיעה בארבע גרסאות: Windows, Windows 64, Linux, Linux64 והיא כתובה בשפת C ובשימוש של OCI8 (כלומר, היא תומכת מגרסה 9 עד 11 כולל, עוד לא בדקתי על 12).

את הקוד המקומפל (בינארים) ניתן להוריד כאן: http://www.anysql.net/software/ociuldr.zip או מפה http://www.anysql.net/software/sqluldr.zip

מדריך למשתמש (לא בטוח שמעודכן): www.dbatools.net/doc/ociuldr.pdf

עדכון (09.12.2015): את קוד המקור של הגרסה הקודמת של ההתוכנה היה ניתן להוריד מ-github אבל כבר לא…

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

פרמטרים

בואו נעבור על כמה פרמטרים חשובים שכדאי להכיר:

  • ניתן להריץ שליפות ב-clear text (query) או כקובץ (sql). בקובץ ה-SQL אין צורך בשום דבר חוץ מהפקודה עצמה. אם הקובץ מקבל פרמטרים ניתן להשתמש בפרמטר exec כדי לטפל בזה.
  • התוכנה יודעת להשתמש ב-delimiter מוגדר לעמודות (record) או לשורות (rows).
  • ברירת המחדל של התוכנה היא לא להציג את הכותרת של השליפה. הפרמטר head משנה את ההגדרה הזו (head=yes).
  • התוכנה יודעת להוציא את הקבצים בפורמטים שונים (לא רק CSV): הפרמטר text שולט בזה.
  • הפרמטרים Presql ו-postsql יכולים לעזור בהרצת פקודות לפני ואחרי השליפה
 
[[email protected] zohar]$ ./sqluldr2_linux64_10204.bin help=yes
 
SQL*UnLoader: Fast Oracle Text Unloader (GZIP, Parallel), Release 4.0.1
(@) Copyright Lou Fangxin (AnySQL.net) 2004 - 2010, all rights reserved.
 
License: Free for non-commercial useage, else 100 USD per server.
 
Usage: SQLULDR2 keyword=value [,keyword=value,...]

Valid Keywords:
   user    = username/[email protected]
   sql     = SQL file name
   query   = select statement
   field   = separator string between fields
   record  = separator string between records
   rows    = print progress for every given rows (default, 1000000)
   file    = output file name(default: uldrdata.txt)
   log     = log file name, prefix with + to append mode
   fast    = auto tuning the session level parameters(YES)
   text    = output type (MYSQL, CSV, MYSQLINS, ORACLEINS, FORM, SEARCH).
   charset = character set name of the target database.
   ncharset= national character set name of the target database.
   parfile = read command option from parameter file
   read    = set DB_FILE_MULTIBLOCK_READ_COUNT at session level
   sort    = set SORT_AREA_SIZE at session level (UNIT:MB)
   hash    = set HASH_AREA_SIZE at session level (UNIT:MB)
   array   = array fetch size
   head    = print row header(Yes|No)
   batch   = save to new file for every rows batch (Yes/No)
   size    = maximum output file piece size (UNIB:MB)
   serial  = set _serial_direct_read to TRUE at session level
   trace   = set event 10046 to given level at session level
   table   = table name in the sqlldr control file
   control = sqlldr control file and path.
   mode    = sqlldr option, INSERT or APPEND or REPLACE or TRUNCATE
   buffer  = sqlldr READSIZE and BINDSIZE, default 16 (MB)
   long    = maximum long field size
   width   = customized max column width (w1:w2:...)
   quote   = optional quote string
   data    = disable real data unload (NO, OFF)
   alter   = alter session SQLs to be execute before unload
   safe    = use large buffer to avoid ORA-24345 error (Yes|No)
   crypt   = encrypted user information only (Yes|No)
   sedf/t  = enable character translation function
   null    = replace null with given value
   escape  = escape character for special characters
   escf/t  = escape from/to characters list
   format  = MYSQL: MySQL Insert SQLs, SQL: Insert SQLs.
   exec    = the command to execute the SQLs.
   prehead = column name prefix for head line.
   rowpre  = row prefix string for each line.
   rowsuf  = row sufix string for each line.
   colsep  = separator string between column name and value.
   presql  = SQL or scripts to be executed before data unload.
   postsql = SQL or scripts to be executed after data unload.
   lob     = extract lob values to single file (FILE).
   lobdir  = subdirectory count to store lob files .
   split   = table name for automatically parallelization.
   degree  = parallelize data copy degree (2-128).
   hint    = MySQL SQL hint for the Insert, for example IGNORE.
   unique  = Unique Column List for the MySQL target table.
   update  = Enable MySQL ON DUPLICATE SQL statement(YES/NO).
   crack   = The crack key for the content protection.
   uncrack = The uncrack key for the content protection.
 
  for field and record, you can use '0x' to specify hex character code,
  r=0x0d n=0x0a |=0x7c ,=0x2c, t=0x09, :=0x3a, #=0x23, "=0x22 '=0x27

דוגמה לשימוש

./sqluldr2_linux64_10204.bin user=system/manager query="select * from dba_users" file=users.csv

פלט (בתוך הקובץ):

ZOHAR,98,,OPEN,,,USERS,TEMP,2014-02-16 01:35:12,DEFAULT,DEFAULT_CONSUMER_GROUP,,10G 11G ,N,PASSWORD

הערה חשובה!

כאמור, מדובר בבחור סיני – האתר שלו קצת לא מתפקד (כמעט על הכל כתוב Access Denied) ונראה שהוא לא כל כך מעדכן אותו (עדכון אחרון לפני שנה וחצי). בנוסף, אני לא יודע מתי הכלי הזה עודכן לאחרונה. מכוון שעדיין מדובר פה על Oracle Ace אז הכלי יחסית אמין בעיני וניתן להשתמש בו.
אני עובד עם הכלי הזה בסביבות של Oracle 11gR2 לדברים פשוטים יחסית למרות שהכלי מאפשר גם דברים יותר מורכבים: הוא תומך ב-lob-ים, מאפשר debug ושליטה בפרמטרים של tuning ואפילו חלוקה של הפלט למספר קבצים.
שימו לב לבאג הבא: אם הוא סוכם עמודה שיש בה null, התוצאה תקינה אבל האפליקציה הזו עפה…

הנה כמה קישור לאתר של המפתח: http://www.anysql.net (בסינית, תודה לגוגל טרנסלייט). יש שם כתובת אימייל והבחור שפיתח את הכלי לפעמים אפילו עונה בו… 🙂

2 תגובות

Trackbacks & Pingbacks

  1. […] בפוסט הקודם על ה-SQL*UnLoader וסיפרתי איזה כלי מצוין זה. אני עדיין חושב שזה כלי מצוין […]

  2. […] בפוסט הקודם על ה-SQL*UnLoader וסיפרתי איזה כלי מצוין זה. אני עדיין חושב שזה כלי מצוין […]

השאירו תגובה

Want to join the discussion?
Feel free to contribute!

השאר תגובה

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