我想编写一个查找特定表的PL / SQL作业,并将适合某些条件的某些特定条目插入另一个表。
在特定列中,我的意思是在状态列中可能存在“进行中”。我想搜索这些在sysdate之间最多1小时的时间间隔包含“正在进行”条目的列。
我有这个代码,
begin
SYS.DBMS_JOB.CHANGE
( job => 121313
,what => q'#
DECLARE
v_say NUMBER;
BEGIN
select rowid, a.*
from project_situation a
WHERE a.STATUS like '%ONGOING%'
and (a.CREATION_DATE) >= '?????'
order by a.creation_date desc;
COMMIT;
END;
#'
,next_date => TRUNC(SYSDATE + 1) + 7/24
,interval => 'TRUNC(SYSDATE + 1) + 7/24'
);
commit;
end;
/
表中可能有很多条目。我想获取创建时间大于1小时的条目。创建时间格式为'22 / 09/2018 11:52:20'
我也想每30分钟执行一次这项工作。
答案 0 :(得分:3)
为获得更好的性能,请使用以下代码计算1小时
PERSISTED_DATE<SYSDATE-60/1440.
PERSISTED_DATE是您的日期列 60是分钟数。 60/1440是1小时的时间。
对于您的示例,假设您已给出表和列,则以下代码应获取所需的结果
select rowid, a.* from project_situation a
WHERE a.STATUS like '%ONGOING%'
and a.CREATION_DATE< SYSDATE-60/1440';
如果您的状态是固定的,则可以使用=而不是类似'%status%'的运算符。
答案 1 :(得分:2)
这是您在一小时前获得的方式-减去1小时(1/24,因为一天中有24小时):
SQL> alter session set nls_date_format = 'dd.mm.yyyy hh24:mi:ss';
Session altered.
SQL> select sysdate right_now,
2 sysdate - 1/24 one_hour_ago
3 from dual;
RIGHT_NOW ONE_HOUR_AGO
------------------- -------------------
22.06.2018 11:24:09 22.06.2018 10:24:09
SQL>
这意味着您正在寻找的条件是
WHERE a.STATUS like '%ONGOING%'
AND a.creation_date >= sysdate - 1/24
每30分钟运行一次作业需要以下内容:
trunc(sysdate, 'hh') + 30 / (24 * 60)
30
是“分钟” 24 * 60
是“一天24小时,一小时60分钟” 请注意以下几点:建议您将写入what
的代码移到存储过程中。维护起来更容易。另外,由于它是PL/SQL
,它的select
需要一个您没有的into
子句,因此代码将失败。另外,您打算如何处理查询返回的值?也许最简单的选择是将它们插入到某个表中,然后对它们执行 something 。
答案 2 :(得分:0)
问题令人困惑,因为您希望创建时间大于1小时且大于1小时
如果您有大量数据,我将使用一条语句并确保表已正确索引
INSERT INTO target_table (
SELECT a.*
FROM project_situation
WHERE a.status like '%ONGOING%'
AND a.creation_date < (sysdate - 1/24)
)
如果您需要将字符串与日期进行比较,而列不是日期,则需要添加to_date(creation_date,'DD/MM/YYYY HH24:MI:SS')
您使用dbms_job是正确的,但是您也可以使用dbms_scheduler或编写OS批处理来定期调用脚本