วิธีการสร้างผลลัพธ์ sqlplus ปรากฏในหนึ่งบรรทัด?


46

ฉันมีตารางที่มี 100 คอลัมน์ เมื่อเลือกข้อมูลในSQL Pluswraps ผลลัพธ์ทำให้อ่านได้ยาก

สิ่งที่ฉันต้องการคือแถบเลื่อนแนวนอนที่จะปรากฏหรือส่งผลลัพธ์ไป less

ฉันเรียกใช้คำสั่งต่อไปนี้ใน SQLPlus -

SET LINESIZE 32000;
SET PAGESIZE 40000;
SET LONG 50000;
SPOOL output.txt
SELECT * FROM big_table;

จากนั้นในbashฉันวิ่ง -

output.txt น้อยลง

เอาต์พุตยังคงถูกห่อและไม่สามารถอ่านได้


1
ฉันต้องการให้คอลัมน์ขยายอัตโนมัติแทนที่จะต้องกำหนดขนาดคอลัมน์สำหรับแต่ละรายการด้วย
Kshitiz Sharma

คำตอบ:


57

มันไม่เพียงพอที่จะบังคับ sqlplus ไม่ให้ตัดเส้น นอกจากนี้ยังจำเป็นต้องบอกวิวเวอร์ว่าคุณใช้ดูไฟล์สปูลเพื่อไม่ให้ล้อมบรรทัด หากผู้ชมของคุณอยู่lessแล้ว-Sตัวเลือกที่คุณต้องใช้ตาม https://superuser.com/questions/272818/how-to-turn-off-word-wrap-in-less บน Unix / Linux คุณสามารถใช้head -1 output.txtเพื่อรับบรรทัดแรกของไฟล์และตรวจสอบว่าเป็นไปตามที่คาดไว้หรือคุณสามารถใช้od -c output.txt|head เพื่อดูว่าตัวแบ่งบรรทัดถูกวางไว้ที่ใดในไฟล์เอาต์พุตของคุณ

หากคุณแสดงคอลัมน์ยาวและค่าของพวกเขามีตัวแบ่งบรรทัดแล้วหลายบรรทัดจะถูกพิมพ์สำหรับค่าคอลัมน์เหล่านี้และคุณไม่สามารถลบล้างคอลัมน์นี้ด้วยการตั้งค่า sqlplus


คำสั่ง sqlplus ต่อไปนี้อาจมีประโยชน์:

  • SET LINESIZE linesizeความยาวของเส้น ในกรณีส่วนใหญ่ค่าสูงสุดสำหรับlinesizeคือ 32767 คุณสามารถค้นหาค่าสูงสุดของคุณหากคุณตั้งค่า LINESIZE เป็นค่าที่ไม่ถูกต้องและตรวจสอบข้อความแสดงข้อผิดพลาดดังนั้นSET LINESIZE 0อาจให้SP2-0267: linesize option 0 out of range (1 through 32767) (1)
  • SET TRIMSPOOL ON มิฉะนั้นทุกบรรทัดในสปูลไฟล์จะถูกเติมด้วยช่องว่างจนกว่าจะถึงเส้นตรง
  • SET TRIMOUT ON มิฉะนั้นทุกบรรทัดในเอาต์พุตจะเต็มไปด้วยช่องว่างจนกว่าจะถึงเส้นที่กำหนด
  • SET WRAP OFFตัดทอนบรรทัดหาก LINESIZE ยาวกว่า สิ่งนี้ไม่ควรเกิดขึ้นถ้าเส้นขนาดใหญ่พอ
  • SET TERMOUT OFFยับยั้งการพิมพ์ผลลัพธ์ไปยังเอาต์พุต บรรทัดยังคงถูกเขียนไปยังไฟล์สปูล สิ่งนี้อาจเร่งเวลา exectution ของคำสั่งมาก
  • SET PAGESIZE 0 เพื่อตั้งค่าขนาดหน้ากระดาษที่ไม่มีที่สิ้นสุดและหลีกเลี่ยงส่วนหัวหัวเรื่องและอื่น ๆ
  • มีSETพารามิเตอร์อื่น ๆ ที่เกี่ยวข้องกับผลลัพธ์ (NUMWIDTH, NUMFORMAT, LONG, COLSEP) และประสิทธิภาพ (ARRAYSIZE, LONGCHUNKSIZE)

คุณต้องใช้COLUMNคำสั่งเพื่อจัดรูปแบบแต่ละคอลัมน์

เช่นcolumn name format a30จะจัดรูปแบบคอลัมน์nameในผลลัพธ์ให้มีความยาวสูงสุด 30 อักขระ

หากคุณต้องการขนาดจอแสดงผลไม่แก้ไข แต่ควรเท่ากับขนาดของค่าจริงของคอลัมน์ในแถววิธีเดียวที่ฉันรู้คือคุณเปลี่ยนส่วนคำสั่งที่เลือกเพื่อให้ได้ผลลัพธ์ที่ต้องการและใช้ ตัวดำเนินการเรียงต่อสตริง||เช่น

select emp_id||' '||first_name||' '||last_name
from emp;

คำอธิบายแบบเต็มของตัวแปรทั้งหมดสามารถพบได้ในคู่มือการใช้ SQL * Plus และเอกสารอ้างอิง

หากคุณต้องการใช้การตั้งค่าบางอย่าง (หรือคำจำกัดความของคอลัมน์) คุณสามารถเก็บไว้ในไฟล์และเรียกใช้ไฟล์นี้เมื่อคุณต้องการอีกครั้ง คุณยังสามารถเรียกใช้ไฟล์นี้โดยอัตโนมัติหากคุณเริ่ม sqlplus

(1) "วิธีค้นหาค่าสูงสุดของ LINESIZE (ขึ้นอยู่กับระบบ) (Doc ID 1547262.1)"


LONGCHUNKSIZEไม่เพียงเกี่ยวกับประสิทธิภาพเท่านั้น แต่ดูเหมือนว่าจำเป็นที่จะต้องหลีกเลี่ยงการตัดบรรทัดที่ไม่พึงประสงค์นอกจากนี้ยังLINESIZEทำการทดลองสิ่งนี้ด้วยเอาต์พุตที่ใช้ไม่ได้จากDBMS_METADATA.get_ddl()
Daniel Vérité

2
คำตอบที่ดี ...
ypercubeᵀᴹ

2
สิ่งที่ @ YperSillyCubeᵀᴹพูด :)
Tom V

คุณควรใช้SET PAGESIZE 1000แทน 0มิฉะนั้นส่วนหัวคอลัมน์จะไม่พิมพ์เมื่อออก `เลือก" คำสั่ง. อ้างอิง .
ปิแอร์ C

@PierreC นั่นเป็นเหตุผลที่ฉันเขียน "SET PAGESIZE 0 เพื่อตั้งค่าขนาดหน้ากระดาษที่ไม่มีที่สิ้นสุดและหลีกเลี่ยงส่วนหัวหัวเรื่องและอื่น ๆ "
miracle173


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.