我正在尝试从shell脚本调用一个过程,该过程使用远程数据库的数据大量插入到我的数据库中。所以,我在这里做的是通过dblink查询表并在我的本地表中插入该信息。
当我直接从DB IDE(如Quest Toad或Oracle SQL Developer)执行此操作时,该过程在不到3分钟的时间内运行。当我在sqlplus命令行中运行程序时,运行时间不到3分钟。但是当我使用shell脚本调用该过程时,unix中的进程会挂起,在oracle服务器中产生高使用率的网络事件,并且db session永远不会结束。
所以,这里的问题是我有另外一个程序以与此相同的方式运行,只有这会导致我在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);