Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Вызов процедуры в цикле  [new]
gg_75
Guest
Подскажите по следующему вопросу. Имеется процедура procedure(data,client) с параметрами
data - дата тип дата
client - клиент тип char

Мне необходимо написать скрипт, который последовательно вызовет эту процедуру за каждый день месяца. Как это сделать?
8 май 09, 09:27    [7160739]     Ответить | Цитировать Сообщить модератору
 Re: Вызов процедуры в цикле  [new]
gg_75
Guest
имеется в виду как это сделать в PL-SQL
8 май 09, 09:28    [7160743]     Ответить | Цитировать Сообщить модератору
 Re: Вызов процедуры в цикле  [new]
gg_75
Guest
Ткните на FAQ, если не сложно. Чем мне пользоваться курсором или еще чем-то
8 май 09, 09:39    [7160778]     Ответить | Цитировать Сообщить модератору
 Re: Вызов процедуры в цикле  [new]
Elic
Member

Откуда:
Сообщений: 29976
RTFM Iterative Control: LOOP and EXIT Statements, Using Cursor FOR Loops (FAQ)
8 май 09, 09:46    [7160813]     Ответить | Цитировать Сообщить модератору
 Re: Вызов процедуры в цикле  [new]
SQLap
Member [заблокирован]

Откуда:
Сообщений: 34063
gg_75,

 select round(last_day(sysdate) - trunc(sysdate, 'MON') + 1) into d from dual;
 for c in  1..d loop
 ...
 end loop;
8 май 09, 09:46    [7160815]     Ответить | Цитировать Сообщить модератору
 Re: Вызов процедуры в цикле  [new]
не гость
Member

Откуда: from dual
Сообщений: 148
declare
begin
for i in reverse 0..extract(day from last_day(sysdate))-1 loop
 dbms_output.put_line(to_date(last_day(sysdate)-i));
end loop;
end;
8 май 09, 09:54    [7160847]     Ответить | Цитировать Сообщить модератору
 Re: Вызов процедуры в цикле  [new]
gg_75
Guest
Хочу за январь 2009 вызвать процедуру, но не получается

for c in 1..31 loop
select acc_code+ 'c' from fa_accounts
get_clients_info(to_date('200901'+c,'YYYYMMDD'),'01')
end loop;

Что делаю не так?
8 май 09, 10:34    [7161089]     Ответить | Цитировать Сообщить модератору
 Re: Вызов процедуры в цикле  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
gg_75
Что делаю не так?
Пишите, не зная языка...
"+" для строк - это "||"
И все остальное Вы откуда взяли? Вы где-то в приведенных примерах такое видите?
8 май 09, 10:36    [7161108]     Ответить | Цитировать Сообщить модератору
 Re: Вызов процедуры в цикле  [new]
gg_75
Guest
Сделал так как в примере

select round(last_day(sysdate) - trunc(sysdate, 'MON') + 1) into d from dual;
for c in 1..d loop
get_clients_info(c,'01');
end loop;

все равно ошибку выдает
8 май 09, 10:58    [7161259]     Ответить | Цитировать Сообщить модератору
 Re: Вызов процедуры в цикле  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116064
gg_75
Сделал так как в примере

select round(last_day(sysdate) - trunc(sysdate, 'MON') + 1) into d from dual;
for c in 1..d loop
get_clients_info(c,'01');
end loop;

все равно ошибку выдает


Что за ошибка ?
Только не отвечайте пожалуйста, что Вы не объявили d :-)

declare d number;
8 май 09, 11:05    [7161297]     Ответить | Цитировать Сообщить модератору
 Re: Вызов процедуры в цикле  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
gg_75
все равно ошибку выдает
Прямо так и пишет "Ошибка!"?
ЗЫ: Надеюсь, это был не весь код?
8 май 09, 11:06    [7161304]     Ответить | Цитировать Сообщить модератору
 Re: Вызов процедуры в цикле  [new]
SQLap
Member [заблокирован]

Откуда:
Сообщений: 34063
Моя доля вины в этом есть)
Афтар, не пинайте меня, пешите так

 for c in  1..round(last_day(sysdate) - trunc(sysdate, 'MON') + 1) loop
 ...
 end loop;
8 май 09, 11:16    [7161347]     Ответить | Цитировать Сообщить модератору
 Re: Вызов процедуры в цикле  [new]
SQLap
Member [заблокирован]

