只连接到sqlplus一次,而不写入循环中的文件
我需要编写一个ksh脚本,将命令行参数读入数组,并创建DML语句将记录插入oracle数据库。为了实现这一点,我创建了如下脚本。但是,调用脚本的用户没有权限写入脚本必须运行的目录。那么,有没有一种方法可以在数据库上触发多个插入,而无需在循环中多次连接到sqlplus,同时不创建以下临时sql文件?任何想法都将受到高度赞赏。提前谢谢只连接到sqlplus一次,而不写入循环中的文件,sql,loops,ksh,Sql,Loops,Ksh,我需要编写一个ksh脚本,将命令行参数读入数组,并创建DML语句将记录插入oracle数据库。为了实现这一点,我创建了如下脚本。但是,调用脚本的用户没有权限写入脚本必须运行的目录。那么,有没有一种方法可以在数据库上触发多个插入,而无需在循环中多次连接到sqlplus,同时不创建以下临时sql文件?任何想法都将受到高度赞赏。提前谢谢 i=0 while (( i<$src_tbl_cnt )) do echo "insert into temp_table values ('${src_tb
i=0
while (( i<$src_tbl_cnt ))
do
echo "insert into temp_table values ('${src_tbl_arr[$i]}', ${ins_row_arr[$i]}, ${rej_row_arr[$i]});" >> temp_scrpt.sql
(( i+=1 ))
done
echo "commit; disc; quit" >> temp_scrpt.sql
sqlplus user/pass@db @ temp_scrpt.sql
i=0
而((i>temp_scrpt.sql
((i+=1))
完成
echo“提交;光盘;退出”>>temp_scrpt.sql
sqlplus用户/pass@db@temp_scrpt.sql
只需使用/tmp目录即可
任何unix系列服务器上都保证存在/tmp目录。它正是为了满足这样的需要而存在的。一定要在文件名中添加当前进程ID,这样多个用户就不会相互攻击。因此,总名称是/tmp/temp_$PID_scrpt.sql或类似的名称
完成后,确保也删除该文件——比如说,在sqlplus调用之后的一行中。因此,确保将文件名存储在变量中,并删除该变量中的内容
不用说,但是在一个运行良好的商店中:1)管理员应该在/tmp中放置足够的空间,2)社区中的所有用户都不应该删除/tmp中其他人的文件或使其过载,从而耗尽空间。3) 管理员应该设置一个作业,在一定时间后从/tmp删除文件,这样,如果脚本在删除临时文件之前失败,它就不会永远存在
所以实际上,这个答案更多的是关于/tmp和有效地管理它——但这确实是您所需要的。使用临时文件是一项功能强大的技术,因此您的设计很好。用户通常在目录中没有权限这一事实很常见,因此/tmp是您的答案。您可以在shell脚本中将输入生成块的输出直接导入sqlplus,而不是创建临时文件 例如:
{
echo 'set auto off;'
for ((i=0; i<100; i++)); do
echo "insert into itest(i) values ($i);"
done
# echo 'rollback;' # for testing
echo 'commit;'
} | sqlplus -S juser/secret@db > /dev/null
顺便说一句,即使在创建临时文件时也是首选-重定向输出比对每行执行追加样式重定向要高效得多,例如:
{ for ((i=0; i<100; i++)); do echo "line $i"; done; echo end; } > foo.tmp
{for((i=0;i foo.tmp)
下面的代码将保持多次连接到SQLplus,还是只连接一次?
{
echo“设置自动关闭;”
对于((i=0;i/dev/null)如果我最初的问题听起来有误导性,那么很抱歉,但问题更多的是在连接到sqlplus时只运行一次所有insert语句,并且“不”将所有insert语句写入文件。
{ for ((i=0; i<100; i++)); do echo "line $i"; done; echo end; } > foo.tmp