变量类型错误?

变量类型错误?

我有一个我不明白的错误,问题似乎是我在 shell 中输入的参数与 SQL 数据库中的参数类型不同。

为了更好地理解:我有一个文件 doc.lst,其中每行都有三个重要的内容,用空格分隔,我想使用这些内容作为数据库中更新的参数。每一行都将被读取,每个部分都将用作参数并将更新我的数据库。

我有一个 SQL 查询:

    UPDATE PE P
    SET P.DATED='&1', P.DATEF='&1', P.CODA='&3', P.CODB='&2'
    WHERE P.G_BAT=1;
    COMMIT;

和一个外壳是:

    IFS=$'\n'
    for i in $(cat $LST_HOME/doc.lst)
    do 
    sqlplus64 $User/$Pass@$ORACLE_SID << EOF
    P1=$(echo $i | awk '{print $1}')
    P2=$(echo $i | awk '{print $2}')
    P3=$(echo $i | awk '{print $3}')
    @$SQL_HOME/update_p.sql $P1 $P2 $P3
    commit;
    exit
    /data/jdk1.6.0_XX/bin/java -cp fr.bla.bla.bla 
    EOF

我有这个错误:

    SQL> SP2-0734: unknown command at the beggining of "P1=12/03/2..." - end of the line is ignored.
    SQL> SP2-0042: unknown command "P2=0" - end of the line is ignored..
    SQL> SP2-0042: unknown command "P3=FSL" - end of the line is ignored..

我真的不明白我必须在哪里以及如何进行修改。

答案1

shell变量的设置应该在sqlplus调用之前进行

IFS=$'\n'
for i in $(cat $LST_HOME/doc.lst)
do 
P1=$(echo $i | awk '{print $1}')
P2=$(echo $i | awk '{print $2}')
P3=$(echo $i | awk '{print $3}')

sqlplus64 $UserCoribudg/$PassCoribudg@$ORACLE_SID << EOF
@$SQL_HOME/update_p.sql $P1 $P2 $P3
commit;
exit
EOF

/data/java_1.6_XX/bin/java -cp fr.bla.bla.bla

done
  • P1=whatever不是有效的 sql 代码。
  • 我假设 java 部分使用更新的值。

答案2

如中所示Shell : while 读取嵌套行,你可以做类似的事情

(sed "s|^|@${SQL_HOME}/update_p.sql |" ${LST_HOME}/doc.lst; echo exit) | sqlplus64 ${UserCoribudg}/${PassCoribudg}@${ORACLE_SID}

如果您想在每次 SQL 更新后运行命令,您可以循环,尽管有许多注意事项(通配符等)。如果你的价值观doc.lst是安全的,你可以这样做

while read line; do
    (echo @${SQL_HOME}/update_p.sql ${line}; echo exit) | sqlplus64 ${UserCoribudg}/${PassCoribudg}@${ORACLE_SID}
    /data/java_1.6_XX/bin/java -cp fr.bla.bla.bla
done < ${LST_HOME}/doc.lst

无需解析每一行。

更安全的选择是将整个文件转换为 shell 脚本:

sed "s|^|(echo @${SQL_HOME}/update_p.sql |" ${LST_HOME}/doc.lst | sed "s/$/; echo exit | sqlplus64/" | sed "s|$| ${UserCoribudg}/${PassCoribudg}@${ORACLE_SID}; /data/java_1.6_XX/bin/java -cp fr.bla.bla.bla|" > doc.script
sh doc.script

相关内容