Oracle SQL betiğini çalıştırın ve komut istemi ile sqlplus.exe'den çıkın


114

Bir Oracle komut dosyasını bir Windows komut istemi ile SQL Plus üzerinden çalıştırmak istiyorum. Komut dosyası bir "exit" komutu içermiyor, ancak komut dosyası tamamlandığında denetimi komut istemine döndürerek hala SQL Plus'ın çıkmasını istiyorum. Amacım bu yapmaktır olmadan senaryoyu değiştirerek. Mümkün mü?


Bunu "sqlplus .... <scriptname" veya "sqlplus ... @scriptname" ile mi yürütüyorsunuz? Unix'te hangisine yaptığınıza bağlı olarak farklı davranışlar buluyorum.
runrig

Yanıtlar:


140

Başka bir yol bu komutu toplu iş dosyasında kullanmaktır:

echo exit | sqlplus user/pass@connect @scriptname

1
Güzel! sqlplus oturumuna "exit" ifadesinin nasıl eklendiğini biliyor musunuz?

6
Sqlplus komutu betiği çalıştırır ve daha sonra standart girdiden daha fazla komut okumayı dener. Bu boru hattında, standart girdiden okunan değer, echo komutundan "exit" dizesini okuyacak ve sqlplus'ın çıkmasına neden olacaktır.
Dave Costa

Mükemmel - aradığım şey buydu. Teşekkürler!
JoshL

4
Kullanıcı adı şifrenizi unix (ps -ef) içindeki süreçler listesinde gösterdiğinize dikkat edin ancak pencerelerde aynı şekilde çalıştığından neredeyse eminim
Robert Merkwürdigeliebe 09.03

3
stackoverflow.com/questions/1639704/… ve dba.stackexchange.com/a/65064/16892 , komut satırında parola kullanmamanın bazı yollarını
açıklıyor

13

Bunu en iyi çözüm olarak buldum ve bir terminalde veya bir komut dosyasında çalışıyor:

echo @scriptname | sqlplus username/password@connect

1
Bu soruya teknik olarak cevap verebilse de, esasen diğer cevapların bir kopyası ve çok az değer katıyor. Ayrıca, bu komutların ne yaptığını açıklarsanız başkalarına yardımcı olur. Teşekkür ederim!
Chris S

5
Bu benim için çalıştı ve ben 'çıkış' önler çünkü ben en iyi cevaptan daha şık buluyorum.
Bogdan Calmac

12

Şimdi probleminizin sql dosyasının kendisinde olabileceğinin farkına varmak, sqlplus'ın çıkması gerektiğini söylemelisiniz. Bunu yapma şeklim:

çift ​​arasından * seçin;

bırakmak, vazgeçmek;
/

