2013-05-09 108 views
0

我有100条记录。当我运行下面的代码时,SQL * Plus连接使用100%的CPU打开多次。有没有什么方法可以让我只打开一次SQL * Plus连接,即i。即外部while循环?在while循环中只打开一次sqlplus连接一次

**#!/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 .../[email protected]'(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

这是链接[link]的内联链接(http://stackoverflow.com/questions/16192414/unable-to-find-sqlplus-processes-runn ing-when-executed-shell-script-via-crontab#comment23258650_16253971) – myst 2013-05-09 05:37:54

+0

这个数据文件在服务器上还是单独的客户端?你有没有看过使用SQL * Loader或外部表来加载这个文件? – 2013-05-09 06:39:19

+0

类似的问题:[只连接到sqlplus而没有写入循环中的文件](https://stackoverflow.com/q/21273838/427158) – maxschlepzig 2017-10-04 20:54:57

回答

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 .../[email protected]'(DESCRIPTION=...)' @myscript.sql 
+0

或者,更好地使用[SQL * Loader](http:// docs .oracle.com/cd/E11882_01/server.112/e25789/cncptdba.htm#CNCPT1282),它更适合ETL。 – 2013-05-09 05:53:51

+0

我是新来的..可以通过编辑我的代码来帮助我吗? – myst 2013-05-09 06:12:01

+0

以下错误即将到来...... 1.在意外标记'done'附近出现的语法错误 2.'done <$ INPUT_FILE' – myst 2013-05-09 06:42:57