powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / JOINED UPDATE
35 сообщений из 35, показаны все 2 страниц
JOINED UPDATE
    #32103698
kreek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Под руками нет доки, поэтому и спрашиваю.
Приведите, пжл, пример обновления с использованием выборки из нескольких таблиц, подчиненный запрос тормозит.
...
Рейтинг: 0 / 0
JOINED UPDATE
    #32103699
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Текст запроса совего давай и план выполнения. Посмотрим где тормоза
...
Рейтинг: 0 / 0
JOINED UPDATE
    #32103703
kreek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
update invent_karta a
set a.stoim_bux_id =
(select b.analitic_id
from v_metapos_saldo b,
v_metadoc_saldo c
where
b.doc_id = c.id
and a.obj_id = b.object_code_4
and c.Number like 'X0-%')
...
Рейтинг: 0 / 0
JOINED UPDATE
    #32103707
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы посоветовал вначала просто отдельно посмотреть план выполнения подзапроса. Хотя уже и так видно, что используется Like - который никак не оптимизируется, естественно приводит к FULL SCAN.
Вобщем жду план вып. подзапроса
...
Рейтинг: 0 / 0
JOINED UPDATE
    #32103714
kreek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
оракл юзаю редко, планы ни разу не смотрел, инструмент PL/SQL Developer 5.0.2.500 построил графический план, а как его взять в тексте догнать не могу, помогите.
...
Рейтинг: 0 / 0
JOINED UPDATE
    #32103722
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если ты хочешь добиться результатов в написании хороших запросов , без планов запроса тебе не обойтись. Тебе надо почитать литературу для начала.
...
Рейтинг: 0 / 0
JOINED UPDATE
    #32103738
kreek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за совет, поддерживаю 100%.
Моя таргет БД = MSSQL (там я этим и занимаюсь), а с ораклом меня "попросили" поапдейтить кой-какие данные, мне бы просто пример обновления с запросом из нескольких таблиц или этого оракл не умеет?
...
Рейтинг: 0 / 0
JOINED UPDATE
    #32103747
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если ты говоришь, что тормозит - значит уже умеет, не так ли?
А то что тормозит - это множество причин.
...
Рейтинг: 0 / 0
JOINED UPDATE
    #32103752
kreek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А ведь в моем примере вложенный запрос, а не джойнед, а мне бы просто синтаксис со словами UPDATE & INNER JOIN
...
Рейтинг: 0 / 0
JOINED UPDATE
    #32103753
kreek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А ведь в моем примере вложенный запрос, а не джойнед, а мне бы просто синтаксис со словами UPDATE & INNER JOIN
...
Рейтинг: 0 / 0
JOINED UPDATE
    #32103762
.dba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Моя таргет БД = MSSQL (там я этим и занимаюсь), а с ораклом
>меня "попросили" поапдейтить кой-какие данные, мне бы просто пример
>обновления с запросом из нескольких таблиц или этого оракл не умеет?

Никакой принципиальной разницы в порядке доступа к данным между mssql и oracle нет и быть не может. Если есть предикат в where и селективный индекс, то он будет использоваться. Т.к. у вас не OLAP запрос, обычный для OLTP систем, то создайте необходимые индексы и вставьте для перестраховки в свой подзапрос хинт /*+ rule */
Код: plaintext
select  /*+ rule */  b.analitic_id ...


Что касается плана выполнения в PL/SQL Developer 5.0.2.500, то никакой он не графический (как кстате в mssql EE), а обычный текстовый. Все что надо сделать - это вызвать правое контекстное меню находясь мышью на плане - там только одна опция - "COPY"
...
Рейтинг: 0 / 0
JOINED UPDATE
    #32103764
.dba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
Т.к. у вас не OLAP запрос, обычный для OLTP 


надо читать:

"Т.к. у вас не OLAP запрос, а обычный для OLTP"

Код: plaintext
как кстате в mssql EE


надо читать:

как кстате в mssql EM
...
Рейтинг: 0 / 0
JOINED UPDATE
    #32103769
kreek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасиб, признаюсь - поленился проверить.
А вот и сам план.

