[oracle]打开 sqlplus 连接只有一次在 while 循环

标签: shell Oracle
发布时间: 2014/3/9 15:56:51
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我有 100 条记录。下面的代码,SQL 运行时我 * 加连接打开多次利用 100%的 CPU。有没有什么办法,我可以打开 SQL * 加连接只有一次,外面 i.e. while 循环吗?

**#!/bin/bash
export ORACLE_HOME=/software/oracle/ora10204
export PATH=$PATH:$ORACLE_HOME/bin
INPUT_FILE='file.csv'
IFS=','
i=0
while read name id do
a[i]="$name"
b[i]="$id"
echo "${a[$i]}  ${b[$i]}"
set serveroutput on;
sqlplus .../...@'(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=...)(HOST=...)(PORT=...)))(CONNECT_DATA=(SID=...)))'<<EOF
insert into code_entry(inh_valu,edi_valu) values('${a[$i]}' , '${b[$i]}');
EOF
let i=$i+1
done < $INPUT_FILE**

解决方法 1:

您可以创建一个 SQL 脚本,您将一次调用中用 SQL shell 脚本的结尾 * 加上。它会使用 INSERT ALL DML 命令,你会只是将字符串追加到它使用您的 shell 脚本和重定向运算符 ( >> ) 在您现有的循环内。

后您的 shell 脚本运行您的 SQL 脚本可能看起来像这样:

insert all
into code_entry (inh_valu, edi_valu) values (1, 'foo')
into code_entry (inh_valu, edi_valu) values (2, 'bar');
...

你会然后只需运行它像这样:

$ sqlplus scott/tiger @myscript.sql

一个 shell 脚本示例可能看起来类似:

echo "insert all" > myscript.sql

INPUT_FILE='file.csv'
IFS=','
i=0
while read name id do
  a[i]="$name"
  b[i]="$id"
  echo "into code_entry(...) values ('${a[$i]}', '${b[$i]}')" >> myscript.sql
  let i=$i+1
done < $INPUT_FILE**

echo ";" >> myscript.sql

sqlplus .../...@'(DESCRIPTION=...)' @myscript.sql
官方微信
官方QQ群
31647020