2009-10-28 18 views
39

Czy można coś takiego zrobić?Instrukcja sqlplus z linii poleceń

$ sqlplus -s user/pass "select 1 from dual" lub
$ echo "select 1 from dual" | sqlplus -s user/pass

wiem, że mogę umieścić select 1 from dual w pliku i zrobić to:
$ sqlplus -s user/pass @myFile.sql

ale zastanawiam się, czy jest to rzeczywiście konieczne, aby utworzyć plik tylko do zaspokojenia sqlplus

+1

Prawdopodobny duplikat - http://stackoverflow.com/questions/638705/how-can-i-issue-a-single-command-z-and-and-and-through-sql-plus – vapcguy

Odpowiedz

45

Pamiętaj, że w systemie Unix/Linux Twoja nazwa użytkownika/hasło może być widoczne dla każdego, kto może uruchomić polecenie "ps -ef", jeśli umieścisz je bezpośrednio w wierszu poleceń. Może to być duży problem z bezpieczeństwem (lub zmienić się w duży problem bezpieczeństwa).

Zwykle zaleca się utworzenie pliku lub użycie tutaj dokumentu, aby można było chronić nazwę użytkownika/hasło przed wyświetleniem za pomocą polecenia "ps -ef" w systemie Unix/Linux. Jeśli nazwa użytkownika/hasło jest zawarte w pliku skryptowym lub pliku sql, można zabezpieczyć przy użyciu odpowiednich uprawnień odczytu dla użytkownika/grupy. Następnie można przechowywać użytkownika/hasło w pliku jak to w skrypcie powłoki:

sqlplus -s /nolog <<EOF 
connect user/pass 
select blah; 
quit 
EOF 
+0

nie zawsze jest prawdziwe, w zależności od wersji Oracle i systemu operacyjnego, ale prawdopodobnie dobry standard do naśladowania – dpbradley

+0

zbyt złe heredoc nie są łatwe w DOS http://stackoverflow.com/questions/1015163/heredoc- for-windows-batch – rogerdpack

+0

Co mnie zastanawia, dlaczego przecinek linii poleceń nie jest po prostu naniesiony w samym programie klienta sql, ponieważ byłoby to dość trywialne: w funkcji main() skopiuj argines linii poleceń do nowej zmiennej, i nadpisują stare argumenty/argv [], a wiersz poleceń nie jest widoczny (lub - prawdopodobnie przez ułamek sekundy) - dlaczego firma Oracle nie wdraża tego rozwiązania? –

6

Zakładam, że to * nix?

Use "tutaj Dokument":

sqlplus -s user/pass <<+EOF 
select 1 from dual; 
+EOF 

EDIT: należy Próbowałem swój drugi przykład. To działa również (nawet w systemie Windows, sans kleszcze):

$ echo 'select 1 from dual;'|sqlplus -s user/pw 

     1 
---------- 
     1 


$ 
24

jestem w stanie wykonać dokładną kwerendę po prostu upewniając się, że jest średnik na końcu mojego select. (Dane wyjściowe są aktualne, usunięto paralele połączeń.)

echo "wybierz 1 z podwójnego"; | SQLPLUS -s login/hasło @ host: 1521/usługa

  1 
---------- 
     1 

Nie to powinno mieć znaczenia, ale SQLPLUS działa na Mac OS X Snow Leopard, a serwer jest Oracle 11g.

+0

+1, ale należy pamiętać, że jeśli robisz coś umiarkowanie skomplikowanego w SQL * Plus zazwyczaj będziesz robił kilka dyrektyw SET, a to będzie kłopotliwe, jeśli szukasz komendy jednolinijkowej. – dpbradley

+0

+1 Jest to przydatna jednolinijka do szybkiego uruchamiania prostych zapytań. –

+0

+1 Wreszcie odpowiedź! Dodanie średnika do końca zapytania! W rzeczywistości można uruchomić program sqlplus, zalogować się, a następnie uruchomić komendy - nie trzeba potępiać poświadczeń. Mój problem polegał na tym, że polecenia nie działały - numery linii po prostu rosły! Teraz wiem, jak je uruchomić - po prostu dodaj średnik! Dzięki! – vapcguy

20

moja wersja

$ sqlplus -s username/[email protected]:port/service <<< "select 1 from dual;" 


     1 
---------- 
     1 

EDIT:

Dla multilinii można używać tej

$ echo -e "select 1 from dual; \n select 2 from dual;" | sqlplus -s username/[email protected]:port/service 


     1 
---------- 
     1 


     2 
---------- 
     2 
+0

Ja * naprawdę * lubię ten, ale nie działa w tcsh – dldnh