sys_refcursor结果不可见

时间:2019-06-14 11:50:41

标签: plsql

我创建了一个过程,该过程将在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行。

1 个答案:

答案 0 :(得分:2)

您的.cppp_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_CHARp_start_date成为正确的p_end_date变量。

这是一个有效的版本:

varchar2