我有两个文档:doc1.lst 和 doc 2.lst 我想获取每行的内容并将其作为 SQL 查询的参数。
我尝试过类似的事情,请纠正我
file=doc1.lst
while read line
do
p1=$line;
file=doc2.lst
while read line
do
p2=$line;
sqlplus64 $User/$Pass@$ORACLE_SID << EOF2
@update.sql p1 p2
done < echo "Ok"
done < echo "Ok"
EOF2
问题是我想获取每一行的值并将其作为参数(p1 和 p2),以便能够更新我的表,如 sqlplus 查询中所示。
为了更好地理解我的文件 doc1.lst 如下所示:
AAA
ABC
EDF
我的文件 doc2.lst :
30
10
30
我想用这些值来更新我的表。
答案1
据我了解(<<EOF2
最后的内容并不十分清楚),您所追求的最终结果是将以下内容输入sqlplus64
:
@update.sql AAA 30
@update.sql ABC 10
@update.sql EDF 30
要生成此内容,您可以将它们组合起来,而不是循环遍历两个文件的内容。paste
对两个文件使用( paste doc1.lst doc2.lst
) 给出
AAA 30
ABC 10
EDF 30
(paste
默认情况下与选项卡连接)。使用paste -d ' ' doc1.lst doc2.lst
Gives更改分隔符
AAA 30
ABC 10
EDF 30
然后我们需要添加@update.sql
作为前缀;这可以通过sed
将每行的开头 ( ^
) 替换为前缀来完成:
paste -d ' ' doc1.lst doc2.lst | sed 's/^/@update.sql /'
产生所需的结果。
然后可以将其一次性输入sqlplus64
:
paste -d ' ' doc1.lst doc2.lst | sed 's/^/@update.sql /' | sqlplus64 $User/$Pass@$ORACLE_SID
如果您需要exit
在脚本末尾输入sqlplus64
:
(paste -d ' ' doc1.lst doc2.lst | sed 's/^/@update.sql /'; echo exit) | sqlplus64 $User/$Pass@$ORACLE_SID
如果您确实想逐行运行,则可以将while read
结果的每一行提供给它sqlplus64
。