Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
只连接到sqlplus一次,而不写入循环中的文件_Sql_Loops_Ksh - Fatal编程技术网

只连接到sqlplus一次,而不写入循环中的文件

只连接到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

我需要编写一个ksh脚本,将命令行参数读入数组,并创建DML语句将记录插入oracle数据库。为了实现这一点,我创建了如下脚本。但是,调用脚本的用户没有权限写入脚本必须运行的目录。那么,有没有一种方法可以在数据库上触发多个插入,而无需在循环中多次连接到sqlplus,同时不创建以下临时sql文件?任何想法都将受到高度赞赏。提前谢谢

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