Plsql sys\u refcursor结果不可见

Plsql sys\u refcursor结果不可见,plsql,Plsql,我创建了一个过程,它将在SYS\u 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;

我创建了一个过程,它将在SYS\u 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;
创建或替换过程p\u获取\u作业\u运行\u详细信息\u测试(p\u详细信息输出系统\u参考光标)作为
l_开始日期时间戳;
日期1时间戳;
l_结束日期时间戳;
l_计数整数;
p_开始日期;
p_结束日期;
开始
p_开始日期:=“2019年6月11日”;
p_结束日期:=“2019年6月11日”;
选择时间戳(开始日期“00:00:00欧洲/巴黎”,“DD-MON-YYYY HH24:MI:SS TZR”)
进入l_开始日期
来自双重;
选择时间戳(p|u结束日期|“23:59:59欧洲/巴黎”,“DD-MON-YYYY HH24:MI:SS TZR”)
进入l_结束日期
来自双重;
选择计数(*)
进入l_计数
从所有\u计划程序\u作业\u运行\u详细信息
其中job\u name='RANDOM\u job'
和日志日期>=l\U开始日期
和log_date=l_start_date
和log_date=to_timestamp_tz('19年6月11日'| |'00:00:00欧洲/巴黎','DD-MON-YY HH24:MI:SS TZR')

和log_date您的
p_start_date
p_end_date
变量的数据类型错误。 我运行了您的代码,在调用
to_timestamp_tz
后添加了以下行:

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'));
结果是这些毫无意义的日期和错误的世纪:

0019-06-11 00:00:00 | 0019-06-11 23:59:59

问题在于这些线路:

  p_start_date date;
  p_end_date   date;
BEGIN
  p_start_date := '11-JUN-2019';
  p_end_date   := '11-JUN-2019';
变量定义为
DATE
,因此,当为变量分配文本文字时,Oracle会通过应用
NLS\u DATE\u格式将文字隐式转换为日期。这很可能不是你所期望的

一个简单的解决方法是在此处使用适当的
日期
文字或
到日期
转换:

  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');
请注意,
to_timestamp_tz
调用中也会出现问题,因为Oracle现在会将
日期
变量隐式转换为
varchar2
,以便与
'00:00:00 EUROPE/PARIS'
连接。 同样,这将使用
NLS\u DATE\u格式
设置来完成,这可能不是您所期望的

使用带有日期掩码的显式
到字符
转换,或从开始处设置
p\u开始日期
p\u结束日期
适当的
varchar2
变量

以下是一个有效的版本:

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 varchar2(20);
  p_end_date   varchar2(20);
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;
  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'));

  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 user_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;
创建或替换过程p\u获取\u作业\u运行\u详细信息\u测试(p\u详细信息输出系统\u参考光标)作为
l_开始日期时间戳;
日期1时间戳;
l_结束日期时间戳;
l_计数整数;
开始日期varchar2(20);
结束日期varchar2(20);
开始
p_开始日期:=“2019年6月11日”;
p_结束日期:=“2019年6月11日”;
选择时间戳(开始日期“00:00:00欧洲/巴黎”,“DD-MON-YYYY HH24:MI:SS TZR”)
进入l_开始日期
来自双重;
选择时间戳(p|u结束日期|“23:59:59欧洲/巴黎”,“DD-MON-YYYY HH24:MI:SS TZR”)
进入l_结束日期
来自双重;
dbms|u output.put|u line(到字符(开始日期,'YYYY-MM-DD HH24:MI:SS')| |'|'|'|到字符(结束日期,'YYYY-MM-DD HH24:MI:SS');
选择计数(*)
进入l_计数
从所有\u计划程序\u作业\u运行\u详细信息
其中job\u name='RANDOM\u job'
和日志日期>=l\U开始日期
和log_date=l_start_date

和log_date您的
p_start_date
p_end_date
变量的数据类型错误。 我运行了您的代码,在调用
to_timestamp_tz
后添加了以下行:

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'));
结果是这些毫无意义的日期和错误的世纪:

0019-06-11 00:00:00 | 0019-06-11 23:59:59

问题在于这些线路:

  p_start_date date;
  p_end_date   date;
BEGIN
  p_start_date := '11-JUN-2019';
  p_end_date   := '11-JUN-2019';
变量定义为
DATE
,因此,当为变量分配文本文字时,Oracle会通过应用
NLS\u DATE\u格式将文字隐式转换为日期。这很可能不是你所期望的

一个简单的解决方法是在此处使用适当的
日期
文字或
到日期
转换:

  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');
请注意,
to_timestamp_tz
调用中也会出现问题,因为Oracle现在会将
日期
变量隐式转换为
varchar2
,以便与
'00:00:00 EUROPE/PARIS'
连接。 同样,这将使用
NLS\u DATE\u格式
设置来完成,这可能不是您所期望的

使用带有日期掩码的显式
到字符
转换,或从开始处设置
p\u开始日期
p\u结束日期
适当的
varchar2
变量

以下是一个有效的版本:

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 varchar2(20);
  p_end_date   varchar2(20);
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;
  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'));

  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 user_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;
创建或替换过程p\u获取\u作业\u运行\u详细信息\u测试(p\u详细信息输出系统\u参考光标)作为
l_开始日期时间戳;
日期1时间戳;
l_结束日期时间戳;
l_计数整数;
开始日期varchar2(20);
结束日期varchar2(20);
开始
p_开始日期:=“2019年6月11日”;
p_结束日期:=“2019年6月11日”;
选择时间戳(开始日期“00:00:00欧洲/巴黎”,“DD-MON-YYYY HH24:MI:SS TZR”)
进入l_开始日期
来自双重;
选择时间戳(p|u结束日期|“23:59:59欧洲/巴黎”,“DD-MON-YYYY HH24:MI:SS TZR”)
进入l_结束日期
来自双重;
dbms|u output.put|u line(到字符(开始日期,'YYYY-MM-DD HH24:MI:SS')| |'|'|'|到字符(结束日期,'YYYY-MM-DD HH24:MI:SS');
选择计数(*)
进入l_计数
从所有\u计划程序\u作业\u运行\u详细信息
其中job\u name='RANDOM\u job'
和日志日期>=l\U开始日期
和log_date=l_start_date

日志日期通常使用前缀
p
表示参数。将其用于局部变量(通常为
l_
)可能会导致混淆。通常使用前缀
p_
表示参数。将其用于局部变量(通常是
l
)可能会导致混淆。你好,泰德,非常感谢。更正的代码正在按预期工作。:)你好,泰德,非常感谢。更正的代码正在按预期工作。:)