Oracle调度程序作业日志输出

我正在使用dbms_scheduler来执行PL / SQL存储过程。我希望能够让代码创建一些文本日志记录输出并将其与运行相关联以验证它是否正常工作,但我在文档中找不到任何可以做的事情。是否有设施可以做到这一点,我错过了?这是一个在Unix下运行的11g数据库。如果我可以使用dbms_output这样真的很好,所以我也可以从sqlplus运行它并获得输出。     
已邀请:
有许多Oracle Scheduler数据字典视图可以帮助您监视作业。以下是与此相关的两个文档页面: 监控工作 监视和管理调度程序 此外,Oracle Scheduler声明了一些内部Scheduler变量,您可以像PL / SQL存储过程中的任何其他PL / SQL标识符一样使用这些变量。以下是这些变量的列表。 如果要记录特定于应用程序的信息,建议您创建自己的日志表。然后,您可以从存储过程中插入此表。您甚至可以在其中插入任何Scheduler的内部变量,例如job_name和job_scheduled_start。     
我做一个表JOB_LOG 从您的程序内插入该表...     
我同意其他人所说的话。这是实际的螺母和螺栓,但也有一个很好的界面。我通常这样做的方式: 制作一个记录表:
CREATE TABLE job_log (
    ts TIMESTAMP DEFAULT SYSTIMESTAMP PRIMARY KEY
  , message VARCHAR2(255)
);
创建一个可以轻松写入日志表的存储过程:
CREATE OR REPLACE PROCEDURE job_logger (v_message VARCHAR2)
IS
BEGIN
  INSERT INTO job_log(message) VALUES (v_message);
  COMMIT;
END;
/
然后在你的工作中,你可能正在运行一个存储过程。在您自己的存储过程中,只需添加调用job_logger()过程的行来写入日志。这使得丑陋的INSERT ... COMMIT杂乱无助于你有趣的存储过程代码。
CREATE OR REPLACE PROCEDURE foo 
IS
BEGIN
  job_logger('Starting job foo.');
  ...
  {your code here}
  ...
  job_logger('Another message that will be logged.');
  ...
  job_logger('Completed running job foo.');
EXCEPTION
    ...
    job_logger('Oops, something bad happened!');
    ...
END;
/
您的日志表会自动加上时间戳并由主键编制索引。要查看日志,您可以运行它
SELECT * FROM job_log ORDER BY ts DESC;
现在如果不想使用Oracle调度程序,而是希望使用DBMS_OUTPUT编写输出的方式,并希望在Unix shell下运行它,那也是可能的。 你会创建一个调用sqlplus的脚本,有点像这样。如果您的用户是SCOTT并且存储的proc被称为FOO,
#!/bin/sh
. /whatever/script/that/sets/your/oracle/environment
echo "
  set serveroutput on feedback off
  exec foo
" | sqlplus -s -l scott/tiger@orcl
注意,-s标志禁止Oracle SQL Plus标题以获得更清晰的输出。 -l标志使得如果密码错误或其他错误,sqlplus将中止,而不是尝试提示输入用户名。反馈关闭禁止PL / SQL“Anonymous block completed”消息。 如果你想安排这个,你可以从cron这样调用它:
00 00 * * * /path/to/the/above/script.sh > /where/you/want/your/output/saved.log 2>&1
    

要回复问题请先登录注册