Код: plaintext
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.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
UPDATE STATEMENT, GOAL = ALL_ROWS			 25 	 33326 	 866476 
 UPDATE	FORTMETA	INVENT_KARTA			
  TABLE ACCESS FULL	FORTMETA	INVENT_KARTA	 25 	 33326 	 866476 
 FILTER					
  SORT AGGREGATE				 1 	 39 
   TABLE ACCESS FULL	FORTMETA	OBJECTEVENTS	 1 	 1 	 39 
  NESTED LOOPS OUTER			 64777 	 428130450237797 	 2 .17918399171039E17
   INDEX UNIQUE SCAN	FORTMETA	PK_METABC		 1226 	 8582 
   NESTED LOOPS OUTER			 64777 	 34920917637667 	 1 .75303006541088E16
    INDEX UNIQUE SCAN	FORTMETA	PK_MOL		 1226 	 15938 
    NESTED LOOPS OUTER			 64777 	 2848361960658 	 1 .39284899876176E15
     INDEX UNIQUE SCAN	FORTMETA	PK_DIVISION		 1226 	 15938 
     NESTED LOOPS OUTER			 64777 	 232329686840 	 110588930935840 
      INDEX UNIQUE SCAN	FORTMETA	PK_DIVISION		 1226 	 15938 
      NESTED LOOPS OUTER			 64777 	 18950219155 	 8773951468765 
       INDEX UNIQUE SCAN	FORTMETA	PK_METABC		 1226 	 8582 
       NESTED LOOPS OUTER			 64777 	 1545694874 	 704836862544 
        INDEX UNIQUE SCAN	FORTMETA	PK_METABC		 1226 	 8582 
        FILTER					
         NESTED LOOPS OUTER					
          TABLE ACCESS BY INDEX ROWID	FORTMETA	METAANSCH	 1 	 195461 	 6450213 
           INDEX UNIQUE SCAN	FORTMETA	PK_METAANSCH		 195461 	
          NESTED LOOPS OUTER			 275 	 64502 	 26832832 
           TABLE ACCESS BY INDEX ROWID	FORTMETA	METAANSCH	 1 	 195461 	 6450213 
            INDEX UNIQUE SCAN	FORTMETA	PK_METAANSCH		 195461 	
           NESTED LOOPS OUTER			 242 	 33 	 12639 
            INDEX UNIQUE SCAN	FORTMETA	PK_KOD_TYPE_PROV		 82 	 1066 
            NESTED LOOPS OUTER			 242 	 33 	 12210 
             INDEX UNIQUE SCAN	FORTMETA	PK_KOD_MONTH		 82 	 1066 
             NESTED LOOPS OUTER			 242 	 33 	 11781 
              TABLE ACCESS BY INDEX ROWID	FORTMETA	PERIOD	 1 	 82 	 2132 
               INDEX UNIQUE SCAN	FORTMETA	SYS_C003008		 82 	
              NESTED LOOPS			 209 	 33 	 10923 
               TABLE ACCESS BY INDEX ROWID	FORTMETA	METAPOS_PROVODKA	 6 	 660 	 42900 
                INDEX RANGE SCAN	FORTMETA	METAPOS_PROVODKA_IDX1	 2 	 660 	
               NESTED LOOPS OUTER			 179 	 5 	 1330 
                INDEX UNIQUE SCAN	FORTMETA	SYS_C003014		 246 	 3198 
                NESTED LOOPS			 179 	 2 	 506 
                 NESTED LOOPS OUTER			 137 	 1 	 240 
                  NESTED LOOPS OUTER			 137 	 1 	 227 
                   NESTED LOOPS OUTER			 137 	 1 	 214 
                    NESTED LOOPS			 136 	 1 	 188 
                     FILTER					
                      NESTED LOOPS OUTER					
                       NESTED LOOPS OUTER			 131 	 5 	 680 
                        TABLE ACCESS FULL	FORTMETA	METADOC_SALDO	 1 	 5 	 550 
                        INDEX FULL SCAN	FORTMETA	PK_OBJDEPEND	 26 	 1 	 26 
                       INDEX RANGE SCAN	FORTMETA	PK_OBJECTEVENTS	 2 	 9 	 351 
                     INDEX UNIQUE SCAN	FORTMETA	PK_KOD_STATUS		 5 	 65 
                    TABLE ACCESS BY INDEX ROWID	FORTMETA	PERIOD	 1 	 82 	 2132 
                     INDEX UNIQUE SCAN	FORTMETA	SYS_C003008		 82 	
                   INDEX UNIQUE SCAN	FORTMETA	PK_KOD_MONTH		 82 	 1066 
                  INDEX UNIQUE SCAN	FORTMETA	SYS_C003011		 82 	 1066 
                 VIEW	SYS	VW_NSO_1		 173 	 2249 
                  SORT UNIQUE			 42 	 173 	 2249 
                   VIEW	FORTMETA	V_MOL_DIV_TEK_CUR	 41 	 173 	 2249 
                    SORT UNIQUE			 41 	 173 	 23874 
                     UNION-ALL					
                      VIEW	FORTMETA	PROB_CUR_TEK8	 17 	 13 	 1794 
                       SORT UNIQUE			 17 	 13 	 1782 
                        UNION-ALL					
                         NESTED LOOPS			 6 	 1 	 186 
                          NESTED LOOPS			 3 	 1 	 173 
                           NESTED LOOPS			 1 	 2 	 320 
                            TABLE ACCESS FULL	FORTMETA	MOL	 1 	 4 	 212 
                            INDEX UNIQUE SCAN	FORTMETA	PK_DIVISION		 62 	 6634 
                           VIEW	FORTMETA		 1 	 13 	 169 
                            FILTER					
                             CONNECT BY					
                              NESTED LOOPS			 2 	 82 	 1066 
                               INDEX UNIQUE SCAN	FORTMETA	PK_DIVISION	 1 	 1 	 13 
                               TABLE ACCESS FULL	SYS	DUAL	 1 	 82 	
                              TABLE ACCESS BY USER ROWID	FORTMETA	DIVISION			
                              TABLE ACCESS BY INDEX ROWID	FORTMETA	DIVISION	 1 	 13 	 338 
                               INDEX RANGE SCAN	FORTMETA	INDX_KIND_SUBKIND	 2 	 13 	
                          VIEW	FORTMETA	PROB5	 3 	 13 	 169 
                           SORT UNIQUE			 3 	 13 	 1391 
                            FILTER					
                             CONNECT BY					
                              NESTED LOOPS			 1 	 12 	 792 
                               TABLE ACCESS FULL	FORTMETA	OBJECTUSERMOL	 1 	 1 	 53 
                               INDEX UNIQUE SCAN	FORTMETA	PK_DIVISION		 1226 	 15938 
                              TABLE ACCESS BY USER ROWID	FORTMETA	DIVISION			
                              TABLE ACCESS BY INDEX ROWID	FORTMETA	DIVISION	 1 	 13 	 1391 
                               INDEX RANGE SCAN	FORTMETA	INDX_KIND_SUBKIND	 2 	 13 	
                         NESTED LOOPS OUTER			 8 	 12 	 1596 
                          VIEW	FORTMETA	PROB_CUR5	 7 	 1 	 107 
                           SORT UNIQUE			 7 	 1 	 133 
                            NESTED LOOPS			 6 	 1 	 133 
                             HASH JOIN			 3 	 1 	 120 
                              TABLE ACCESS BY INDEX ROWID	FORTMETA	DIVISION	 1 	 4 	 428 
                               INDEX RANGE SCAN	FORTMETA	PK_DIVISION	 2 	 4 	
                              VIEW	FORTMETA		 1 	 13 	 169 
                               FILTER					
                                CONNECT BY					
                                 NESTED LOOPS			 2 	 82 	 1066 
                                  INDEX UNIQUE SCAN	FORTMETA	PK_DIVISION	 1 	 1 	 13 
                                  TABLE ACCESS FULL	SYS	DUAL	 1 	 82 	
                                 TABLE ACCESS BY USER ROWID	FORTMETA	DIVISION			
                                 TABLE ACCESS BY INDEX ROWID	FORTMETA	DIVISION	 1 	 13 	 338 
                                  INDEX RANGE SCAN	FORTMETA	INDX_KIND_SUBKIND	 2 	 13 	
                             VIEW	FORTMETA	PROB5		 13 	 169 
                              SORT UNIQUE			 3 	 13 	 1391 
                               FILTER					
                                CONNECT BY					
                                 NESTED LOOPS			 1 	 12 	 792 
                                  TABLE ACCESS FULL	FORTMETA	OBJECTUSERMOL	 1 	 1 	 53 
                                  INDEX UNIQUE SCAN	FORTMETA	PK_DIVISION		 1226 	 15938 
                                 TABLE ACCESS BY USER ROWID	FORTMETA	DIVISION			
                                 TABLE ACCESS BY INDEX ROWID	FORTMETA	DIVISION	 1 	 13 	 1391 
                                  INDEX RANGE SCAN	FORTMETA	INDX_KIND_SUBKIND	 2 	 13 	
                          TABLE ACCESS FULL	FORTMETA	MOL	 1 	 1226 	 31876 
                      VIEW	FORTMETA	PROB_CUR93	 18 	 160 	 22080 
                       SORT UNIQUE			 18 	 160 	 21226 
                        UNION-ALL					
                         HASH JOIN OUTER			 6 	 159 	 21147 
                          VIEW	FORTMETA	PROB_CUR9	 3 	 13 	 1391 
                           SORT UNIQUE			 3 	 13 	 1391 
                            FILTER					
                             CONNECT BY					
                              NESTED LOOPS			 2 	 12 	 948 
                               NESTED LOOPS			 2 	 1 	 66 
                                TABLE ACCESS FULL	FORTMETA	OBJECTUSERMOL	 1 	 1 	 53 
                                VIEW	FORTMETA			 13 	 169 
                                 CONNECT BY					
                                  NESTED LOOPS			 2 	 82 	 1066 
                                   INDEX UNIQUE SCAN	FORTMETA	PK_DIVISION	 1 	 1 	 13 
                                   TABLE ACCESS FULL	SYS	DUAL	 1 	 82 	
                                  TABLE ACCESS BY USER ROWID	FORTMETA	DIVISION			
                                  TABLE ACCESS BY INDEX ROWID	FORTMETA	DIVISION	 1 	 13 	 338 
                                   INDEX RANGE SCAN	FORTMETA	INDX_KIND_SUBKIND	 2 	 13 	
                               INDEX UNIQUE SCAN	FORTMETA	PK_DIVISION		 1226 	 15938 
                              TABLE ACCESS BY USER ROWID	FORTMETA	DIVISION			
                              TABLE ACCESS BY INDEX ROWID	FORTMETA	DIVISION	 1 	 13 	 1391 
                               INDEX RANGE SCAN	FORTMETA	PK_DIVISION	 1 	 13 	
                          TABLE ACCESS FULL	FORTMETA	MOL	 1 	 1226 	 31876 
                         NESTED LOOPS			 6 	 1 	 79 
                          VIEW	FORTMETA	PROB_CUR9		 13 	 169 
                           SORT UNIQUE			 3 	 13 	 1391 
                            FILTER					
                             CONNECT BY					
                              NESTED LOOPS			 2 	 12 	 948 
                               NESTED LOOPS			 2 	 1 	 66 
                                TABLE ACCESS FULL	FORTMETA	OBJECTUSERMOL	 1 	 1 	 53 
                                VIEW	FORTMETA			 13 	 169 
                                 CONNECT BY					
                                  NESTED LOOPS			 2 	 82 	 1066 
                                   INDEX UNIQUE SCAN	FORTMETA	PK_DIVISION	 1 	 1 	 13 
                                   TABLE ACCESS FULL	SYS	DUAL	 1 	 82 	
                                  TABLE ACCESS BY USER ROWID	FORTMETA	DIVISION			
                                  TABLE ACCESS BY INDEX ROWID	FORTMETA	DIVISION	 1 	 13 	 338 
                                   INDEX RANGE SCAN	FORTMETA	INDX_KIND_SUBKIND	 2 	 13 	
                               INDEX UNIQUE SCAN	FORTMETA	PK_DIVISION		 1226 	 15938 
                              TABLE ACCESS BY USER ROWID	FORTMETA	DIVISION			
                              TABLE ACCESS BY INDEX ROWID	FORTMETA	DIVISION	 1 	 13 	 1391 
                               INDEX RANGE SCAN	FORTMETA	PK_DIVISION	 1 	 13 	
                          HASH JOIN			 3 	 1 	 66 
                           TABLE ACCESS FULL	FORTMETA	MOL	 1 	 4 	 212 
                           TABLE ACCESS FULL	FORTMETA	OBJECTUSERMOL	 1 	 5 	 65 


