Ввод файла для оператора select в оболочке scipt

У меня есть текстовый файл, в котором есть входные данные для оператора выбора.

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

Пожалуйста, дайте мне знать, как использовать текстовый файл в качестве ввода в выделенной части.

0
25.03.2017, 14:35
2 ответа

Сначала прочитайте файл в массив.

Это для файла, содержащего значения в одной строке:

read -ar values < "$DIRECTORY"/acc.txt

Для многострочного файла используйте цикл (одно значение в строке):

while read -r v; do
    values+=("$v")
done < <(cat "$DIRECTORY"/acc.txt)

Согласно комментарию Archemar, синтаксис SQL var in ("значение1", "значение2", ...), поэтому требуется некоторая обработка текста.

Во-первых, цитирование:

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
28.01.2020, 02:33

очень простой способ выбора из текстового файла,

cat ${DIRECTORY}/UPDATE.txt |

while read acc_id ; do

       select acc,cr,dr from count
       where acc in ${acc_id};

done

вот и все.

0
28.01.2020, 02:33

Теги

Похожие вопросы