Oracle创建定时器报错

看看有什么问题

--存储过程
create or replace procedure tk_days_add (
resultStr out char,
v_vlt_id in CHAR
) is
Begin
update Ticket set tk_days=tk_days+1 where vlt_id=v_vlt_id;
ResultStr := 'success: 执行成功.';
End;

--定时器
DECLARE
unlockTest_timer number;
BEGIN
SYS.DBMS_JOB.SUBMIT(
job => unlockTest_timer,
what => 'tk_days_add;',
next_date => SYSDATE,
interval => 'sysdate+1/(24*60)');
Commit;
End;

Interval => 'TRUNC(sysdate,''mi'') + 1 / (24*60)' 这样试试呢,sysdate是时间型,直接做加法会出错

你存储过程要求传入两个参数,但是job的what里面又没传,当然会报错了,要改成下面这样

DECLARE
unlockTest_timer number;
BEGIN
SYS.DBMS_JOB.SUBMIT(
job => unlockTest_timer,
what => 'declare
resultStr char;
v_vlt_id CHAR;
begin
tk_days_add(resultStr,v_vlt_id);
end;',
next_date => SYSDATE,
interval => 'sysdate+1/(24*60)');
Commit;
End;

这个与时间类型加减没关系,oracle的date类型本就可以加减,sysdate+1表示当前时间加1天


提示对象无效

  1. 确认你创建存储过程的用户和创建job的用户是同一个
  2. 确认你这个存储过程本身是否存在编译错误或当前为无效对象

你回复的这个一眼就能看出错误呀,你没有声明ResultStr这个变量,怎么能给它赋值呢?而且你这个赋值本身没有任何意义呀,既不打印又不输出,为什么不删掉这一行呢?

create or replace procedure tk_days_add (
v_vlt_id in CHAR
) is
Begin
update Ticket set tk_days=tk_days+1 where vlt_id=v_vlt_id;
End;

上面这个语法就没错了,就是不知道你表名和字段名是不是对的,
而且,你这个job其实执行其实也没有任何意义,传个空值进去做where 的等于条件,永远都更新不到数据。
建议你再想一想你创建定时任务是为了做什么?是否真的需要外部参数?如果需要外部参数,那参数的值获得的逻辑是什么?