Понимаю, что без индексов не обойтись, но БД не моя
...
Рейтинг: 0 / 0
JOINED UPDATE
    #32103772
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуй избавится от соотнесенного запроса, переписав все на pl/sql, к примеру:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
begin
  for i in (
    select b.object_code_4
         , b.analitic_id
    from v_metapos_saldo b
       , v_metadoc_saldo c
    where b.doc_id = c.id
      and a.obj_id = b.object_code_4
      and c.Number like 'X0-%'  
  ) loop   
  update invent_karta a set 
    a.stoim_bux_id = i.nalitic_id
  where a.obj_id = i.object_code_4  
  end loop;
end;
/

Что следует учесть: в данном случае значения invent_karta, для которых не нашлось записей invent_karta.stoim_bux_id = v_metapos_saldo.analitic_id не изменятся, когда как в твоем первоначальном запросе они станут null.
...
Рейтинг: 0 / 0
JOINED UPDATE
    #32103781
kreek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Через курсор - это вариант.
А для invent_karta гарантированно есть запись в v_metapos_saldo удовлетворяющая указанному предикату, и даже, предположим не одна, а вот как это оракл разруливает - непонятно.
Но начать запрос запрос с "другой стороны" действительно выгоднее, т.к. выборка из invent_karta легче, чем из v_metapos_saldo в которой записей на порядок больше и еще джойнится с другой таблицей.
Одним словом - спасибо.
...
Рейтинг: 0 / 0
JOINED UPDATE
    #32103783
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"А вот и сам план. "

