【问题标题】:simple Shell Script - howto do the same in PL/SQL简单的 Shell 脚本 - 如何在 PL/SQL 中做同样的事情
【发布时间】:2013-01-22 08:45:10
【问题描述】:

我有一个带有 SQL 代码的简单 shell 脚本:

  • 使用 SQL*Plus(SQL 语句)生成批处理文件
  • 检查 SQL*Plus 的输出是否超过 400 行(如果超过 400 行退出并将邮件写入运营团队)
  • 如果 SQL*Plus 输出少于 400 行,则自动执行批处理文件

这个脚本运行良好。我希望用 PL/SQL 编写相同的脚本(没有 Shell 代码)。这可能吗?能否提供代码(我正在学习PL/SQL)。

数据库是 Solaris 上的 Oracle Database 10g Enterprise Edition Release 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

【问题讨论】:

    标签: sql oracle shell plsql oracle10g


    【解决方案1】:

    在 PL/SQL 中,我会反其道而行之:

    1. 计算与您的查询匹配的连接数
    2. 如果结果 > 400 发送电子邮件
    3. 否则生成断开连接语句,可能使用ALTER SYSTEM DISCONNECT SESSION...

    我当然不知道您的要求,但是可以通过资源配置文件限制用户连接来解决吗?

    CREATE PROFILE myprofile LIMIT SESSIONS_PER_USER = 1;
    ALTER USER myuser PROFILE myprofile; 
    

    【讨论】:

    • 批处理与Oracle DB无关。 DISCONNECT 语句用于专有 BMC 应用程序。你能写完整的代码吗?
    • 抱歉,我错过了您脚本中的 /opt/bmchome/bin/ess。我没有从 Oracle 运行外部作业的经验,尽管 DBMS_SCHEDULER 似乎可以。
    猜你喜欢
    • 1970-01-01
    • 2019-12-30
    • 2018-05-18
    • 1970-01-01
    • 2013-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多