Выполнение команд 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".