Какой ужас :(
...
Рейтинг: 0 / 0
JOINED UPDATE
    #32103785
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, может в этом и корень твоей проблемы. Насколько помню, в MSSQL и Sybase подобный запрос не требовал бы никакого соотнесения, а выглядел бы примерно так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
update invent_karta a set 
    a.stoim_bux_id = b.nalitic_id
from v_metapos_saldo b
   , v_metadoc_saldo c
where b.doc_id = c.id
  and a.obj_id = b.object_code_4
  and c.Number like 'X0-%'      
  and a.obj_id = b.object_code_4

В данном случае единожды выполняется запрос на выборку условий, а потом изменяется требуемая таблица. В Оракле такой синтаксис не предусмотрен, по крайней мере пока, вплоть до 9i, если не ошибаюсь. Хотя м.б. есть что-нибудь другое, позволяющее решить данную задачу только на SQL в понимании Oracle:)
...
Рейтинг: 0 / 0
JOINED UPDATE
    #32103790
kreek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Denis Popov, ты попал в самую точку. Именно этого я и хотел, но такой запрос в 8i не проходит, а на MSSQL2K на ура (конечно только на join заменить бы для читабельности)
...
Рейтинг: 0 / 0
JOINED UPDATE
    #32103791
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to Kreek:
Чего-то тебя зациклило на JOIN(INNER JOIN). В Oracle8i нет такой конструкции. Она только в 9i появилась. Используй "+"
...
Рейтинг: 0 / 0
JOINED UPDATE
    #32103792
