使用shell脚本更新oracle数据库上的记录

时间:2016-01-10 15:05:48

标签: oracle shell

我需要开发一个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中时,它更新了记录没有问题。

感谢任何帮助,非常感谢您的时间!

1 个答案:

答案 0 :(得分:1)

在您的PL / SQL代码中,尝试将$1替换为&1

有关示例和说明,请参阅此link