(Eğik çizgi önemlidir. Sqlplus'a, üstündeki statemet (ler) i çalıştırmasını söyler.)


Dave Costa'nın cevabının da işe yaradığını unutmayın: sqlplus komutuna çıkış (veya bırakma).

/ Numara için teşekkürler, bu bilgiyi arıyordum!

2
Eğik çizgi, SQL arabelleğinde bulunanları çalıştırmak anlamına gelir. Birden fazla ifadeyi çalıştırmaz ve "quit" gibi SQLPlus kontrol komutlarını çalıştırmak gerekli değildir. Etkileşimli bir SQLPlus isteminde "quit" <Enter> yazarsanız, hemen çıkar.
Dave Costa

12

Kullanıcı bilgilerini ve çıkışları gizlemenin en iyi yolu:

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

exitsqlplus'ın çıkmasını sağlamak için çıkışa verilir. -Skomut dosyasındaki sql sorgusu dışındaki tüm sunucu çıktısını değiştirir.


2
Eğer ssh kullanıyorsanız | çıkış yerine | Böylece, dosya daha sonra çıkılacak veya çıkacak şekilde düzenlenmişse, ssh oturumunuzu kapatmaz. Bu, dosya da bulunmazsa çalışır.
Karl Henselin

6

Bunu kabuk betiğinizde de yapabilirsiniz.

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

";" Dan kaçmanız gerekebilir Birlikte \.


3

Evet, mümkün - SQLPlus'ı uygun şekilde ayarlayan, komut dosyanızı içeren (yani. @YourTargetScript.sql) Bir sarmalayıcı komut dosyası oluşturun ve sonra bir çıkış yapar.

Bununla birlikte, bu yaklaşımı hiç önermiyorum - SQLPlus'ın programlı kullanım için çok fazla faydası var; Geçmişte Oracle kullanan kabuk komut dosyaları yazarken, etrafına bir Python sarmalayıcı oluşturdum (daha makul hata işleme davranışı ekleyerek, stdout / stderr, yerel CSV çıktı desteği ve diğer benzeri nesneler arasında çıktı ayrımı) ve bu işe yaradı. çok daha iyi.


Başka bir programla seninle aynı fikirdeyim. AMA SQLPlus'ın bana diğer ortamların (benim durumumda Perl / DBI / DBD :: Oracle) yapmadığı kötü bir sorguda faydalı bir bağlam verdiğini buldum. Dikkatli hata işlemesi yapıyorsanız, bu acıya değebilir.

Ayrıca, sunucu üzerinde ne kadar denetime sahip olduğunuza bağlı olarak, shell ve SQLPlus'tan daha fazla bir şey bulunduğunu varsayabilir veya kabul edemeyebilirsiniz. Solaris, HP / UX, AIX ve benzeri çalışan birçok stoğu olmayan unix mağazası çok çıplak kurulumlar kullanıyor ve kutuya başka bir şey yüklemenize izin vermiyor. Bazen bunun geçici bir çözümünün yalnızca uygulamanızla minimal bir tercüman donatmak olduğunu unutmayın.
ConcernedOfTunbridgeWells

3

Bunun gibi, böyle:

sqlplus / nolog userid / password @ tnsname @dosyaadı

Bunu bir toplu iş dosyasına koyarsanız, kontrol izleyen ifadelerle devam edecektir.

EDIT: Benim kötü, tekrar deneyin / nolog flag


Ne yazık ki, bu işe yaramıyor. Toplu iş dosyasını yürüttüğümde SqlPlus, denetimi komut istemine döndürmek yerine kullanıcı girişi için SQL> isteminde bekler.
JoshL

Üzgünüz, bu da işe yaramıyor. / nolog, sqlplus'ın oturum açmadan başlamasını sağlar. Tamamlandığında bir betik çıkma ile ilgisi yoktur.
JoshL

Hmm, çevre farklılıklarını merak etmeye başladım. Bu şekilde sqlplus kullanan çok sayıda yarasa komut dosyası var.

Chris, çalışan bir örnek verebilir misin? Sadece "dual * 'den * seçimini" yapan basit bir şey ya da bir şey ... Önerilerinizi denemek için boşuna bir örnek verdim. Bunun Windows’ta olduğunu unutmayın.
JoshL,

Josh, aşağıdaki yeni cevaba bakınız.


0

SQL Komut Dosyanıza EXIT ekleyin. İşte benim test.bat dosyamın örneği:

sqlplus kullanıcısı / pwd @ server @ test.SQL> myLOG.LOG

benim test.sql dosyamda şunlar bulunur: dual * 'ı seçin; çıkış


Sorun değil, ancak betiği exit / quit ifadesi içerecek şekilde değiştirmeden bunu yapma gereksinimini karşılamıyor. Amaç, bu komut dosyalarının SQL Plus'tan bir DBA tarafından çalıştırılabilmesi, ancak bir toplu iş dosyasından da çalıştırılabilmesidir.
JoshL

0

çıkmak | SQLPLUS / @ @

Bu doğru çözüm, çalışmayı denedim

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.