#oracle #bash #sqlplus
#Oracle #bash #sqlplus
Вопрос:
У меня есть скрипт, подобный приведенному ниже. Моя цель — записать в файл журнала, завершающийся текущей датой и временем в качестве имени файла, и преобразовать в файл:
#!/bin/bash
year=`date %Y`
month=`date %m`
day=`date %d`
prefixe=$month$day$year
logfile="/home/oracle/logs/exec_proc_daily_20_"$prefixe.log
sqlplus / "as sysdba" <<EOF
spool on
spool $logfile
execute Proc_RFC_MAJ_MV_ITIN;
execute Proc_RFC_MAJ_MV_REFGEO;
commit;
quit
EOF
Когда я выполняю скрипт, spool $logfile
выдает ошибку. Журнал не создается. Но это работает, когда я использую что-то вроде spool exec_proc_daily_2o.log
. Почему переменная $logfile
не заменяется.
Комментарии:
1. Замена
sqlplus / "as sysdba"
наcat
и запуск вашего скрипта предполагает, что замена переменной работает должным образом…
Ответ №1:
[Отредактировано с рабочим примером] Передайте переменную в sqlplus:
demo.sh
export myvar1="hello"
export myvar2=123
sqlplus "/ as sysdba" @demo.sql $myvar1 $myvar2
echo "---shell is complete---"
demo.sql
select 'first variable is amp;1 and second is amp;2'
from dual;
exit
Комментарии:
1. Привет @Beege. Спасибо за ваш вклад. Я пробовал ваш подход, но он не работает. Я получаю сообщение о неправильном использовании команды sqlplus с предложениями о том, как ее использовать.
2. работает в Linux env, я внес два изменения, поскольку мне не нравится ссылаться на $ 1 и $ 2 в моем SQL-скрипте. « define myvar1=’amp;1′ define myvar2=’amp;2′ выберите ‘первая переменная — amp;amp;myvar1, а вторая — amp;amp;myvar2’ из dual; exit «
Ответ №2:
После долгих поисков я нашел решение проблемы. В строке sqlplus / "as sysdba" <<EOF
я передал переменную следующим образом sqlplus / as sysdba <<EOF >$logfile
. Таким образом, полный код должен быть:
#!/bin/bash
year=`date %Y`
month=`date %m`
day=`date %d`
prefixe=$month$day$year
logfile="/home/oracle/logs/exec_proc_daily_20_"$prefixe.log
sqlplus / "as sysdba" <<EOF >$logfile
spool on
spool $logfile
execute Proc_RFC_MAJ_MV_ITIN;
execute Proc_RFC_MAJ_MV_REFGEO;
commit;
quit
EOF
Комментарии:
1. Ваша команда sqlplus перенаправляет выходные данные sqlplus в файл $logfile.
Ответ №3:
Ответ @Beege работает в Linux env. Я внес несколько изменений, так как мне не нравится везде ссылаться на amp; 1 и amp; 2 в скрипте SQL.
myvar1="hello"
myvar2=123
sqlplus username/password@SID @oracle_variabling_passing.sql $myvar1 $myvar2
echo "---shell is complete---"
oracle_variabling_passing.sql:
define first_var=amp;1
define second_var=amp;2
select 'first variable is amp;amp;first_var and second is amp;amp;second_var'
from dual;
exit