我创建了一个过程,该过程将在SYS_REFCURSOR中给出结果集。 但是我没有在输出中看到结果集,甚至没有看到记录数。
CREATE OR REPLACE PROCEDURE p_get_job_run_details_test (p_details OUT sys_refcursor) AS
l_start_date TIMESTAMP;
date1 TIMESTAMP;
l_end_date TIMESTAMP;
l_count INTEGER;
p_start_date date;
p_end_date date;
BEGIN
p_start_date := '11-JUN-2019';
p_end_date := '11-JUN-2019';
select to_timestamp_tz(p_start_date || ' 00:00:00 EUROPE/PARIS', 'DD-MON-YYYY HH24:MI:SS TZR')
into l_start_date
from dual;
select to_timestamp_tz(p_end_date || ' 23:59:59 EUROPE/PARIS', 'DD-MON-YYYY HH24:MI:SS TZR')
into l_end_date
from dual;
select count(*)
into l_count
FROM all_scheduler_job_run_details
WHERE job_name = 'RANDOM_JOB'
and log_date >= l_start_date
and log_date <= l_end_date
;
dbms_output.put_line(l_count);
OPEN p_details FOR
SELECT owner, log_date, job_subname,
status, error# as error, req_start_date, actual_start_date,
run_duration, additional_info
FROM all_scheduler_job_run_details
WHERE log_date >= l_start_date
AND log_date <= l_end_date
AND job_name = 'RANDOM_JOB'
ORDER BY log_date DESC;
END p_get_job_run_details_test;
我希望输出一行。 如果我单独进行
SELECT *--count(*) into l_count
FROM all_scheduler_job_run_details
WHERE log_date >= to_timestamp_tz('11-JUN-19' || ' 00:00:00 EUROPE/PARIS', 'DD-MON-YY HH24:MI:SS TZR')
AND log_date <= to_timestamp_tz('11-JUN-19' || ' 23:59:59 EUROPE/PARIS', 'DD-MON-YY HH24:MI:SS TZR')
AND job_name = 'RANDOM_JOB';
我可以看到结果:1行。
答案 0 :(得分:2)
您的.cpp
和p_start_date
变量的数据类型错误。
我运行了您的代码,在p_end_date
调用之后添加了以下行:
to_timestamp_tz
结果是这些带有错误世纪的废话:
0019-06-11 00:00:00 | 0019-06-11 23:59:59
问题是这些行:
dbms_output.put_line(to_char(l_start_date, 'YYYY-MM-DD HH24:MI:SS') || '|' || to_char(l_end_date, 'YYYY-MM-DD HH24:MI:SS'));
变量被定义为 p_start_date date;
p_end_date date;
BEGIN
p_start_date := '11-JUN-2019';
p_end_date := '11-JUN-2019';
,因此当给它们分配文本文字时,Oracle通过应用DATE
将这些文字隐式转换为日期。这很可能没有达到您的期望。
一个简单的解决方法是在此处使用正确的NLS_DATE_FORMAT
文字或DATE
转换:
TO_DATE
请注意,您在 p_start_date := DATE'2019-06-11';
p_end_date := DATE'2019-06-11';
-- or
p_start_date := TO_DATE('11-JUN-2019', 'DD-MON-YYYY');
p_end_date := TO_DATE('11-JUN-2019', 'DD-MON-YYYY');
调用中也会遇到问题,因为Oracle现在会将to_timestamp_tz
变量隐式转换为date
以便与varchar2
串联。
同样,这将使用您的' 00:00:00 EUROPE/PARIS'
设置来完成,这可能与您期望的不一样。
要么使用带有日期掩码的显式NLS_DATE_FORMAT
转换,要么从一开始就使TO_CHAR
和p_start_date
成为正确的p_end_date
变量。
这是一个有效的版本:
varchar2