.dba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
имхо вы правильно подметили проблему, но решение ее не в переписывании sql запроса, а в создании индекса по полям по которым соединяются таблицы:
Код: plaintext
a.obj_id = b.object_code_4 
, для избежания вот этого момента:
Код: plaintext
1.
UPDATE	FORTMETA	INVENT_KARTA			
  TABLE ACCESS FULL	FORTMETA	INVENT_KARTA	 25 	 33326 	 866476 
...
Рейтинг: 0 / 0
JOINED UPDATE
    #32103859
kreek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Денис, в твоем примере в переменную i запихиваются значения двух полей, тогда какой тип у этой переменной (указатель на курсор?? и почему ее заранее объявлять не надо).
Вопрос, наверное, ламерский, но у меня мало опыта по работе с pl/sql.
...
Рейтинг: 0 / 0
JOINED UPDATE
    #32103874
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"в переменную i запихиваются значения двух полей, тогда какой тип у этой переменной"

Во-первых в переменную i - не запихиваются значения каких либо полей. В данном случае i - это внутренняя переменная цикла, которая существует только внутри цикла.
Во-вторых, её обьявлять не надо потому-что это так предусмотрено синтаксисом PL/SQL.

Тип ествественно целый
...
Рейтинг: 0 / 0
JOINED UPDATE
    #32103881
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это такой вот оракловый синтаксис. Можно написать по-другому, более похоже на T-SQL:
Код: plaintext
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.
declare 
  cursor cr is 
    select b.object_code_4
         , b.analitic_id
    from v_metapos_saldo b
       , v_metadoc_saldo c
    where b.doc_id = c.id
      and a.obj_id = b.object_code_4
      and c.Number like 'X0-%';
  i cr%rowtype;
