使用 job_owner 和 job_creator 作为指定 schema 创建 Oracle 调度程序作业的 PL/SQL 代码

问题描述 投票:0回答:1

我尝试创建一个 PL/SQL 代码来创建一个以 job_owner 和 job_creator 作为指定模式的 Oracle 调度程序作业,因为我不想以 job_creator 和 job_owner 作为 SYS 创建调度程序作业。我已授予代理用户连接权限,以连接到需要创建调度程序作业的所需架构。我需要有关此代码的帮助。我用来满足我的要求的逻辑正确吗?或者这可以以另一种更好的方式实现?尽管我使用此逻辑在创建调度程序作业时出错,但在创建作业时一定存在一些语法错误。请专家帮忙

# Run the PL/SQL block
set -vx

if [ $# -lt 1 ]
then
{

        echo "Invalid Parameter passed to the script"
        exit 1;
}
fi

#SOURCE ENV FILE

. ${1}
. ${v_env}   # Source Oracle Env File

sqlplus -s "/ as sysdba" << SQLEND
DECLARE
   l_schema_owner      VARCHAR2 (240);
   l_specific_id         NUMBER := 1;
   l_repeat_interval   VARCHAR2 (2000);
   l_job_action        VARCHAR2 (2000);
   sql_stmt    VARCHAR2(200);
BEGIN
   FOR i
      IN (SELECT owner,start_date, repeat_interval, next_run_date
            FROM all_scheduler_jobs
           WHERE job_name = 'XYZ' || l_specific_id
                 AND UPPER(owner) like UPPER('ABC'))
   LOOP
      IF INSTR (i.repeat_interval, 'SECOND') != 0
         OR (INSTR (i.repeat_interval, 'MINUTE') != 0
             AND SUBSTR (i.repeat_interval,
                         INSTR (i.repeat_interval,
                                '=',
                                1,
                                2)
                         + 1) < 2)
      THEN
         l_schema_owner:=i.owner;
         EXECUTE IMMEDIATE 'ALTER SESSION SET CURRENT_SCHEMA='||i.owner;
         sys.DBMS_SCHEDULER.drop_job (
            'XYZ' || l_client_id,
            TRUE);


         l_job_action :=
            'DECLARE
                                            l_errbuf  VARCHAR2(500); l_retcode   NUMBER;
                                           BEGIN
                                                MNOP_JOB_SCHEDULER_PKG.EXECUTE_JOB (l_errbuf, l_retcode,'
            || l_specific_id
            || ',''MINUTELY'','
            || TO_CHAR (2)
            || ');
                                            COMMIT;
                                           END;';



         l_repeat_interval := 'FREQ=MINUTELY;INTERVAL=2';
         l_schema_owner:=i.owner;
         sql_stmt := 'CONNECT PROXY[l_schema_owner]/passwd';
         EXECUTE IMMEDIATE sql_stmt ;
         DBMS_SCHEDULER.create_job (
            job_name          => l_schema_owner || '.' || 'XYZ' || l_specific_id,
            job_type          => 'PLSQL_BLOCK',
            job_action        => l_job_action,
            start_date        => SYSTIMESTAMP,
            repeat_interval   => l_repeat_interval,
            end_date          => NULL,
            enabled           => TRUE,
            comments          => 'testing  Manager Setup FOR Client ID-'
                                || l_client_id);

         COMMIT;
      END IF;
   END LOOP;
END;
/
SQLEND
bash oracle plsql
1个回答
0
投票

CONNECT
命令适用于 SQL*Plus,不能在 SQL 中本机运行。这就是这段代码失败的原因:

         sql_stmt := 'CONNECT PROXY[l_schema_owner]/passwd';
         EXECUTE IMMEDIATE sql_stmt ;

不幸的是,这意味着需要更改 shell 脚本以在 bash、SQL*Plus 和 SQL 之间进行多次转换。

另一种方法是使用功能强大且未记录的包DBMS_SYS_SQL。该软件包允许 SYS 以特定用户身份运行命令。请记住,未记录的代码可能会在未来版本中更改或消失,因此请小心使用该功能。

© www.soinside.com 2019 - 2024. All rights reserved.