2

シェル スクリプトからプロシージャを呼び出そうとしています。そのプロシージャは、リモート データベースのデータをデータベースに大量に挿入します。つまり、ここで行っているのは、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);
4

0 に答える 0