Chạy tập lệnh SQL SQL và thoát khỏi sqlplus.exe thông qua dấu nhắc lệnh


114

Tôi muốn chạy tập lệnh Oracle thông qua SQL Plus thông qua dấu nhắc lệnh của Windows. Tập lệnh không chứa lệnh "exit", nhưng tôi vẫn muốn SQL Plus thoát, trả lại quyền điều khiển cho dấu nhắc lệnh khi hoàn thành tập lệnh. Mục tiêu của tôi là làm điều này mà không sửa đổi kịch bản. Điều này có thể không?


Bạn đang thực hiện điều này với "sqlplus .... <scriptname" hay "sqlplus ... @scriptname" ?? Tôi tìm thấy các hành vi khác nhau tùy thuộc vào hành vi nào bạn thực hiện trên Unix.
runrig

Câu trả lời:


140

Một cách khác là sử dụng lệnh này trong tệp bó:

echo exit | sqlplus user/pass@connect @scriptname

1
Mát mẻ! Bạn có biết làm thế nào "lối ra" được thêm vào phiên sqlplus không?

6
Lệnh sqlplus chạy tập lệnh sau đó cố gắng đọc thêm các lệnh từ đầu vào tiêu chuẩn. Với đường ống này, việc đọc từ đầu vào tiêu chuẩn sẽ đọc chuỗi "thoát" từ lệnh echo, khiến sqlplus thoát ra.
Dave Costa

Tuyệt vời - đây chính xác là những gì tôi đang tìm kiếm. Cảm ơn!
JoshL

4
Coi chừng bạn tiết lộ mật khẩu tên người dùng của mình thông qua danh sách proces trên unix (ps -ef) nhưng tôi gần như chắc chắn rằng nó hoạt động theo cách tương tự trên windows
Robert Merkwürdigeliebe

3
stackoverflow.com/questions/1639704/...dba.stackexchange.com/a/65064/16892 mô tả một số cách để không phải sử dụng mật khẩu trên dòng lệnh ...
rogerdpack

13

Tôi thấy đây là giải pháp tốt nhất và nó hoạt động trong một thiết bị đầu cuối hoặc trong một tập lệnh:

echo @scriptname | sqlplus username/password@connect

1
Mặc dù điều này về mặt kỹ thuật có thể trả lời Câu hỏi, nhưng về cơ bản nó là một bản sao của các Câu trả lời khác và thêm ít giá trị. Ngoài ra, nó sẽ giúp người khác nếu bạn giải thích những gì các lệnh này đang làm. Cảm ơn bạn!
Chris S

5
Điều này làm việc cho tôi và tôi thấy nó thanh lịch hơn câu trả lời hàng đầu vì nó tránh được 'lối ra'.
Bogdan Calmac

12

Bây giờ nhận ra rằng vấn đề của bạn có thể là với chính tệp sql, nhận ra rằng sqlplus cần phải được thông báo để thoát. Cách tôi làm điều này là:

chọn * từ kép;

bỏ việc;
/

(Dấu gạch chéo rất quan trọng. Nó báo cho sqlplus thực thi stHRet (s) phía trên nó.)


Lưu ý rằng câu trả lời của Dave Costa cũng hoạt động: thoát khỏi đường ống (hoặc thoát) vào lệnh sqlplus.

Cảm ơn vì / mẹo, tôi đã tìm kiếm thông tin này!

2
Dấu gạch chéo có nghĩa là thực thi những gì trong bộ đệm SQL. Nó không thực thi nhiều câu lệnh và không cần thiết phải thực thi các lệnh điều khiển SQLPlus như "thoát". Nếu bạn gõ "thoát" <Enter> tại dấu nhắc SQLPlus tương tác, nó sẽ thoát ngay lập tức.
Dave Costa

12

Cách tốt nhất để ẩn thông tin người dùng và lối thoát là:

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

exitđược cung cấp cho đầu ra của sqlplus buộc nó phải thoát. -Sthay thế tất cả các đầu ra máy chủ khác truy vấn sql sau đó trong tập lệnh.


2
Nếu sử dụng ssh là để thoát | thay vì thoát | để nó không đóng phiên ssh của bạn nếu tệp được chỉnh sửa sau đó để thoát hoặc thoát trong đó. Điều này hoạt động nếu tập tin không được tìm thấy quá.
Karl Henselin

6

Bạn cũng có thể làm điều này trong kịch bản shell của bạn.

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

Bạn có thể cần phải thoát ";" với một \.


