我有一个运行得很好的存储过程。首先,它创建一个databaselink(通过调用另一个存储过程),然后更新一个表,然后关闭链接。如您所见,我必须包含“authid current_user”子句。
create or replace PROCEDURE UPDATE_BATCHES
authid current_user
AS
BEGIN
databaselink(1);
execute immediate ('update MYLOCALTABLE
set FLAG= 1
where FLAG = 0
and id in (select id from REMOTETABLE@LINK)');
databaselink(0);
END UPDATED_BATCHES;
我一直在捕获异常并将它们写入日志 - 但我在尝试调试时删除了它,希望向调度程序抛出错误。它没有帮助。
我在调度程序中运行了一个工作。我在SQL Developer中使用了向导,但这是它生成的SQL。
BEGIN
DBMS_SCHEDULER.CREATE_JOB (
job_name => '"<SCHEMA-NAME>".""',
job_type => 'STORED_PROCEDURE',
job_action => '<SCHEMA-NAME>.UPDATE_BATCHES',
number_of_arguments => 0,
start_date => TO_TIMESTAMP_TZ('2014-03-06 09:37:53.000000000 AMERICA/NEW_YORK','YYYY-MM-DD HH24:MI:SS.FF TZR'),
repeat_interval => 'FREQ=DAILY;BYHOUR=5;BYMINUTE=0;BYSECOND=0',
end_date => NULL,
enabled => TRUE,
auto_drop => FALSE,
comments => 'update the FLAG on the LOCAL table');
DBMS_SCHEDULER.SET_ATTRIBUTE(
name => '"<SCHEMA-NAME>".""',
attribute => 'restartable', value => TRUE);
DBMS_SCHEDULER.SET_ATTRIBUTE(
name => '"<SCHEMA-NAME>".""',
attribute => 'logging_level', value => DBMS_SCHEDULER.LOGGING_FULL);
DBMS_SCHEDULER.SET_ATTRIBUTE(
name => '"<SCHEMA-NAME>".""',
attribute => 'raise_events', value => '1');
DBMS_SCHEDULER.enable(
name => '"<SCHEMA-NAME>".""');
END;
预定作业似乎运行得很好。运行日志显示它每天早上运行 - 状态为“成功”。我没有收到错误消息。
但是,该表中的标志不会更新。如果我手动运行存储过程,它会按预期更新。只有在调度程序上运行时才会这样做。
这可能与权限有关吗?还有什么想法可以看看吗?
修改 我更新了程序,以便在执行更新后立即保存行计数。
rowsupd := sql%rowcount;
log_errors(p_error_message => 'total olvr batch rows updated: ' || TO_CHAR(rowsupd));
计划工作运行时没有结果。不是0计数 - 但是尽管作业日志显示成功运行,但表中没有任何内容。
但是,当我手动运行作业时,它成功更新了记录。我真的很困惑。