我需要开发一个shell脚本来更新oracle数据库上的一些记录,这个程序读取输入.txt文件,然后在满足某些条件时更新记录,但由于某些原因这些记录没有更新,似乎为了更新记录,plsql读取的变量存在问题。
这是shell脚本代码
## #!/bin/sh
. /usr/local/bin/oracle.profile.prod
. /usr/local/bin/bscs.profile.prod
hostname=`uname -n`
basedato=BSCS1REP
if [[ $basedato = "BSCS2PROD" && $hostname = "comp35" ]];then
export Y/Shell
export Y/Sql
export Y/Log
export Y/Cfg
. Y.MM.txt
elif [ $basedato = "BSCS1REP" and $hostname = "comp44" ]; then
export X/Shell
export X/Sql
export X/Log
export X/Cfg
. X/.MM.txt
else
echo "ERROR, Servidor no valido para la ejecucion de este programa"
echo "Base de Datos = "$basedato
echo "Maquina = "$hostname
exit 1
fi
FECHA=$(date "+%Y%m%d_%H_%M_%S")
cat $RUTA_CFG/MSISDN.txt | while read elemento
do
set $elemento
elemento=$1
echo "El registro es $elemento "insertado""
sqlplus -S $USER/$PASS@$basedato @$RUTA_PLS/Num_Act.sql $elemento > $RUTA_LOG/test.txt
done
rm -f $RUTA_CFG/Act_num.ctl
echo "DONE"
如您所见,此脚本读取输入数据,如下所示:
123456789
就是这个简单的字符串。
现在这是调用的Pl / sql
ALTER SESSION SET OPTIMIZER_GOAL = CHOOSE;
ALTER SESSION SET NLS_LANGUAGE = AMERICAN;
ALTER SESSION SET NLS_TERRITORY = AMERICA;
SET serveroutput ON SIZE 1000000
SET term ON
WHENEVER SQLERROR CONTINUE
DECLARE
elemento constant varchar2(30) := '$1';
BEGIN
update directory_number dn
set dn.dn_status = 'a'
where dn.dn_num = ('$1')
and dn.dn_status in ('d','t','Z','f','r');
DBMS_OUTPUT.PUT_LINE (elemento);
END;
/
EXIT;
我添加了一个日志文件以查看正在进行的操作,并返回以下内容:
会话改变了。
会话改变了。
会话改变了。
$ 1
PL / SQL程序已成功完成。
变量代表$ 1,它应该是输入数据。
可能是一个sintax错误?,一个变量声明?
当我把变量放在一边并直接将所需数字的valor放在plsql中时,它更新了记录没有问题。
感谢任何帮助,非常感谢您的时间!