Oracle 我的过程没有返回预期结果

Oracle 我的过程没有返回预期结果,oracle,plsql,Oracle,Plsql,这是我的密码: create or replace procedure date_report (start_date timestamp , end_date timestamp ) is cursor cursor_audit is select audit_id, audit_action, audit_user, audit_date from customer_audit where audit_date between start_date

这是我的密码:

create or replace    
procedure date_report (start_date  timestamp , end_date  timestamp  )
is
  cursor cursor_audit is
    select audit_id, audit_action, audit_user, audit_date
    from customer_audit
    where audit_date between start_date and end_date
    ;
  rec cursor_audit%rowtype;
begin
  open cursor_audit;
  fetch cursor_audit into rec;
  while cursor_audit%found
  loop
    dbms_output.put_line('User : '  || rec.audit_user
                    || ', ID :'     || rec.audit_id
                    || ', Action: ' || rec.audit_action
                    || ', Date : '  || rec.audit_date );
    fetch cursor_audit into rec;
  end loop;
  close cursor_audit;
end;

我想查询特定日期之间的所有行,但它似乎没有报告任何内容。

不完全符合您的要求,但值得一提的是:您可以编写得更好,即更惯用的PL/SQL如下:

创建或替换

procedure date_report (start_date  timestamp , end_date  timestamp  )
is
  cursor cursor_audit is select audit_id, audit_action, audit_user, audit_date
                         from customer_audit
                         where audit_date between start_date and end_date
                     ;
begin
  for rec in cursor_audit
  loop
    dbms_output.put_line('User : '||rec.audit_user ||', ID :' ||rec.audit_id||', Action: ' 
                         || rec.audit_action||', Date : ' ||rec.audit_date );
  end loop;
end;
甚至

procedure date_report (start_date  timestamp , end_date  timestamp  )
is
begin
  for rec in (select audit_id, audit_action, audit_user, audit_date
                from customer_audit
                where audit_date between start_date and end_date)
  loop
    dbms_output.put_line('User : '||rec.audit_user ||', ID :' ||rec.audit_id||', Action: ' 
                         || rec.audit_action||', Date : ' ||rec.audit_date );
  end loop;
end;

出现问题的一个可能原因是您选择了例如09-16-2010到09-16-2010,这意味着09-16-2010 00:00到09-16-2010 00:00:00。要查找2010年9月16日的所有行,您必须明确地传递一个时间(或者在结束日期上加1,这在大多数情况下是足够的)

这不完全是您所要求的,但值得一提的是:您可以编写得更好,即更惯用的PL/SQL如下所示:

创建或替换

procedure date_report (start_date  timestamp , end_date  timestamp  )
is
  cursor cursor_audit is select audit_id, audit_action, audit_user, audit_date
                         from customer_audit
                         where audit_date between start_date and end_date
                     ;
begin
  for rec in cursor_audit
  loop
    dbms_output.put_line('User : '||rec.audit_user ||', ID :' ||rec.audit_id||', Action: ' 
                         || rec.audit_action||', Date : ' ||rec.audit_date );
  end loop;
end;
甚至

procedure date_report (start_date  timestamp , end_date  timestamp  )
is
begin
  for rec in (select audit_id, audit_action, audit_user, audit_date
                from customer_audit
                where audit_date between start_date and end_date)
  loop
    dbms_output.put_line('User : '||rec.audit_user ||', ID :' ||rec.audit_id||', Action: ' 
                         || rec.audit_action||', Date : ' ||rec.audit_date );
  end loop;
end;
出现问题的一个可能原因是您选择了例如09-16-2010到09-16-2010,这意味着09-16-2010 00:00到09-16-2010 00:00:00。要查找2010年9月16日的所有行,您必须明确地传递一个时间(或者只需在结束日期中添加1,这在大多数情况下已经足够了)

查看是否已选中。

查看是否已选中。

首先,建议为变量和参数添加前缀,以免它们与列名冲突

在您的示例中,如果“customer_audit”包含start_date和end_date列,那么这些列将优先于PL/SQL变量或同名参数使用

其次,原始标题包括“参数始终为空”。如果参数为null,则该条件将不为true,并且不会返回任何行

如果您想满足这一需求,您需要编写一些逻辑代码,如:

> select audit_id, audit_action, audit_user, audit_date
> from customer_audit
> where (audit_date >= i_start_date or i_start_date is null)
> and   (audit_date <= i_end_date or i_end_date is null)
>选择审核id、审核操作、审核用户、审核日期
>来自客户审计
>其中(审核日期>=i_开始日期或i_开始日期为空)

>和(audit_date首先,建议在变量和参数前面加前缀,这样它们就不会与列名冲突

在您的示例中,如果“customer_audit”包含start_date和end_date列,那么这些列将优先于PL/SQL变量或同名参数使用

其次,原始标题包含“参数始终为null”。如果参数为null,则条件将不为true,并且不会返回任何行

如果您想满足这一需求,您需要编写一些逻辑代码,如:

> select audit_id, audit_action, audit_user, audit_date
> from customer_audit
> where (audit_date >= i_start_date or i_start_date is null)
> and   (audit_date <= i_end_date or i_end_date is null)
>选择审核id、审核操作、审核用户、审核日期
>来自客户审计
>其中(审核日期>=i_开始日期或i_开始日期为空)

>及(审核日期您如何调用该过程?您是否
将SERVEROUTPUT设置为打开状态
?您是否检查
结束日期
是否大于
开始日期
,记住时间部分很重要?您如何调用该过程?您是否
将SERVEROUTPUT设置为打开状态
?您是否检查
结束日期
是否为grea在
start\u date
之后,记住时间部分很重要?我想声明
cursor\u audit%rowtype
数组,在那里批量收集数据,然后在该数组中循环将更快地完成任务,不是吗?@be\u here\u now:在当前版本的Oracle中不一定如此,因为FOR循环现在在bu中以静默方式完成lk获取100行。我想声明
cursor\u audit%rowtype
array,在那里批量收集数据,然后在该数组中循环将更快地完成这项工作,不是吗?@be\u here\u now:不一定在当前版本的Oracle中,因为FOR循环现在以100行的批量获取方式静默地完成。这可能会禁用任何索引在审核日期扫描。这可能会在审核日期禁用任何索引扫描。