Выполнение команд SQL изнутри bash

Может кто-нибудь дать мне пример того, как запустить SQL-запрос из скрипта bash. Я искал через переполнение стека, но не смог найти ответ, который работал для меня. Я сделал что-то подобное раньше, но для PSQL и это выглядело так:

psql -U userName -c "SELECT * FROM table;"

Ситуация такая: когда я нахожусь на моем сервере, мне нужно написать эти строки для выбора чего-либо из базы данных:

    su - oracle;
   //insert password for oracle user
    sqlplus /nolog;
    connect / as sysdba
    SELECT * FROM table;

Как это должно выглядеть внутри скрипта bash?

Спасибо!

3 ответа

Есть несколько разных способов сделать это. У всех есть любимые, но все они похожи в том, что они позволяют группировать команды SQL перед передачей в оболочку командной строки sqlplus. Все методы могут перехватывать ответ из sqlplus для записи в файл журнала, и большинство методов поддерживают подстановку переменных, хотя некоторые могут нарушить расширение параметров.

Лично я всегда предпочитал следующий метод, поскольку он позволяет мне быстро вносить изменения в операторы SQL и сохранять старые версии операторов в качестве комментариев. Я знаю, что это можно сделать в других примерах, но я просто лично предпочитаю этот метод:

 #!/bin/bash

 exec > >(tee logs/logfile.$$)
 exec 2>&

   {
     echo "TRUNCATE TABLE test_runs;"
     echo "INSERT INTO test_runs SELECT * FROM test_cases WHERE id = 6;"
#      echo "SELECT * FROM table1 where x = 1;"
      echo "SELECT * FROM table1 where x = 2;"
#      echo "UPDATE table2 SET status=$STATUS WHERE complete=1;"
      echo "exit;"
   } | sqlplus <connect string>

другие методы используют "здесь документы":

#!/bin/bash

sqlplus<< EOF вставить в таблицу (field1,field2,field3) значения ('a', 'b', 'c'); EOF

или используйте операторы SQL, хранящиеся в отдельных файлах:

#!/bin/bash
sqlplus <connect string> @query.sql

или воспользуйтесь преимуществами нативной функциональности sqlplus:

#!/bin/bash

sqlplus <connect string> -s 'SELECT parts FROM factory;' 
QUERY="SELECT parts FROM factory;"
sqlplus <connect string> -s $QUERY

Остерегайтесь использования переменной bash с последней версией, следующее может не дать ожидаемого результата:

#!/bin/bash
QUERY="select * from $TABLE1 WHERE url =\"Compu-Global-Hyper-Mega-Net.com\";"
sqlplus <connect string> -s $QUERY

РЕДАКТИРОВАТЬ:

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

#!bin/bash

{
  echo "SELECT 1 from dual;"
} | sqlplus username/password@SID1

мой старый скрипт, который подключается как sysdba:

#!/bin/ksh

get_asm() {
$ORACLE_HOME/bin/sqlplus -s /nolog <<EOF  
connect / as sysdba
col path format a35
col CREATE_DATE format a20
set lines 132
set trims on
set tab off
set pages 2000
select inst_id, DISK_NUMBER, header_status, 
       state,path,TOTAL_MB,FREE_MB,
       to_char(CREATE_DATE,'yyyy-mon-dd hh24:mi') CREATE_DATE 
from gv\$asm_disk;
EOF
}

ASMDISK=$1
if [ ${ASMDISK}"x" == "x" ]; then
    get_asm;
else
    get_asm | egrep "INST_ID|^--|${ASMDISK}"
fi

Вы можете отправить запрос на стандартный ввод sqlplus с помощью echo, например:

echo "SELECT * FROM table;" | sqlplus -s user/password@host/DB

! / Бен / Баш

...
MY_LOGIN="..."
MY_PASSWORD="..."
MY_SID="..."
sqlplus /nolog -s >file.log >error.log <<EOF
    CONNECT ${MY_LOGIN}/${MY_PASSWORD}@${MY_SID}
    ... your request ...
EOF
RET_CODE=$?
...

ВНИМАНИЕ, никогда не используйте этот синтаксис:

sqlplus login/password@sid ...

с его помощью любой, кто может использовать команду "ps", сможет увидеть всю вашу информацию о соединении. Всегда используйте "/nolog".

Другие вопросы по тегам