0

次のようなSQLコードを含む単純なシェルスクリプトがあります。

  • SQL*Plus (SQL ステートメント) でバッチ ファイルを生成する
  • SQL*Plus からの出力が 400 行を超えているかどうかを確認します (400 行を超えて終了し、運用チームにメールを送信する場合)
  • SQL*Plus の出力が 400 行未満の場合、バッチ ファイルを自動的に実行します。

このスクリプトは非常にうまく機能します。PL/SQL (シェル コードなし) を使用して同じスクリプトを記述したいと考えています。これは可能ですか?コードを教えていただけますか (私は PL/SQL を学習中です)。

データベースは、Solaris 上の Oracle Database 10g Enterprise Edition リリース 10.2.0.4.0 です。

#!/bin/ksh
. /opt/db/scripts/setpath.sh

generate_batch ()
{
sqlplus -S $DBUSER/$DBPASSWD@$ORACLE_SID <<EOF > /opt/db/scripts/tools/delete_connection/batchrun/batchrun.$(/bin/date '+%d%m%Y.%Hh')

set echo Off
set term On
set pages 0
set head off
set ver off
set feed off
set trims on
set linesize 20000

WITH data
    AS (SELECT user_id,
               jc_name,
               upd_time,
               RANK () OVER (PARTITION BY user_id ORDER BY upd_time ASC)
                  rk
          FROM user_jc
         WHERE user_id IN (  SELECT user_id
                               FROM user_jc
                              WHERE JC_NAME LIKE 'CFF\_S\_%' ESCAPE '\'
                           GROUP BY user_id
                             HAVING COUNT (user_id) > 1)
               AND JC_NAME LIKE 'CFF\_S\_%' ESCAPE '\')
SELECT    'DISCONNECT ent_user  FROM job_code WITH user_id = "'
   || user_id
   || '", jc_name = "'
   || jc_name
   || '";'
  FROM data
 WHERE rk = 1;

exit
EOF
}

sanity_check ()
{
line_nr=$(wc -l /opt/db/scripts/tools/delete_connection/batchrun/batchrun.$(/bin/date '+%d%m%Y.%Hh') | awk ' { print $1 } ')
if [ $line_nr -gt 400 ]; then
        (cat /opt/db/scripts/tools/delete_connection/mail_body.txt) | mailx -s "Alert: please manually execute /opt/db/scripts/tools/delete_connection/batchrun/batchrun.$DATE" -r test@example.com test2@example.com
        exit 1
        fi
}

run_batch ()
{
/opt/bmchome/bin/ess batchrun -A -i /opt/db/scripts/tools/delete_connection/batchrun/batchrun.$(/bin/date '+%d%m%Y.%Hh')
}

generate_batch && sanity_check && run_batch
4

1 に答える 1

1

PL / SQLでは、逆の方法で実行します。

  1. クエリに一致する接続の数を数える
  2. 結果が400を超える場合は、メールを送信します
  3. ALTER SYSTEM DISCONNECT SESSIONそれ以外の場合は、おそらく...を使用して切断ステートメントを生成します。

もちろんあなたの要件はわかりませんが、ユーザー接続を制限するためのリソースプロファイルで解決できますか?

CREATE PROFILE myprofile LIMIT SESSIONS_PER_USER = 1;
ALTER USER myuser PROFILE myprofile; 
于 2013-01-22T09:03:24.460 に答える