我有一个文本文件,其中包含 select 语句的输入。
sqlplus -s $USERNAME/$PASSWORD@$HOST<<EOF
spool $DIRECTORY/UPDATE.xls
select acc,cr,dr from count
where acc in ***$DIRECTORY/acc.txt***;
spool off;
exit
EOF
请让我知道如何使用文本文件作为突出显示部分的输入。
答案1
首先,将文件读入数组。
这是一个包含一行值的文件:
read -ar values < "$DIRECTORY"/acc.txt
对于多行文件,使用循环(每行一个值):
while read -r v; do
values+=("$v")
done < <(cat "$DIRECTORY"/acc.txt)
根据Archemar的评论,SQL语法是var in ( "value1", "value2", ... )
,因此需要一些文本处理。
首先引用一下:
for i in "${values[@]}"; do quoted_values+=(\""$i"\"); done
其次,用逗号和空格分隔:
limit="${#quoted_values[@]}"
for ((i=0; i<"$limit"; i++ )); do
values_string="$values_string""${quoted_values[$i]}"
((limit-i-1)) && values_string="$values_string",
values_string="$values_string"" "
done
值列表周围的括号将出现在此处的文档中。
sqlplus -s "$USERNAME"/"$PASSWORD"@"$HOST"<<EOF
spool "$DIRECTORY"/UPDATE.xls
select acc,cr,dr from count
where acc in ( "$values_string" );
spool off;
exit
EOF
未经测试,因此可能存在拼写错误等。如果有问题,请评论。
答案2
从文本文件中选择的非常简单的方法是,
cat ${DIRECTORY}/UPDATE.txt |
while read acc_id ; do
select acc,cr,dr from count
where acc in ${acc_id};
done
就是这样。