【问题标题】:How to present job_name to DBMS_SCHEDULER.ADD_JOB_EMAIL_NOTIFICATION如何将 job_name 呈现给 DBMS_SCHEDULER.ADD_JOB_EMAIL_NOTIFICATION
【发布时间】:2014-09-17 01:34:53
【问题描述】:

我在向 Oracle 11g (11.2.0.1.0) 添加电子邮件通知时遇到问题。这似乎是一个错误,但我真的不确定。我已经尝试使用 SQL Developer 来构建代码以及来自 Internet 的示例,但它不起作用。

我可以轻松地创建和启用工作:

 BEGIN
    DBMS_SCHEDULER.CREATE_JOB (
            job_name => '"SCHEMA"."test1"',
            job_type => 'PLSQL_BLOCK',
            job_action => 'begin
                           null;
                          end;
                          ',
            auto_drop => FALSE
            );

    DBMS_SCHEDULER.enable(
             name => '"SCHEMA"."test1"');
END;
/

匿名块完成

作为预防措施,我删除了工作电子邮件通知 - 这有效。

BEGIN

    DBMS_SCHEDULER.REMOVE_JOB_EMAIL_NOTIFICATION (    
            job_name => '"SCHEMA"."test1"'
             );

end;
/

匿名块完成

但是当我尝试添加电子邮件通知时,就好像找不到对象一样,我正在使用自己的架构并拥有 DBA 角色,因此我认为应该克服任何潜在的权限问题(尽管在我自己的架构中,我会假设我可以很容易地完成预定的工作)

BEGIN
    DBMS_SCHEDULER.ADD_JOB_EMAIL_NOTIFICATION (    
             job_name => '"SCHEMA"."test1"', 
             recipients => 'email_address@test.com',
             events => 'JOB_BROKEN, JOB_CHAIN_STALLED, JOB_FAILED, JOB_OVER_MAX_DUR, JOB_SCH_LIM_REACHED'
             );
END; 
/

ORA-27476: "SCHEMA.SCHEMA" does not exist
ORA-06512: at "SYS.DBMS_ISCHED", line 4856
ORA-06512: at "SYS.DBMS_ISCHED", line 7117
ORA-01403: no data found
ORA-06512: at "SYS.DBMS_SCHEDULER", line 4030
ORA-06512: at line 3

注意它说 SCHEMA.SCHEMA 好像它没有正确读取该行。当我将它从 '"SCHEMA"."test1"' 更改为 'test1' 时,它仍然不起作用,但显示 ORA-27476: "SCHEMA.TEST1" 不存在。

我所有的工作都正常工作并且表现良好,并且我已经完成了一个 UTL_MAIL 实现,但如果可能的话,我真的很想让 oracle 的东西工作起来更简单。

【问题讨论】:

  • 您确定该作业是在正确的架构中创建的吗? select owner, job_name from dba_scheduler_jobs where job_name = 'TEST1' 的输出是什么?另请注意,"test1" 将区分大小写,因为它被双引号括起来。
  • @MarcoBaldelli 我认为这是问题的核心。我认为 add_scheduler 函数不支持小写,即使调度程序可以处理它。从技术上讲,我认为这是一个错误,但小写的对象名称很糟糕,所以我没有错。我宁愿 SQL Developer 为我做一个大写...一旦我确认我会要求你把它作为答案。
  • 这似乎是正确的分析。请做一个答案让我标记。我的进程正在运行,但我没有收到电子邮件。是时候深入挖掘了。

标签: oracle plsql oracle11g dbms-scheduler


【解决方案1】:

一个可能的问题是,默认情况下,Oracle 中的对象名称不区分大小写,除非您用双引号将它们括起来。

这是一个测试用例:

SQL> select * from v$version where rownum = 1;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production

SQL> create user STACKOVERFLOW identified by STACKOVERFLOW;

User created.

SQL> grant connect, create job to STACKOVERFLOW;

Grant succeeded.

SQL> conn STACKOVERFLOW/STACKOVERFLOW

SQL> l
  1  BEGIN
  2      DBMS_SCHEDULER.CREATE_JOB (
  3              job_name => '"STACKOVERFLOW"."test1"',
  4              job_type => 'PLSQL_BLOCK',
  5              job_action => 'begin
  6                             null;
  7                            end;
  8                            ',
  9              auto_drop => FALSE
 10              );
 11      DBMS_SCHEDULER.enable(
 12               name => '"STACKOVERFLOW"."test1"');
 13* END;
SQL> /

PL/SQL procedure successfully completed.

如果您将作业命名为"test1",Oracle 将使用小写名称创建它。您可以通过查看目录视图dba_scheduler_jobs 来确认这一点:

SQL> select owner, job_name from dba_scheduler_jobs where job_name = 'TEST1';

no rows selected

SQL> select owner, job_name from dba_scheduler_jobs where job_name = 'test1';

OWNER                          JOB_NAME
------------------------------ ------------------------------
STACKOVERFLOW                  test1

因此,这将起作用:

SQL> l
  1  BEGIN
  2      DBMS_SCHEDULER.ADD_JOB_EMAIL_NOTIFICATION (
  3               job_name => '"STACKOVERFLOW"."test1"',
  4               recipients => 'email_address@test.com',
  5               events => 'JOB_BROKEN, JOB_CHAIN_STALLED, JOB_FAILED, JOB_OVER_MAX_DUR, JOB_SCH_LIM_REACHED'
  6               );
  7* END;
SQL> /

PL/SQL procedure successfully completed.

但这不会:

SQL> l
  1  BEGIN
  2      DBMS_SCHEDULER.ADD_JOB_EMAIL_NOTIFICATION (
  3               job_name => '"STACKOVERFLOW".TEST1',
  4               recipients => 'email_address@test.com',
  5               events => 'JOB_BROKEN, JOB_CHAIN_STALLED, JOB_FAILED, JOB_OVER_MAX_DUR, JOB_SCH_LIM_REACHED'
  6               );
  7* END;

SQL> /
BEGIN
*
ERROR at line 1:
ORA-27476: "STACKOVERFLOW.STACKOVERFLOW" does not exist
ORA-06512: at "SYS.DBMS_ISCHED", line 4921
ORA-06512: at "SYS.DBMS_ISCHED", line 7613
ORA-01403: no data found
ORA-06512: at "SYS.DBMS_SCHEDULER", line 4063
ORA-06512: at line 2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-02
    • 2020-05-10
    • 1970-01-01
    • 1970-01-01
    • 2020-01-29
    • 1970-01-01
    • 2015-06-24
    • 1970-01-01
    相关资源
    最近更新 更多