0

100件のレコードがあります。以下のコードを実行すると、CPU を 100% 使用して SQL*Plus 接続が何度も開かれます。whileSQL*Plus 接続を 1 回だけ、つまり外部ループで開く方法はありますか?

**#!/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**
4

1 に答える 1

0

SQL*Plus を使用して、シェル スクリプトの最後で 1 回呼び出す SQL スクリプトを作成できます。DML コマンドを使用し、既存のループ内でINSERT ALLシェル スクリプトとリダイレクト演算子 () を使用して文字列を追加するだけです。>>

シェル スクリプトを実行すると、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

サンプル シェル スクリプトは次のようになります。

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
于 2013-05-09T05:40:09.677 に答える