เรียกใช้สคริปต์ Oracle SQL และออกจาก sqlplus.exe ผ่านทางพรอมต์คำสั่ง


114

ฉันต้องการเรียกใช้สคริปต์ Oracle ผ่าน SQL Plus ผ่านทางพรอมต์คำสั่ง Windows สคริปต์ไม่มีคำสั่ง "exit" แต่ฉันยังต้องการให้ SQL Plus ออกจากนั้นคืนค่าการควบคุมกลับไปที่พรอมต์คำสั่งเมื่อสคริปต์เสร็จสมบูรณ์ เป้าหมายของฉันคือทำสิ่งนี้โดยไม่ต้องแก้ไขสคริปต์ เป็นไปได้ไหม


คุณกำลังดำเนินการนี้ด้วย "sqlplus .... <scriptname" หรือ "sqlplus ... @scriptname" หรือไม่ ฉันพบพฤติกรรมที่แตกต่างกันไปขึ้นอยู่กับว่าคุณทำอะไรใน Unix
runrig

คำตอบ:


140

อีกวิธีหนึ่งคือใช้คำสั่งนี้ในแบตช์ไฟล์:

echo exit | sqlplus user/pass@connect @scriptname

1
เย็น! คุณรู้วิธีการที่ "ทางออก" ถูกผนวกเข้ากับเซสชัน sqlplus ได้อย่างไร

6
คำสั่ง sqlplus รันสคริปต์จากนั้นพยายามอ่านคำสั่งเพิ่มเติมจากอินพุตมาตรฐาน ด้วยไพพ์ไลน์นี้การอ่านจากอินพุตมาตรฐานจะอ่านสตริง "exit" จากคำสั่ง echo ทำให้ sqlplus ออก
Dave Costa

ยอดเยี่ยม - นี่คือสิ่งที่ฉันกำลังมองหา ขอบคุณ!
JoshL

4
ระวังว่าคุณเปิดเผยรหัสผ่านชื่อผู้ใช้ของคุณผ่านรายการการประมวลผลในยูนิกซ์ (PS -ef) แต่ฉันเกือบแน่ใจว่ามันทำงานได้เหมือนกันบน Windows
Robert Merkwürdigeliebe

3
stackoverflow.com/questions/1639704/ …และdba.stackexchange.com/a/65064/16892อธิบายวิธีการบางอย่างที่ไม่จำเป็นต้องใช้รหัสผ่านในบรรทัดคำสั่ง ...
rogerdpack

13

ฉันพบว่านี่เป็นทางออกที่ดีที่สุดและใช้งานได้ในเทอร์มินัลหรือภายในสคริปต์:

echo @scriptname | sqlplus username/password@connect

1
แม้ว่าวิธีการนี้อาจตอบคำถามทางเทคนิค แต่เป็นคำตอบที่ซ้ำกันของคำตอบอื่น ๆ และเพิ่มมูลค่าเล็กน้อย นอกจากนี้ยังจะช่วยผู้อื่นหากคุณอธิบายว่าคำสั่งเหล่านี้กำลังทำอะไรอยู่ ขอขอบคุณ!
Chris S

5
สิ่งนี้ใช้ได้กับฉันและฉันคิดว่ามันดีกว่าคำตอบยอดนิยมเพราะหลีกเลี่ยง 'ทางออก'
Bogdan Calmac

12

เมื่อตระหนักแล้วว่าปัญหาของคุณอาจอยู่ที่ไฟล์ sql นั้นเองให้ตระหนักว่า sqlplus จำเป็นต้องได้รับการบอกให้ออก วิธีที่ฉันทำคือ:

เลือก * จากคู่

เลิก;
/

(เครื่องหมายทับมีความสำคัญโดยจะบอก sqlplus ให้เรียกใช้งาน statemet ด้านบน)


โปรดทราบว่าคำตอบของ Dave Costa ก็ทำงานเช่นกัน: piping exit (หรือ exit) ในคำสั่ง sqlplus

ขอบคุณสำหรับ / เคล็ดลับฉันกำลังมองหาข้อมูลนี้!

2
เครื่องหมายทับหมายถึงการดำเนินการสิ่งที่อยู่ในบัฟเฟอร์ SQL มันไม่ได้ดำเนินการหลายคำสั่งและไม่จำเป็นต้องดำเนินการคำสั่งควบคุม SQLPlus เช่น "ออกจาก" หากคุณพิมพ์ "ออกจาก" <Enter> ที่พรอมต์ SQLPlus แบบโต้ตอบมันจะออกทันที
เดฟคอสตา

12

วิธีที่ดีที่สุดในการซ่อนข้อมูลผู้ใช้และการออกคือ:

exit | sqlplus -S user/pwd@server @script.sql

exitถูกส่งไปยังเอาต์พุตของ sqlplus บังคับให้เลิก -Sแทนที่เซิร์ฟเวอร์ทั้งหมดอื่น ๆ แล้วแบบสอบถาม sql ในสคริปต์


2
ถ้าใช้ ssh คือทำเลิก | แทนที่จะออก | เพื่อที่จะไม่ปิดเซสชัน ssh ของคุณหากไฟล์ถูกแก้ไขในภายหลังเพื่อออกหรือออกจากมัน ใช้งานได้หากไม่พบไฟล์ด้วย
Karl Henselin

6

คุณสามารถทำสิ่งนี้ได้ในเชลล์สคริปต์

sqlplus /nolog <<EOF
connect user/pass
@run_some_file.sql
select * from dual;
EOF