Откуда:
Сообщений: 34063
Хотел как нагляднее а получилось...
8 май 09, 11:17    [7161356]     Ответить | Цитировать Сообщить модератору
 Re: Вызов процедуры в цикле  [new]
stax..
Guest
gg_75,

declare
d date;
d_b date;
procedure p(dat date,client_id int)
is
begin
 dbms_output.put_line(dat||' '||client_id);
end;
begin
 d_b:=to_date('01/2009','mm/yyyy');
 d:=d_b;
 for i in 1..last_day(d_b)-d_b+1 loop
   p(d,1);
   d:=d+1;
 end loop;
end;
/
.....
stax
8 май 09, 11:18    [7161367]     Ответить | Цитировать Сообщить модератору
 Re: Вызов процедуры в цикле  [new]
aZm
Member

Откуда: 3й рим
Сообщений: 2355
declare 
  vDate date;
begin
  vDate:=sysdate; -- тут дата из интересного вам месяца.
  for cc in (select trunc(vDate,'mm')+rownum-1 dt
             from dual
             connect by rownum<add_months(trunc(vDate,'mm'),1)-trunc(vDate,'mm')+1)
    loop
      dbms_output.put_line(to_char(cc.dt,'dd.mm.yyyy'));
    end loop;
end;


Сообщение было отредактировано: 8 май 09, 14:39
8 май 09, 13:32    [7162171]     Ответить | Цитировать Сообщить модератору
 Re: Вызов процедуры в цикле  [new]
stax..
Guest
aZm
declare 
  vDate date;
begin
  vDate:=sysdate; -- тут дата из интересного вам месяца.
  for cc in (select trunc(vDate,'mm')+rownum-1 dt
             from dual
             connect by rownum<add_months(trunc(vDate,'mm'),1)-trunc(vDate,'mm')+1)
    loop
      dbms_output.put_line(to_char(cc.dt,'dd.mm.yyyy'));
    end loop;
end;


---
Ceterum censeo NATO esse delendam!

racle9i Enterprise Edition Release 9.2.0.6.0 - Production
SQL> declare 
  2    vDate date;
  3  begin
  4    vDate:=sysdate; -- тут дата из интересного вам месяца.
  5    for cc in (select trunc(vDate,'mm')+rownum-1 dt
  6               from dual
  7               connect by rownum<add_months(trunc(vDate,'mm'),1)-trunc(vDate,'mm')+1)
  8      loop
  9        dbms_output.put_line(to_char(cc.dt,'dd.mm.yyyy'));
 10      end loop;
 11  end;
 12  /
01.05.2009

PL/SQL procedure successfully completed.


......
stax

Сообщение было отредактировано: 8 май 09, 14:40
8 май 09, 13:46    [7162239]     Ответить | Цитировать Сообщить модератору
 Re: Вызов процедуры в цикле  [new]
aZm
Member

Откуда: 3й рим
Сообщений: 2355
stax..
aZm
declare 
  vDate date;
begin
  vDate:=sysdate; -- тут дата из интересного вам месяца.
  for cc in (select trunc(vDate,'mm')+rownum-1 dt
             from dual
             connect by rownum<add_months(trunc(vDate,'mm'),1)-trunc(vDate,'mm')+1)
    loop
      dbms_output.put_line(to_char(cc.dt,'dd.mm.yyyy'));
    end loop;
end;

[src oracle]
racle9i Enterprise Edition Release >>>9.2.0.6.0<<< - Production
SQL> declare
2 vDate date;
3 begin
4 vDate:=sysdate; -- тут дата из интересного вам месяца.
5 for cc in (select trunc(vDate,'mm')+rownum-1 dt
6 from dual
7 connect by rownum<add_months(trunc(vDate,'mm'),1)-trunc(vDate,'mm')+1)
8 loop
9 dbms_output.put_line(to_char(cc.dt,'dd.mm.yyyy'));
10 end loop;
11 end;
12 /
01.05.2009

PL/SQL procedure successfully completed.
.....
stax


в 10.2.0.4 работает ;) проверил в 9.2.0.8 - там нет.

Сообщение было отредактировано: 8 май 09, 14:40
8 май 09, 14:03    [7162362]     Ответить | Цитировать Сообщить модератору
 Re: Вызов процедуры в цикле  [new]
aZm
Member

Откуда: 3й рим
Сообщений: 2355
проверил чуть глубже :)

в 9ке начинает играть разница между sql и plsql энжином. в plsql в 9.х такой селект придется открывать open for и фетчить из рефкурсора.

