我正在尝试从 shell 脚本调用一个过程,该过程使用远程数据库的数据将大量插入到我的数据库中。所以,我在这里做的是通过 dblink 查询表并将该信息插入我的本地表中。
当我直接从数据库 IDE(如 Quest Toad 或 Oracle SQL Developer)执行此操作时,该过程运行时间不到 3 分钟。当我在 sqlplus 命令行中运行该过程时,也会在不到 3 分钟内运行。但是当我使用 shell 脚本调用该过程时,unix 中的进程挂起,在 oracle 服务器中产生一个高使用率的网络事件,并且数据库会话永远不会结束。
所以,这里的事情是我有另一个以与此相同的方式运行的程序,只有这会在我在 ksh 脚本中执行时引起问题。
下面,我使用两种方法从 ksh 脚本中的 sqlplus 调用该过程:
原脚本:
#!/usr/bin/ksh
PROFILE=/home/user/config/my_profile.sh
. ${PROFILE}
yesterday=$(TZ=GMT+24 date "+%d/%m/%Y")
echo "Establishing a DB connection"
/home/oraclei/product/11.1.0/bin/sqlplus<<END_OF_SQL
$USER/$PASSWD
execute MY_PROCEDURE@DB('$yesterday');
exit;
END_OF_SQL
选择:
#!/usr/bin/ksh
PROFILE=/home/user/config/my_profile.sh
. ${PROFILE}
echo "Establishing a DB connection"
yesterday=$(TZ=GMT+24 date "+%d/%m/%Y")
/home/oraclei/product/11.1.0/bin/sqlplus $USER/$PASSWD @/home/user/dblink_load/scripts/sql/load.sql $yesterday
以及它使用的 sql 脚本
exec MYSCHEMA.MY_PROCEDURE('&1');
quit;
过程中的查询是这样的:
insert into MYSCHEMA.mytable
(id, date, stat1, stat2, stat3)
(select
id, date, max(stat1), avg(stat2), avg(stat3)
from
tableA@dblink table1,
tableB@dblink table2,
tableC@dblink table3
where
table1.date >= parameter and
table1.id = table2.id and
table2.id = table3.id
group by
table1.id,
table1.date);