【问题标题】:open sqlplus connection only once in while loop在while循环中只打开一次sqlplus连接
【发布时间】:2013-05-09 05:18:14
【问题描述】:

我有 100 条记录。当我运行下面的代码时,SQL*Plus 连接打开了很多次,占用了 100% 的 CPU。有什么方法可以让我只打开一次 SQL*Plus 连接,即。 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**

【问题讨论】:

标签: oracle shell sqlplus


【解决方案1】:

您可以创建一个 SQL 脚本,在您的 shell 脚本结束时使用 SQL*Plus 调用一次。它将使用 INSERT ALL DML 命令,您只需在现有循环中使用您的 shell 脚本和重定向运算符 (&gt;&gt;) 将字符串附加到它。

运行 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

【讨论】:

  • 或者,最好使用SQL*Loader,它更适合ETL。
  • 以下错误即将到来.... 1. 意外令牌附近的语法错误done' 2. done
  • 我概述了这个过程,假设您对编写 shell 脚本和使用 SQL*Plus 有一些基本的了解。我无法为您编写所有代码。对不起。
  • 抱歉上面的问题..你的代码真的很有帮助..非常感谢您的帮助
猜你喜欢
  • 2015-09-28
  • 1970-01-01
  • 2016-08-21
  • 2013-01-06
  • 2019-02-13
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多