在Bash脚本中循环SQL查询

时间:2011-08-25 18:31:13

标签: sql bash shell

我是bash脚本的新手,我想知道是否有人可以帮我解决以下问题。

我正在尝试使用match_id从Oracle数据库中使用以下语句检索竞争名称:

从比赛中选择名称,competition_type,其中competition_id ='';

但是我想使用一个单独的文本文件,它有一个我要识别的list_ids列表,我希望我的脚本找到所有id的名称和类型,并将结果输出到txt文件中。这就是我到目前为止所做的:

 #!/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 个答案:

答案 0 :(得分:1)

我不确定你的命令行应该是什么样的,但它更像是

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

如果您的ID列表不是太大,最好制作一个, - 分隔列表和单个查询。

答案 1 :(得分:1)

#!/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,因为他们的数据库东西很容易使用。