我尝试创建一个 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
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 以特定用户身份运行命令。请记住,未记录的代码可能会在未来版本中更改或消失,因此请小心使用该功能。