מדריך ליצירת קובץ 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 יכולים לעזור בהרצת פקודות לפני ואחרי השליפה
[oracle@dbserver1 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/password@tnsname 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 (בסינית, תודה לגוגל טרנסלייט). יש שם כתובת אימייל והבחור שפיתח את הכלי לפעמים אפילו עונה בו… 🙂
Trackbacks & Pingbacks
[…] בפוסט הקודם על ה-SQL*UnLoader וסיפרתי איזה כלי מצוין זה. אני עדיין חושב שזה כלי מצוין […]
[…] בפוסט הקודם על ה-SQL*UnLoader וסיפרתי איזה כלי מצוין זה. אני עדיין חושב שזה כלי מצוין […]
השאירו תגובה
Want to join the discussion?Feel free to contribute!