oracle每隔1分钟自动向"getSysDate表"中插入当前的系统时间。

 

每隔1分钟自动向"getSysDate表"中插入当前的系统时间。

1、创测试表


create table getSysDate(test date);

 


2、创要定时执行的存储过程


create or replace procedure insertSysDate as
begin
insert into getSysDate values (sysdate);
end ;

 


3、创建JOB,即创建待执行的定时任务过程


variable job1 number;
begin
dbms_job.submit(:job1,'insertSysdate;',sysdate,'sysdate 1/1440');
end;

4、启动JOB,即启动并运行定时任务过程


begin
dbms_job.run(:job1);
end;

5、查看运行效果


select to_char(test,'yyyy/mm/dd hh24:mi:ss') from getSysDate;

 


结果:


2007/08/03 10:53:11
2007/08/03 11:05:51

<B>一部分重点参数的补充说明:</B>

DBMS_JOB.SUBMIT(:jobno,//"job"号
'your_procedure;',//需要执行的过程
trunc(sysdate) 1/24,//下次执行的时间
'trunc(sysdate) 1/24 1'//每次间隔的时间
);

删除job:dbms_job.remove(jobno);

修改要执行的操作:job:dbms_job.what(jobno,what);

修改下次执行时间:dbms_job.next_date(job,next_date);

修改间隔时间:dbms_job.interval(job,interval);


停止job:dbms.broken(job,broken,nextdate);

启动job:dbms_job.run(jobno);


修改job_queue_processes的值:(必须保证其不为0否则JOB不能自动运行)

大家可以通过select * from v$parameter;查看其值;


或者直接用show parameter job_queue_processes;查看如下:


NAME TYPE VALUE
--------------------- -----------
job_queue_processes integer 10

方法1:startup pfile='C:oracleora90databaseinitorcl.ora';


//这个方法修改initorcl.ora文件的job_queue_processes参数,然后重新启动数据库

 

方法2:alter system set job_queue_processes=10


//这个方法不要重新启动数据库即可以生效,而系统自动修改init.ora文件以后才能生效。

<think>我们有一个Java代码片段,它将当前系统日期和时间格式化为"yyyyMMdd"和"HHmmss"格式,并分别设置到evenInfo对象的eventDate和eventTime属性中。 当前代码使用了两次`evenInfo.getSysdate()`,这可能会造成两次调用(如果getSysdate()每次返回当前时间的话,在极端情况下可能两次调用时间不一致)。 另外,代码中使用了相同的DateTimeFormatter模式字符串重复创建了两个格式化器,这也可以优化。 更优雅的实现方式: 1. 避免多次调用`getSysdate()`,可以只调用一次,然后分别格式化日期和时间部分。 2. 使用预定义的格式化器,避免重复创建相同模式的格式化器(虽然DateTimeFormatter是线程安全的,但重复创建相同模式的实例没有必要,可以定义为常量)。 3. 另外,我们注意到代码中使用了`evenInfo.getSysdate()`,这返回了一个日期时间对象(可能是LocalDateTime或类似类型)。我们可以将其拆分,然后分别格式化日期和时间。 但是,如果`getSysdate()`返回的是`LocalDateTime`,那么我们可以这样做: - 先获取一次系统时间,然后分别格式化成日期字符串和时间字符串。 改进后的代码示例: 假设`getSysdate()`返回`LocalDateTime`对象: ```java // 预先定义好格式化器常量,避免重复创建 private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMdd"); private static final DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern("HHmmss"); // 在方法中 LocalDateTime sysDateTime = evenInfo.getSysdate(); evenInfo.setEventDate(sysDateTime.format(DATE_FORMATTER)); evenInfo.setEventTime(sysDateTime.format(TIME_FORMATTER)); ``` 这样,我们只调用了一次`getSysdate()`,避免了两次调用可能带来的时间不一致问题(比如在23:59:59.999调用,第一次是今天,第二次变成明天的情况),同时也避免了重复创建格式化器。 如果`getSysdate()`返回的不是`LocalDateTime`,而是其他类型(比如Date),那么我们可以先转换为LocalDateTime,或者根据实际类型调整。 另外,如果`getSysdate()`返回的是一个瞬时的时间点(比如Instant),那么我们需要转换为一个时区的日期时间再格式化。但根据代码上下文,应该是获取的当前系统日期时间,所以假设为LocalDateTime。 如果`getSysdate()`返回的是`Instant`,那么可以这样调整: ```java // 假设返回的是Instant,并且需要转换为系统默认时区的LocalDateTime LocalDateTime sysDateTime = LocalDateTime.ofInstant(evenInfo.getSysdate(), ZoneId.systemDefault()); ``` 当然,如果不需要考虑时区,并且原始代码就是这样工作的,那么我们可以保持原有的类型处理。 总之,核心优化点: - 只获取一次当前时间 - 重用格式化器 根据问题要求,最后提出相关问题: </think>这段代码通过两次调用`getSysdate()`分别格式化了日期和时间,可以更优雅地实现。以下是优化方案: ### 优化方案 ```java // 1. 单次获取时间并拆分格式 LocalDateTime sysDateTime = evenInfo.getSysdate(); evenInfo.setEventDate(sysDateTime.format(DateTimeFormatter.BASIC_ISO_DATE)); // yyyyMMdd evenInfo.setEventTime(sysDateTime.toString().substring(11, 13) + sysDateTime.toString().substring(14, 16) + sysDateTime.toString().substring(17, 19)); // 2. 使用预定义格式化器(Java 8+) private static final DateTimeFormatter DATE_FORMAT = DateTimeFormatter.ofPattern("yyyyMMdd"); private static final DateTimeFormatter TIME_FORMAT = DateTimeFormatter.ofPattern("HHmmss"); LocalDateTime now = evenInfo.getSysdate(); evenInfo.setEventDate(now.format(DATE_FORMAT)); evenInfo.setEventTime(now.format(TIME_FORMAT)); ``` **优化说明**: 1. **避免重复调用**:单次获取`LocalDateTime`对象避免时间戳不一致风险 2. **重用格式化器**:预定义静态格式化器提升性能(线程安全) 3. **ISO标准格式**:日期直接使用内置`BASIC_ISO_DATE`格式化器 4. **时间截取优化**:利用`LocalDateTime.toString()`的固定格式直接截取HHmmss ### 最推荐方案 ```java private static final DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern("HHmmss"); LocalDateTime sysDateTime = evenInfo.getSysdate(); evenInfo.setEventDate(sysDateTime.format(DateTimeFormatter.BASIC_ISO_DATE)); evenInfo.setEventTime(sysDateTime.format(TIME_FORMATTER)); ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值