ฉันต้องการดึงข้อมูลบางอย่างจากฐานข้อมูล Oracle 11g รีลีส 1 และจัดให้เป็นไฟล์ CSV ตั้งแต่หนึ่งไฟล์ขึ้นไป ข้อมูลอยู่ในหลายตารางและ / หรือมุมมอง ทั้งหมดนี้ควรทำงานผ่านบรรทัดคำสั่ง อะไรจะเป็นวิธีที่ดีที่สุดในการทำสิ่งนี้?
ฉันต้องการดึงข้อมูลบางอย่างจากฐานข้อมูล Oracle 11g รีลีส 1 และจัดให้เป็นไฟล์ CSV ตั้งแต่หนึ่งไฟล์ขึ้นไป ข้อมูลอยู่ในหลายตารางและ / หรือมุมมอง ทั้งหมดนี้ควรทำงานผ่านบรรทัดคำสั่ง อะไรจะเป็นวิธีที่ดีที่สุดในการทำสิ่งนี้?
คำตอบ:
อรุณ
ตอนนี้ sqlcl มีให้บริการจากOracle SQL Developer 4.1 EA2 (4.1.0.18.37) คุณสามารถใช้งานได้มากมายเช่น sqlplus เก่าและมีชื่อเสียง sqlcl มีการตั้งค่ารูปแบบเอาต์พุตสำหรับ csv
set sqlformat csv
spool x.csv
select * from yourtable[s];
spool off
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ sqlcl checkout Kris 'blog
ก่อน sqlcl เป็นเรื่องง่ายที่สุดสำหรับสิ่งนี้คือการใช้ APEX และส่งออกรายงานไปยัง csv ใน sqlplus เก่าธรรมดาคุณสามารถทำได้โดยใช้
set lines 9999 -- the appropriate size
set head off -- no header lines
set colsep ';' --column separator to ;
set pages 0 -- no pages
set feed off
select your data;
spool to_tofile
/
spool off
วิธีนี้ใช้ได้ผลดีที่สุดหากผลลัพธ์จะถูกเขียนลงบนแอพพลิเคชันเซิร์ฟเวอร์หรือไคลเอนต์ หากต้องเขียนบนเซิร์ฟเวอร์ฐานข้อมูล utl_file อาจเป็นตัวเลือกที่ดีกว่า
โรนัลด์
คุณควรดูแพ็คเกจUTL_FILEในตัว มีหลายวิธีที่คุณสามารถใช้ได้
คุณสามารถเขียนโพรซีเดอร์จำนวนเท่าใดก็ได้ในแพ็คเกจที่ใช้แพ็คเกจ UTL_FILE เพื่อเขียนไปยังไฟล์จำนวนเท่าใดก็ได้ สามารถเรียกขั้นตอนเหล่านี้ได้จากเกือบทุกแอปพลิเคชันรวมถึง SQL * Plus
คุณสามารถเขียนสคริปต์ PL / SQL เพื่อทำงานเดียวกันและเรียกใช้สคริปต์จากบรรทัดคำสั่ง SQL * Plus โดยระบุ @scriptname บนบรรทัดคำสั่ง
คุณสามารถวางบล็อกโดยใช้ UTL_FILE โดยตรงลงใน SQL * Plus แต่ควรใช้สำหรับการส่งออกเพียงครั้งเดียวเท่านั้นและแม้ว่ามันจะไม่ใช่เส้นทางที่ดีที่สุด
ในที่ง่ายส่งออกไฟล์ของตนโดยใช้ UTL_FILE จะประกอบด้วยการเรียกfopenหนึ่งหรือการโทรมากขึ้นเพื่อPUT_LINEและเรียกร้องให้fclose
หากประสิทธิภาพมีความกังวลคุณอาจต้องพิจารณาเครื่องมือจากผู้ขาย
ฉันได้ประเมินเครื่องมือจาก BMC, Wisdomforce, CoSort, DBCrane ทั้งหมดเร็วกว่า spool, utl_file หรือตารางภายนอก เรากำลังใช้DBCraneเพราะเจ้านายของฉันไม่ต้องการใช้จ่ายใบอนุญาตมากเกินไป
คุณสามารถใช้โมดูล Python และ cx_Oracle เพื่อดึงข้อมูลไปยังดิสก์ในรูปแบบ CSV
นี่คือวิธีที่คุณเชื่อมต่อกับ Oracle โดยใช้ cx_Oracle:
constr='scott/tiger@localhost:1521/ORCL12'
con = cx_Oracle.connect(constr)
cur = con.cursor()
หลังจากดึงข้อมูลคุณสามารถวนซ้ำรายการ Python และบันทึกข้อมูลในรูปแบบ CSV
for i, chunk in enumerate(chunks(cur)):
f_out.write('\n'.join([column_delimiter.join(row[0]) for row in chunk]))
f_out.write('\n')
ฉันใช้วิธีการนี้เมื่อฉันเขียนTableHunter-For-Oracle