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行的批量获取方式静默地完成。这可能会禁用任何索引在审核日期扫描。这可能会在审核日期禁用任何索引扫描。