Можно ли сохранить сеанс в SQLPlus живым и повторно подключиться к тому же сеансу? BASH связанных
У меня есть цикл в Bash, он работал как шарм до сегодняшнего дня. Цикл выглядит так:
while read line1 ; do
while read line2 ; do
stringArray=($line2)
string=$line1.${stringArray[1]}
sqlplus /nolog <<EOF
connect sysuser/syspassword@db_instance
alter system flush shared_pool;
quit
EOF
sqlplus -s /nolog > /dev/null 2>&1 <<EOF
connect user/password@db_instance
variable rc refcursor;
SPOOL ${line1}_${stringArray[0]}.DATA
exec :rc := $string;
print rc;
spool off
exit
EOF
done < file2.txt
done < file1.txt
Чтобы уточнить одно, содержимое переменной $string
Пакеты Oracle с функциями и параметрами:
SOMEPACKAGE.SOMEFUNCTION(some,'parameters',here,'sometimes',NULL,'or',numbers)
Теперь - пока пакет не делал то, что он должен был сделать только за один параметризованный прогон - все было прекрасно. Но теперь я столкнулся с пакетом, который выполняет свою работу в 5 шагов, шагов, определенных последним параметром. Это выглядит так:
SOMEPACKAGE.SOMEFUNCTION(some,'parameters',here,'sometimes',NULL,'or',1)
SOMEPACKAGE.SOMEFUNCTION(some,'parameters',here,'sometimes',NULL,'or',2)
SOMEPACKAGE.SOMEFUNCTION(some,'parameters',here,'sometimes',NULL,'or',3)
SOMEPACKAGE.SOMEFUNCTION(some,'parameters',here,'sometimes',NULL,'or',4)
SOMEPACKAGE.SOMEFUNCTION(some,'parameters',here,'sometimes',NULL,'or',5)
Первый, с 1 на конце, производит TEMPORARY_TABLE
на котором работают другие рабочие места (от 2 до 5). Задание № 5 должно также давать результаты всей цепочки.
Пока у меня не было пакетов, выполняющих свою работу за 1 шаг, выполнение этого цикла было просто идеальным. Но TEMPORARY_TABLE
исчезает после отключения, и я не могу просто добавить специальный раздел в свой bash-скрипт только для этого пакета, потому что может быть гораздо больше пакетов с разным количеством шагов. Это должно быть сделано автоматически, без особых усилий со стороны пользователей, которые будут использовать этот скрипт.
Так есть ли способ сохранить сеанс в живых? Или есть другой способ сделать это?
1 ответ
Вместо того, чтобы хранить только один вызов процедуры в $string
попробуйте записать анонимный блок в переменную и выполнить его. Блок может содержать несколько обращений к процедуре (наряду с другими вещами) и не вернется, пока все они не будут завершены.