Как передать переменную в sqlplus в скрипте bash

#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