powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как обернуть курсор в цикл
4 сообщений из 4, страница 1 из 1
Как обернуть курсор в цикл
    #39493728
Nika31
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.

Пробую реализовать при помощи курсоров такую задачу:

1. Выбрать строку с max(Поле1) и строку с предшествующим максимальному значению Поля1 из одной и той же таблицы.
2. Затем произвести между ними арифметические операции
3. Результат записать в новую строку это же самой таблицы.
4. Поле1 у этой новой строки примет значение max(Поле1)+10.
5. Следующая интерация – снова берутся две строки этой же таблицы, но теперь максимальной будет та, что только что рассчитали, а предшествующая – та, что в предыдущей интерации была максимальной. Операции выполняются, пока пока значение «Поле1» не превысит заданного числа.


Написала процедуру, которая находит строку с max(Поле1), предшествующую, высчитывает данные для третьей строки и добавляет ее в таблицу.


CREATE OR REPLACE PROCEDURE insert_for_incl
IS
cur SYS_REFCURSOR;
BEGIN

INSERT INTO table (поле1, поле2,…)

WITH
a1
AS (SELECT строка с max(Поле1) … ),

a2
AS (SELECT строка предшествующая max(Поле1) …)
SELECT рассчитываю в селекте данные для инсерта новой макс. строки
FROM a1, a2
COMMIT;

END;

Подскажите, пожалуйста:
1. как обернуть эти курсоры в цикл, чтобы анализировать вновь и вновь добавленные максимальные значения и проводить дальнейший расчет?
2. В каком месте и как определить параметр для выхода из этого цикла?
...
Рейтинг: 0 / 0
Как обернуть курсор в цикл
    #39493825
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nika31Здравствуйте.


Подскажите, пожалуйста:
1. как обернуть эти курсоры в цикл, чтобы анализировать вновь и вновь добавленные максимальные значения и проводить дальнейший расчет?
2. В каком месте и как определить параметр для выхода из этого цикла?

зачем Вам ета морка с "курсорами"?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
SQL> select * from nika31;

     POLE1      POLE2
---------- ----------
         1        100
         2        200
         3        300
         3        400

SQL> declare
  2   v_max_pole1  nika31.pole1%type;
  3   v_pole2      nika31.pole2%type;
  4   v_prev_pole1 nika31.pole1%type;
  5   v_prev_pole2 nika31.pole2%type;
  6   v_calc       nika31.pole2%type;
  7   v_max_p5     nika31.pole1%type :=50;
  8  begin
  9  --п1
 10   select nvl(max(pole1),0),max(pole2) KEEP (DENSE_RANK LAST ORDER BY pole1)
 11   into v_max_pole1,v_pole2
 12   from nika31;
 13  --п2
 14   select nvl(max(pole1),0),max(pole2) KEEP (DENSE_RANK LAST ORDER BY pole1)
 15   into v_prev_pole1,v_prev_pole2
 16   from nika31 where pole1<v_max_pole1;
 17  --
 18   while(v_max_pole1<=v_max_p5) loop
 19     --произвести между ними арифметические операции
 20     v_calc:=v_max_pole1+v_prev_pole2+sin(v_prev_pole1);
 21  --п3
 22     insert into nika31(pole1,pole2) values(v_max_pole1+10,v_calc);
 23  --п4
 24     v_prev_pole1:=v_max_pole1;
 25     v_prev_pole2:=v_pole2;
 26     v_max_pole1:=v_max_pole1+10;
 27     v_pole2:=v_calc;
 28  --п5
 29   end loop;
 30  -- rollback;
 31  -- commit;
 32  end;
 33  /

PL/SQL procedure successfully completed.

SQL> select * from nika31;

     POLE1      POLE2
---------- ----------
         1        100
         2        200
         3        300
         3        400
        13 203,909297
        23  413,14112
        33 227,329464
        43   445,2949
        53 271,329376

9 rows selected.

SQL>



.....
stax
...
Рейтинг: 0 / 0
Как обернуть курсор в цикл
    #39493987
Фотография Vladimir Filin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nika31Подскажите, пожалуйста:
1. как обернуть эти курсоры в цикл, чтобы ...
Почитать можно тут: Cursors
Если уж заморачиваться с курсорами, то для "оборачивания в цикл" imho Explicit Cursors
Поддержу stax.. -- для Вашей задачи это избыточно.
...
Рейтинг: 0 / 0
Как обернуть курсор в цикл
    #39496062
Alpdr&#252;cken
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
with t as
 (select level * 10 f1, level * 100 f2, level * 100 f3 from dual connect by level < 11)
select * from (select * from (select * from t order by f1 desc nulls last) where rownum < 3 order by f1)
model
  return all rows
  dimension by(rownum id) measures(f1, f2, f3)
rules
  upsert
  sequential order
  iterate (100) until f1 [ iteration_number + 3 ] >= 200
(
 f1 [ iteration_number + 3 ] = 0,
 f1 [ id > 2 ] = f1 [ cv(id) - 1 ] + 10, -- id = 4 {110 + 10}
 f2 [ id > 2 ] = f2 [ cv(id) - 1 ] + f2 [ cv(id) - 2 ] - f3 [ cv(id) - 1 ] + f3 [ cv(id) - 2 ], --id = 4 {1800 + 1000 - 200 + 1000}
 f3 [ id > 2 ] = f3 [ cv(id) - 1 ] - f3 [ cv(id) - 2 ] + f2 [ cv(id) - 1 ] - f2 [ cv(id) - 2 ]  --id = 4 {200 - 1000 + 1800 - 1000}
)
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как обернуть курсор в цикл
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]