シェル スクリプトからプロシージャを呼び出そうとしています。そのプロシージャは、リモート データベースのデータをデータベースに大量に挿入します。つまり、ここで行っているのは、dblink を介してテーブルにクエリを実行し、その情報をローカル テーブルに挿入することです。
Quest Toad や Oracle SQL Developer などの DB IDE から直接実行すると、手順は 3 分未満で実行されます。sqlplusコマンドラインでプロシージャを実行すると、3分もかかりません。しかし、シェル スクリプトを使用してプロシージャを呼び出すと、UNIX のプロセスが停止し、Oracle サーバーで使用率の高いネットワーク イベントが発生し、db セッションが終了しません。
したがって、ここでの問題は、これと同じ方法で実行されている別の手順があり、これだけが ksh スクリプトで実行中に問題を引き起こしているということです。
以下に、ksh スクリプトで sqlplus からプロシージャを呼び出すために使用している 2 つの方法を示します。
元のスクリプト:
#!/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);