2016-09-22 4 views
0

У меня проблема с написанием сценария bash.Получить выход из запроса sqlplus в сценарии bash

Я пытаюсь получить вывод из запроса sqlplus переменной bash. Я пробовал много способов, как это было предложено на многих форумах.

t=$(./bin/sqlplus 'oracleuser/[email protected](DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(Host=192.168.1.2)(Port=1521))(CONNECT_DATA=(SID=connectstring)))' << END 
SELECT (1 - (Sum(getmisses)/(Sum(gets) + Sum(getmisses)))) * 100 FROM V\$rowcache; 
exit; 
END 
) 

echo $t 

Это то, что я пытаюсь сделать точно. В приведенном выше примере я создаю строку

'oracleuser/[email protected](DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(Host=192.168.1.2)(Port=1521))(CONNECT_DATA=(SID=connectstring)))' 

динамически. Эта часть работает хорошо, Проблема возникает, когда я передаю команду

SELECT (1 - (Sum(getmisses)/(Sum(gets) + Sum(getmisses)))) * 100 FROM V\$rowcache; 

в запросе sqlplus. Здесь происходит то, что происходит: символ $ получает escape-код, но символ * вызывает проблемы (например, в sqlprompt перечисляет все файлы в каталоге, из которого он выполняется!) При выполнении команды в целом.

Я закодирован как это: -

connect="'oracleuser/[email protected](DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(Host=192.168.1.2)(Port=1521))(CONNECT_DATA=(SID=connectstring)))'" 

arr[1]="SELECT (1 - (Sum(getmisses)/(Sum(gets) + Sum(getmisses)))) * 100 FROM V\$rowcache;" 

exp=$(./bin/sqlplus $mconnect << END 
printf "${arr[1]}"; 
exit; 
END 
) 

echo $exp 

при запуске скрипта, он успешно входит в Sqlplus, но при выполнении команды SELECT, * вызывает проблемы, но если я вхожу команды вручную он работает.

Существует ли лучший способ? Я не Баш выродок :(.

мне нужна реальная помощь!

Спасибо, что нашли время, чтобы посмотреть на мой вопрос.

С наилучшими пожеланиями, Bhuvanesh

ответ

0

Как о запуске запрос в виде отдельного файла query1.sql?

Кроме того, если вам нужен только результат (в данном случае, (1 - (сумма (getmisses)/(сумма (получает) + сумма (getmisses)))) * 100) и нет информации о заголовке, используйте sqlplus -S.

sqlplus -h 

-S Устанавливает беззвучный режим, который подавляет отображение SQL * Plus баннер, подсказки и вторя из команд.

bash.sh:

#/bin/bash 
    connect="'oracleuser/[email protected](DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(Host=192.168.1.2)(Port=1521))(CONNECT_DATA=(SID=connectstring)))'" 

    exp=$(./bin/sqlplus -S $connect << END 
    @query1.sql 
    END 
    ) 

echo $exp 

query1.sql:

SET HEAD OFF 
SELECT count(*) from all_users; 
exit 

Затем запустите пример ..

./bash.sh 
36 
+0

Привет, спасибо за ответ. Этот подход будет работать, но я пытался реализовать один файл сценария, в котором параметры были изменены, и запросы передаются на сеанс sql. Поэтому для запросов я добавлю его как элементы массива или значения в переменные, чтобы его можно было вызвать, когда я запускаю сеанс sqlplus из того же сценария. –

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