Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / почему два раза выводится 100 / 6 сообщений из 6, страница 1 из 1
26.09.2019, 19:07
    #39867508
Albatross
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
почему два раза выводится 100
Код: 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.
CREATE TABLE a1 (I1 NUMBER, i2 NUMBER);

INSERT INTO a1 


SELECT 1, 1 FROM dual

UNION 

SELECT 2, 1 FROM dual

;
COMMIT;


CREATE TABLE a2 (i3 NUMBER, d NUMBER);

INSERT INTO a2 
SELECT 1, 100 FROM dual;
COMMIT;

BEGIN
FOR t IN (SELECT
  b.rowid,
a.*, b.* FROM a1 a
INNER JOIN a2 b
ON a.i2 = b.i3)

LOOP
  
dbms_output.put_line (t.d);
UPDATE a2
SET d = 200 WHERE ROWID = t.rowid;
END LOOP;

END;



я ожидал увидеть
100
200


а вижу
100
100

т.е. при открытии курсора for данные считываются и где-то сохраняются?
на это же куча памяти тратится, наверное.
...
Рейтинг: 0 / 0
26.09.2019, 19:48
    #39867523
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
почему два раза выводится 100
Albatross,

Tвой селект возвращает:

rowid1,1,1,100
rowid2,2,1,100

Посему первая итерация:

1. выберет первую строку: rowid1,1,1,100
2. dbms_output.put_line(t.d) выплюнет 100
3. update изменит d первой строки на 200

Bторая итерация:

1. выберет вторую строку: rowid2,2,1,100
2. dbms_output.put_line(t.d) выплюнет 100
3. update изменит d второй строки на 200

Больше вопросов нет?

SY.
...
Рейтинг: 0 / 0
26.09.2019, 19:57
    #39867527
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
почему два раза выводится 100
Albatrossт.е. при открытии курсора for данные считываются и где-то сохраняются?
на это же куча памяти тратится, наверное.

При открытии курсора ничего не считываeтся. Считывает FETCH. Kурсор хранит SCN момента открытия и посему FETCH ищет данные как они были на момент открытия курсора если надо роясь в UNDO. И если UDNO этого момента уже затерт то получишь ORA-01555 (snapshot too old).

SY.
...
Рейтинг: 0 / 0
27.09.2019, 07:45
    #39867676
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
почему два раза выводится 100
Albatrossт.е. при открытии курсора for данные считываются и где-то сохраняются?RTFM Multiversion Read Consistency + Statement-Level Read Consistency (FAQ)


P.S. Соломон, полагаешь, твой вольно-косноязычный пересказ лучше?
...
Рейтинг: 0 / 0
27.09.2019, 08:26
    #39867690
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
почему два раза выводится 100
SYПосему первая итерация:

1. выберет первую строку: rowid1,1,1,100
Или первые сто строк.
...
Рейтинг: 0 / 0
27.09.2019, 13:45
    #39867853
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
почему два раза выводится 100
-2-Или первые сто строк.

Ну да, начинаем пихать мат анализ изучающему арифметику.

SY.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / почему два раза выводится 100 / 6 сообщений из 6, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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