3

Có, điều đó là có thể - tạo một tập lệnh bao bọc thiết lập SQLPlus một cách thích hợp, bao gồm tập lệnh của bạn (tức là @YourTargetScript.sql), và sau đó thực hiện một lối thoát.

Điều đó nói rằng, tôi hoàn toàn không khuyến nghị cách tiếp cận này - SQLPlus có rất nhiều vấn đề tuyệt vời để sử dụng theo chương trình; Khi viết các kịch bản shell trong quá khứ đã sử dụng Oracle, tôi đã xây dựng một trình bao bọc Python xung quanh nó (thêm hành vi xử lý lỗi hợp lý hơn, tách biệt đầu ra giữa stdout / stderr, hỗ trợ đầu ra CSV gốc và các tính năng khác như vậy) và nó đã hoạt động tốt hơn nhiều.


Với bất kỳ chương trình nào khác, tôi sẽ đồng ý với bạn. NHƯNG tôi thấy rằng SQLPlus đã cho tôi bối cảnh hữu ích trên một truy vấn xấu mà các môi trường khác (trong trường hợp của tôi là Perl / DBI / DBD :: Oracle) thì không. Nếu bạn đang xử lý lỗi cẩn thận, điều đó có thể đáng giá.

Ngoài ra, tùy thuộc vào mức độ kiểm soát của bạn đối với máy chủ, bạn có thể hoặc không thể thừa nhận bất kỳ điều gì khác ngoài shell và SQLPlus. Rất nhiều cửa hàng unixier unix chạy Solaris, HP / UX, AIX và tương tự sử dụng các cài đặt rất trần và sẽ không cho phép bạn cài đặt bất cứ thứ gì khác trên hộp. Lưu ý rằng đôi khi một cách giải quyết cho vấn đề này chỉ là gói một trình thông dịch tối thiểu với ứng dụng của bạn.
Mối quan tâmOfTunbridgeWells

3

Như thế này:

sqlplus / nolog userid / password @ tnsname @filename

Nếu bạn đặt tệp này trong một tệp bó, điều khiển sẽ tiếp tục với (các) câu lệnh theo sau nó.

EDIT: xấu của tôi, thử lại với / nolog flag


Thật không may, điều này không hoạt động. Khi tôi thực thi tệp bó, SqlPlus chờ tại dấu nhắc SQL> cho đầu vào của người dùng thay vì trả lại quyền điều khiển cho dấu nhắc lệnh.
JoshL

Xin lỗi, điều này cũng không hoạt động. / nolog cho phép sqlplus bắt đầu mà không cần đăng nhập. Nó không có gì để làm với việc thoát khỏi một kịch bản khi nó hoàn thành.
JoshL

Hmm, tôi bắt đầu tự hỏi về sự khác biệt môi trường. Tôi có nhiều tập lệnh bat sử dụng sqlplus theo cách này.

Chris, bạn có thể cung cấp một ví dụ làm việc? Chỉ cần một cái gì đó đơn giản chạy "chọn * từ kép" hoặc một cái gì đó ... Tôi đã tạo các ví dụ để thử các đề xuất của bạn, nhưng không có kết quả. Hãy nhớ rằng đây là trên Windows.
JoshL

Josh, xem câu trả lời mới dưới đây.

1

Đối với những người lo lắng về tính bảo mật của việc bao gồm mật khẩu của bạn trong tập lệnh, AskTom có ​​một bài viết về "được xác định bên ngoài" http: //asktom.oracle.com/pls/apex/f? P = 100: 11: 0 :::: P11_QUESTION_ID: 142212348066


2
Trong khi về mặt lý thuyết có thể trả lời câu hỏi, tốt hơn là nên bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo.
Scott Pack

0

Trong tập lệnh SQL của bạn thêm EXIT. Dưới đây là ví dụ về tệp test.bat của tôi như sau:

người dùng sqlplus / pwd @ server @ test.SQL> myLOG.LOG

tập tin test.sql của tôi có sau: select * từ dual; lối ra


Điều đó tốt, nhưng không đáp ứng yêu cầu thực hiện việc này mà không sửa đổi tập lệnh để bao gồm câu lệnh thoát / thoát. Mục đích là các tập lệnh này có thể được chạy bởi một DBA từ SQL Plus, nhưng cũng có thể được chạy từ một tệp bó.
JoshL

0

thoát | SQLPLUS / @ @

Đây là giải pháp chính xác, tôi đã thử nó hoạt động

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.