Цикл SQL-запроса в скрипте Bash - PullRequest
1 голос
/ 25 августа 2011

Я новичок в написании сценариев Bash, и мне было интересно, если кто-нибудь может помочь мне со следующим.

Я пытаюсь получить название соревнования из базы данных Oracle, используя Compet_id, используя следующую инструкцию:

выберите имя, тип_ соревнования из соревнований, где идентификатор_ соревнования = '';

Однако я хочу использовать отдельный текстовый файл, у которого есть список Competition_ID, который я хочу идентифицировать, я хочу, чтобы мой скрипт нашел имя и тип всех моих идентификаторов и вывел результаты в текстовый файл. это то, что я имею до сих пор:

 #!/bin/bash     

 echo Start Executing SQL commands
 cat comps_ids.txt | while read ID 
 var=$ID
 do 
sqlplus "details"

<<  EOF
select name, competition_type 
from competitions 
where competition_id=$var;
exit;
EOF

Я пытался добавить готово в конце, но я получаю сообщение об ошибке «неожиданное окончание строки». Кто-нибудь может решить это?

Большое спасибо заранее:)

Ответы [ 2 ]

1 голос
/ 25 августа 2011
#!/bin/bash

function get_comp () {
    sqlplus -S user/pass@database << EOF
    set pagesize 0
    set feedback off
    set head off
    select name, competition_type 
        from competitions 
        where competition_id=$1;
EOF
}

for id in $* ; do
    get_comp $id
done

Поместите его в файл (get_comps.sh), а затем назовите его так:

$ ./get_comps.sh < comp_ids.txt > text_file_out.txt

-S делает sqlplus тише

другой параметр заставляет его возвращать только ваши данные, а не заголовки строк или что-либо еще.

Конечно, учетные данные базы данных будут храниться в вашей истории и доступны другим пользователям, использующим 'ps' или 'top'.

Это также ужасно неэффективно, поскольку он подключается к базе данных для каждой строки в исходном файле.Если у вас много строк, вы можете попробовать использовать python или ruby, поскольку их база данных довольно проста в использовании.

1 голос
/ 25 августа 2011

Я не уверен, как должна выглядеть ваша командная строка, но это больше похоже на

sqlplus "details" <<EOF
select name, competition_type from competitions where competition_id=$val;
exit;
EOF

Если ваш список идентификаторов не слишком велик, возможно, будет лучше сделать , -отдельный список и один запрос.

...