我有100条记录。当我运行下面的代码时,SQL * Plus连接使用100%的CPU打开很多次。有没有什么方法可以只打开SQL * Plus连接一次,i。即在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**
答案 0 :(得分:0)
您可以创建一个SQL脚本,使用SQL * Plus在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