2009-10-28 4 views
39

Можно ли сделать что-то вроде этого?Заявление sqlplus из командной строки

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

Я знаю, что я могу поставить select 1 from dual в файл и сделать это:
$ sqlplus -s user/pass @myFile.sql

, но мне интересно, если это действительно необходимо создать файл только для удовлетворения sqlplus

+1

Возможный дубликат - http://stackoverflow.com/questions/638705/how-can-i-issue-a-single-command-from-the-command-line-through-sql-plus – vapcguy

ответ

45

Просто имейте в виду, что в Unix/Linux ваше имя пользователя/пароль можно увидеть любым, кто может запускать команду «ps -ef», если вы поместите ее непосредственно в командной строке. Может быть большой проблемой безопасности (или стать большой проблемой безопасности).

Обычно я рекомендую вам создать файл или использовать этот документ, чтобы вы могли защитить имя пользователя и пароль от просмотра командой «ps -ef» в Unix/Linux. Если имя пользователя/пароль содержится в файле сценария или файле sql, вы можете защитить его с помощью соответствующих прав доступа для пользователей/групп. После этого вы можете держать пользователя/пасс внутри файла, как это в сценарий оболочки:

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

не всегда верно, в зависимости от версии Oracle и ОС, но, вероятно, хороший стандарт для соответствия – dpbradley

+0

слишком плохой heredoc's нелегко в DOS http://stackoverflow.com/questions/1015163/heredoc- for-windows-batch – rogerdpack

+0

Что меня интересует, почему утечка в командной строке не просто решена в самой клиентской программе sql, так как это было бы довольно тривиально: в функции main() скопируйте командную строку в новую переменную и перезаписать старые args/argv [], и никакая командная строка не видна (или - просто на долю миллисекунды, возможно) - почему оракул не реализует это решение? –

6

Я предполагаю, что это * nix?

Используйте "документ здесь":

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

EDIT: Я попробовал ваш второй пример. Он работает, тоже (даже в Windows, без клещей):

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

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


$ 
24

Я в состоянии выполнить ваш точный запрос, только убедившись, что есть точка с запятой в конце моего оператора выбора. (Выход действителен, параметры связи удалены.)

echo "select 1 from dual;" | SQLPLUS -s имя пользователя/пароль @ хост: 1521/услуги

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

Не то, что это должно иметь значение, но SQLPLUS работает на Mac OS X Snow Leopard и сервер Oracle 11g.

+0

+1, но имейте в виду, что если вы делаете что-то умеренно сложное в SQL * Plus, вы обычно делаете несколько директив SET, и это будет беспорядочно, если вы хотите иметь однострочную команду. – dpbradley

+0

+1 Это полезный однострочный для быстрого запуска простых запросов. –

+0

+1 Наконец, ответ! Добавление точки с запятой в конец запроса! Вы действительно можете запустить sqlplus, войти в систему, а затем запустить команды - вам не нужно подключаться к учетным данным. Моя проблема заключалась в том, что команды не выполнялись - номера строк просто увеличивались! Теперь я знаю, как заставить их работать - просто добавьте полуточку! Благодаря! – vapcguy

20

Моя версия

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


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

EDIT:

Для многострочных вы можете использовать этот

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


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


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

Я * действительно * как этот, но он не работает в tcsh – dldnh

Смежные вопросы