Моя процедура не возвращает ожидаемых результатов - PullRequest
0 голосов
/ 16 сентября 2010

Вот мой код:

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;

Я хочу запросить все строки между конкретными датами, но, похоже, ничего не сообщается.

Ответы [ 3 ]

4 голосов
/ 16 сентября 2010

Не совсем то, что вы просили, но стоит упомянуть: вы можете писать лучше, то есть более идиоматически 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. Чтобы найти все строки с 16-16-2010, вы должны явно указать время (или просто добавить 1 к конечной дате, что в большинстве случаев достаточно)

2 голосов
/ 16 сентября 2010

Посмотрите, не проверено ли оно.

alt text

0 голосов
/ 17 сентября 2010

Во-первых, желательно добавлять префиксы к переменным и параметрам, чтобы они не конфликтовали с именами столбцов.

В вашем примере, если "customer_audit" содержит столбцы start_date и end_date, тогда они будут использоваться в предпочтении перед переменными PL / SQL или параметрами с тем же именем.

Во-вторых, оригинальное название включало «the-parameter-всегда-null». Если параметры равны нулю, условие не будет истинным и строки не будут возвращены.

Если вы хотите справиться с этим, вам нужно кодировать в некоторой логике, например:

> 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...