Сообщение было отредактировано: 8 май 09, 14:38
8 май 09, 14:09    [7162408]     Ответить | Цитировать Сообщить модератору
 Re: Вызов процедуры в цикле  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116064
aZm
проверил чуть глубже :)

в 9ке начинает играть разница между sql и plsql энжином. в plsql в 9.х такой селект придется открывать open for и фетчить из рефкурсора.



У меня не на чем проверить, но по- моему в девятке штука работает, если ее
обернуть а ля select ..... from (наш селект)
8 май 09, 14:11    [7162433]     Ответить | Цитировать Сообщить модератору
 Re: Вызов процедуры в цикле  [new]
stax..
Guest
dmidek
aZm
проверил чуть глубже :)

в 9ке начинает играть разница между sql и plsql энжином. в plsql в 9.х такой селект придется открывать open for и фетчить из рефкурсора.



У меня не на чем проверить, но по- моему в девятке штука работает, если ее
обернуть а ля select ..... from (наш селект)

работает

главное чтоб шутка не перестала работать в 13-й версии
.....
stax
8 май 09, 14:13    [7162448]     Ответить | Цитировать Сообщить модератору
 Re: Вызов процедуры в цикле  [new]
Полночный
Member

Откуда:
Сообщений: 312
Может, я чего-то не понимаю, но почему свет клином сошелся на for-цикле? Да еще и с усложняющими элементами...
PROCEDURE for_Each_Day (p_Date_In_Month DATE, p_Client VARCHAR2)
IS
  v_Cur_Date DATE := trunc (p_Day_In_Month, 'mm');
BEGIN
  WHILE v_Cur_Date <= last_Day (p_Date_In_Month) LOOP
    get_Clients_Info (v_Cur_Date, p_Client);
    v_Cur_Date := v_Cur_Date + 1;
  END LOOP;
END;
8 май 09, 14:16    [7162471]     Ответить | Цитировать Сообщить модератору
 Re: Вызов процедуры в цикле  [new]
aZm
Member

Откуда: 3й рим
Сообщений: 2355
stax..

главное чтоб шутка не перестала работать в 13-й версии
.....
stax


мы столько не проживем, я во всяком случае

наши дба 11ю пока считаю сырой чтопипец, так что до светлого дня миграции на 13ю версию я точно не доживу :)
8 май 09, 14:19    [7162489]     Ответить | Цитировать Сообщить модератору
 Re: Вызов процедуры в цикле  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116064
stax..
dmidek
aZm
проверил чуть глубже :)

в 9ке начинает играть разница между sql и plsql энжином. в plsql в 9.х такой селект придется открывать open for и фетчить из рефкурсора.



У меня не на чем проверить, но по- моему в девятке штука работает, если ее
обернуть а ля select ..... from (наш селект)

работает

главное чтоб шутка не перестала работать в 13-й версии
.....
stax


Кстати, да, ЕМНИП официально она не документирована
как и вообще вопрос использования CONNECT BY без PRIOR -
в документации есть некоторые неоднозначные указания на то, что так делать не надо...

Но Том - наш гарант, он пользуется
8 май 09, 14:20    [7162495]     Ответить | Цитировать Сообщить модератору
 Re: Вызов процедуры в цикле  [new]
stax..
Guest
Полночный
Может, я чего-то не понимаю, но почему свет клином сошелся на for-цикле? Да еще и с усложняющими элементами...
PROCEDURE for_Each_Day (p_Date_In_Month DATE, p_Client VARCHAR2)
IS
  v_Cur_Date DATE := trunc (p_Day_In_Month, 'mm');
BEGIN
  WHILE v_Cur_Date <= last_Day (p_Date_In_Month) LOOP
    get_Clients_Info (v_Cur_Date, p_Client);
    v_Cur_Date := v_Cur_Date + 1;
  END LOOP;
END;


боюсь я етих цыклов

при изменениях
умельцы улучшат v_Cur_Date := v_Cur_Date + 1;
(напр обернут иф-ом)

.....
stax
8 май 09, 15:26    [7162875]     Ответить | Цитировать Сообщить модератору
 Re: Вызов процедуры в цикле  [new]
stax..
Guest
aZm
stax..

главное чтоб шутка не перестала работать в 13-й версии
.....
stax


мы столько не проживем, я во всяком случае

наши дба 11ю пока считаю сырой чтопипец, так что до светлого дня миграции на 13ю версию я точно не доживу :)

поменяется ДБА и будет Вам счастье


//////
stax
8 май 09, 15:29    [7162898]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить