shell scipt 中 select 语句的文件输入

shell scipt 中 select 语句的文件输入

我有一个文本文件,其中包含 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

就是这样。

相关内容