begin
  open cr;
  loop
    fetch cr into i;
    exit when cr%notfound;
    update invent_karta a set 
      a.stoim_bux_id = i.nalitic_id
    where a.obj_id = i.object_code_4;
  end loop;
  close cr;
exception when others then
  if cr%isopen then close cr; end if;
  raise;
end;    
/
...
Рейтинг: 0 / 0
JOINED UPDATE
    #32103884
kreek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
С "запихиваются" - погорячился. Т.е. эта внутренняя переменная (не требующая объявления) есть указатель на запись в курсоре (открытом неявно)? я правильно понял?
...
Рейтинг: 0 / 0
JOINED UPDATE
    #32103887
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Угу, все правильно.
...
Рейтинг: 0 / 0
JOINED UPDATE
    #32103889
kreek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Денису спасибо.
Мне начинает нравиться оракл:)
...
Рейтинг: 0 / 0
JOINED UPDATE
    #32103890
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to Denis Popov: откуда такие синтаксические навороты? Это в 9i?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
begin
  for i in (
    select b.object_code_4
         , b.analitic_id
    from v_metapos_saldo b
       , v_metadoc_saldo c
    where b.doc_id = c.id
      and a.obj_id = b.object_code_4
      and c.Number like 'X0-%'  
  ) loop   
  update invent_karta a set 
    a.stoim_bux_id = i.nalitic_id
  where a.obj_id = i.object_code_4  
  end loop;
end;
/
...
Рейтинг: 0 / 0
JOINED UPDATE
    #32103899
kreek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
у меня в 8I работает, только в первом предикате исключить and a.obj_id = b.object_code_4, думаю очепятка.
...
Рейтинг: 0 / 0
JOINED UPDATE
    #32103900
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я кажется тормознул. i - это курсорная переменная конечно-же. Но я не знал, что курсор можно прямо в самом цикле описывать. В 8.0.X - этого вроде не было.
...
Рейтинг: 0 / 0
JOINED UPDATE
    #32103917
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это еще в 7-ке было, сам подобные конструкции на 7.3.4 писал.
...
Рейтинг: 0 / 0
JOINED UPDATE
    #32103920
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда странно. Зачем тогда писать такие громоздкие выражения.
Почему бы не описать курсор отдельно.
...
Рейтинг: 0 / 0
JOINED UPDATE
    #32103988
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не совсем понял, а какой код кажется более громоздким, с for i in (select ...) или с явным объявлением курсора? ИМХО есть задачи, для решения которых лучше подходит один из вышеописанных медотов, есть задачи, где метод безразличен. К примеру, явный феч из задекларируемого курсора никогда не возвратит exception наподобе no_data_found или dup_val_on_index, и подчас выражения select ... into ... обертывают в такие конструкции, если подобные исключения следует игнорировать, по постановке задачи. Ну а код через for - это для "ленивых", поэтому сам часто им пользуюсь:)
...
Рейтинг: 0 / 0
JOINED UPDATE
    #32104023
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я имею ввиду только это
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
declare
 cursor my_cur is 
    select b.object_code_4
         , b.analitic_id
    from v_metapos_saldo b
       , v_metadoc_saldo c
    where b.doc_id = c.id
      and a.obj_id = b.object_code_4
      and c.Number like 'X0-%' ; 
  
begin
  for i in my_cur loop   
   update invent_karta a set a.stoim_bux_id = i.nalitic_id 
     where a.obj_id = i.object_code_4;  
  end loop;
end;
/
...
Рейтинг: 0 / 0
JOINED UPDATE
    #32104025
kreek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[q] Ну а код через for - это для "ленивых", поэтому сам часто им пользуюсь:)[/q]
Поэтому мне и начинает нравится оракл.
А лень это нормально, особенно для программеров, т.е. программистов :).
...
Рейтинг: 0 / 0
JOINED UPDATE
    #32104038
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На мой взгляд, Oracle PL/SQL более формализован и требователен, нежели Sybase или MSSQL T-SQL, с которым пришлось работать. Конкретно- Sybase 11.9.2 и 12.0. Он него осталось впечатление этакого разгильдяйства, причем в хорошем смысле: объявление переменных где вздумается, да хотя бы просто select без указания "откуда". Но это уже офтопик и тема для "Сравнения СУБД".
...
Рейтинг: 0 / 0
35 сообщений из 35, показаны все 2 страниц
Форумы / Oracle [игнор отключен] [закрыт для гостей] / JOINED UPDATE
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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