คุณอาจต้องหลบหนีจาก ";" กับ \.


3

ใช่เป็นไปได้ - สร้างสคริปต์ตัวตัดคำที่ตั้งค่า SQLPlus อย่างเหมาะสมรวมถึงสคริปต์ของคุณ (เช่น. @YourTargetScript.sql) แล้วออกจากการทำงาน

ที่กล่าวว่าฉันไม่แนะนำวิธีการนี้เลย - SQLPlus มี gotchas มากมายสำหรับการใช้แบบเป็นโปรแกรม เมื่อเขียนเชลล์สคริปต์ในอดีตที่ใช้ Oracle ฉันสร้าง Python wrapper รอบ ๆ มัน (เพิ่มพฤติกรรมการจัดการข้อผิดพลาดที่สมเหตุสมผลมากขึ้นการแยก sane ของเอาต์พุตระหว่าง stdout / stderr สนับสนุนเอาต์พุต CSV ดั้งเดิมและสินค้าอื่น ๆ ) และทำงานได้ ดีกว่ามาก


ฉันจะเห็นด้วยกับโปรแกรมอื่นใด แต่ฉันพบว่า SQLPlus ให้บริบทที่เป็นประโยชน์แก่ฉันในการค้นหาที่ไม่ดีซึ่งสภาพแวดล้อมอื่น (ในกรณีของฉัน Perl / DBI / DBD :: Oracle) ไม่ได้ หากคุณจัดการกับข้อผิดพลาดอย่างระมัดระวังนั่นอาจคุ้มค่ากับความเจ็บปวด

นอกจากนี้ยังขึ้นอยู่กับว่าคุณมีการควบคุมผ่านเซิร์ฟเวอร์มากแค่ไหนคุณอาจจะหรืออาจไม่สามารถคาดเดาสิ่งที่มีประโยชน์ได้มากกว่านั้นจากนั้นเชลล์และ SQLPlus ร้านค้า stogier unix จำนวนมากที่ใช้ Solaris, HP / UX, AIX และอื่น ๆ ใช้การติดตั้งที่เปลือยเปล่ามากและจะไม่อนุญาตให้คุณติดตั้งสิ่งอื่นใดในกล่อง โปรดทราบว่าบางครั้งการแก้ไขปัญหานี้เพียงเพื่อรวมล่ามน้อยที่สุดกับแอปพลิเคชันของคุณ
เกี่ยวข้องกับ OfTunbridgeWells

3

แบบนี้:

sqlplus / nolog ชื่อผู้ใช้ / รหัสผ่าน @ tnsname @filename

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

แก้ไข: ฉันไม่ดีลองอีกครั้งด้วย / nolog flag


น่าเสียดายที่มันใช้ไม่ได้ เมื่อฉันเรียกใช้งานไฟล์แบตช์ SqlPlus จะรอที่พรอมต์ SQL> เพื่อป้อนข้อมูลผู้ใช้แทนที่จะกลับไปควบคุมพรอมต์คำสั่ง
JoshL

ขออภัยนี่ไม่ได้ผลเช่นกัน / nolog อนุญาตให้ sqlplus เริ่มโดยไม่ต้องเข้าสู่ระบบ มันไม่มีอะไรเกี่ยวข้องกับการออกจากสคริปต์เมื่อมันเสร็จสมบูรณ์
JoshL

อืมฉันเริ่มสงสัยเกี่ยวกับความแตกต่างของสภาพแวดล้อม ฉันมีสคริปต์ค้างคาวจำนวนมากที่ใช้ sqlplus ด้วยวิธีนี้

คริสคุณช่วยยกตัวอย่างการทำงานได้ไหม แค่บางอย่างที่ใช้ "select * from dual" หรืออะไรบางอย่าง ... ฉันได้สร้างตัวอย่างเพื่อลองใช้ข้อเสนอแนะของคุณ จำไว้ว่าสิ่งนี้อยู่บน Windows
JoshL

Josh ดูคำตอบใหม่ด้านล่าง

1

สำหรับผู้ที่กังวลเกี่ยวกับความปลอดภัยในการรวมรหัสผ่านของคุณในสคริปต์ AskTom มีบทความเกี่ยวกับ "ระบุจากภายนอก" http: //asktom.oracle.com/pls/apex/f? p = 100: 11: 0 :::: P11_QUESTION_ID: 142212348066


2
ในขณะที่สิ่งนี้อาจตอบคำถามในทางทฤษฎีมันก็ควรที่จะรวมส่วนที่สำคัญของคำตอบที่นี่และให้ลิงค์สำหรับการอ้างอิง
Scott Pack

0

ในสคริปต์ SQL ของคุณเพิ่ม EXIT นี่คือตัวอย่างไฟล์ test.bat ของฉันมีดังต่อไปนี้:

ผู้ใช้ sqlplus / pwd @ server @ test.SQL> myLOG.LOG

ไฟล์ test.sql ของฉันมีดังต่อไปนี้: select * from dual; ทางออก


ไม่เป็นไร แต่ไม่เป็นไปตามข้อกำหนดของการทำเช่นนี้โดยไม่ต้องแก้ไขสคริปต์เพื่อรวมคำสั่ง exit / exit จุดประสงค์คือสคริปต์เหล่านี้สามารถเรียกใช้โดย DBA จาก SQL Plus แต่ยังสามารถเรียกใช้จากชุดไฟล์
JoshL

0

ทางออก | SQLPLUS / @ @

นี่เป็นทางออกที่ถูกต้องฉันลองใช้งานได้แล้ว

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