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

Код: 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.
63.
64.
65.
procedure get_PrebivanieTB(
   cur_viborka out t_cursor
   ,xdate in date
 )
 is
  CURSOR cr IS
   SELECT * 
   FROM (
    SELECT 
      TRIM(obv.numopzn) numopzn
     ,slv.namvrr namvrr  
     ,jdk.numdoc numdoc
     ,obj.ABBROBJR  mesto
     ,SUBSTR(loc.coord, 1, 7) lat
     ,SUBSTR(loc.coord, 8, 8) lng
     ,obv.dateizm dateizm
    FROM
     . . .
     ,( SELECT . . .  FROM . . .   WHERE . . .) pv
     ,( SELECT . . .  FROM . . .   WHERE . . .) svyaz
     ,( SELECT . . .  FROM . . .   WHERE . . .  AND jdc.codformuv = sfu.codformuv (+) ) jdk
    WHERE 
      obv.DEL IS NULL
     AND obv.coddoc = jdk.coddoc (+)
      . . . 
     AND TRUNC(obv.dateizm) <= xdate
    ORDER BY
      obv.numopzn
   );
  
  TYPE vr_type IS VARRAY(200) OF cr%ROWTYPE;
  vr_tab vr_type := vr_type();
  xrow cr%ROWTYPE;

 BEGIN

  xrow.numopzn := '#';
  
  FOR cr_row IN cr LOOP

    -- Обработка информации по новому ТБ ?
   IF xrow.numopzn <> cr_row.numopzn THEN
    -- Да. Обработка 1-ой строки курсора? 
    IF xrow.numopzn <> '#' THEN
      -- Нет. Перепись найденной строки в VARRAY
      vr_tab.EXTEND;
      vr_tab(vr_tab.last):= xrow;
    END IF;
    xrow := cr_row; -- Новый ТБ

   -- Нет. Обработка информации по текущему ТБ
   ELSE
    -- Более позднее состояние ТБ?
    IF xrow.dateizm < cr_row.dateizm THEN
      -- Да.
      xrow:=cr_row;
    END IF;   
   END IF; 
  END LOOP;

  open cur_viborka for 
  SELECT *
  FROM (vr_tab);

 end get_PrebivanieTB; 




С уважением,
Владимир
...
Рейтинг: 0 / 0
Oracle 8.1.7 курсоры и VARRAY
    #39374512
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извините, но не получилось выделение исходников, повторю суть:

Код: 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.
 xrow.numopzn := '#';

 FOR cr_row IN cr LOOP

   -- Обработка информации по новому ТБ ?
   IF xrow.numopzn <> cr_row.numopzn THEN
      -- Да. Обработка 1-ой строки курсора? 
      IF xrow.numopzn <> '#' THEN
         -- Нет. Перепись найденной строки в VARRAY
         vr_tab.EXTEND;
         vr_tab(vr_tab.last):= xrow;
      END IF;
     xrow := cr_row; -- Новый ТБ

   -- Нет. Обработка информации по текущему ТБ
   ELSE
     -- Более позднее состояние ТБ?
     IF xrow.dateizm < cr_row.dateizm THEN
        -- Да.
        xrow:=cr_row;
     END IF; 
   END IF; 
 END LOOP;

 open cur_viborka for 
 SELECT *
 FROM (vr_tab);
...
Рейтинг: 0 / 0
Oracle 8.1.7 курсоры и VARRAY
    #39374542
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чудак, ты можешь объяснить, зачем ты "изучаешь" пятнадцатилетнее старьё, которого больше ни у кого нет?
...
Рейтинг: 0 / 0
Oracle 8.1.7 курсоры и VARRAY
    #39374544
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Elic, сегодня, 20:52 [20045126]

>Чудак, ты можешь объяснить...
Ближайшие нцать лет объектовая система не будет заменена, да и наворочено на ней достаточно. Надо сопровождать и по-мелочи модернизировать.
...
Рейтинг: 0 / 0
Oracle 8.1.7 курсоры и VARRAY
    #39374599
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ошибка здесь.

Код: plsql
1.
2.
3.
 open cur_viborka for 
 SELECT *
 FROM TABLE(vr_tab);


Подскажите, как правильно
...
Рейтинг: 0 / 0
Oracle 8.1.7 курсоры и VARRAY
    #39374632
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеевПодскажите, как правильно

C типaми как было - так и остaлось. PL/SQLные типа SQL не кушает. Исключение pipelined package function где oracle втихаря создает из record type object type а из PL/SQL collection type SQL collection type. Правда не помню пoявилось ли это исключение в 8.1.7 или позже.

Так-что либо пробуй pipelined package function либо что-то типа:

Код: 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.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
CREATE OR REPLACE
  TYPE CR_OBJ_TYPE
    AS OBJECT(
              перечислeние атрибутов cr%ROWTYPE
             )
/
CREATE OR REPLACE
  TYPE CR_OBJ_TBL_TYPE
    AS TABLE OF CR_OBJ_TYPE
/
procedure get_PrebivanieTB(
   cur_viborka out t_cursor
   ,xdate in date
 )
 is
  CURSOR cr IS
   SELECT CR_OBJ_TYPE(numopzn,
                      namvrr,  
                      numdoc,
                      mesto,
                      lat,
                      lng,
                      dateizm
                    ) x
   FROM (
    SELECT 
      TRIM(obv.numopzn) numopzn
     ,slv.namvrr namvrr  
     ,jdk.numdoc numdoc
     ,obj.ABBROBJR  mesto
     ,SUBSTR(loc.coord, 1, 7) lat
     ,SUBSTR(loc.coord, 8, 8) lng
     ,obv.dateizm dateizm
    FROM
     . . .
     ,( SELECT . . .  FROM . . .   WHERE . . .) pv
     ,( SELECT . . .  FROM . . .   WHERE . . .) svyaz
     ,( SELECT . . .  FROM . . .   WHERE . . .  AND jdc.codformuv = sfu.codformuv (+) ) jdk
    WHERE 
      obv.DEL IS NULL
     AND obv.coddoc = jdk.coddoc (+)
      . . . 
     AND TRUNC(obv.dateizm) <= xdate
    ORDER BY
      obv.numopzn
   );
  
  vr_tab CR_OBJ_TBL_TYPE := CR_OBJ_TBL_TYPE();
  xrow CR_OBJ_TYPE;

 BEGIN

  xrow.numopzn := '#';
  
  FOR cr_row IN cr LOOP

    -- Обработка информации по новому ТБ ?
   IF xrow.numopzn <> cr_row.x.numopzn THEN
    -- Да. Обработка 1-ой строки курсора? 
    IF xrow.numopzn <> '#' THEN
      -- Нет. Перепись найденной строки в VARRAY
      vr_tab.EXTEND;
      vr_tab(vr_tab.last):= cr_row.x;
    END IF;
    xrow := cr_row.x; -- Новый ТБ

   -- Нет. Обработка информации по текущему ТБ
   ELSE
    -- Более позднее состояние ТБ?
    IF xrow.dateizm < cr_row.x.dateizm THEN
      -- Да.
      xrow:=cr_row.x;
    END IF;   
   END IF; 
  END LOOP;

  open cur_viborka for 
  SELECT *
  FROM table(vr_tab);

 end get_PrebivanieTB; 



SY.
...
Рейтинг: 0 / 0
Oracle 8.1.7 курсоры и VARRAY
    #39374639
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>SY,сегодня, 02:22 [20045690]

Большое спасибо за помощь.
Здесь на строке TYPE CR_OBJ_TBL_TYPE AS TABLE OF CR_OBJ_TYPE;
возникает ошибка компиляции

Îøèáêà: PLS-00103: Encountered the symbol "TABLE" when expecting one of the following:

object opaque
Ñòðîêà: 587
Òåêñò: TYPE CR_OBJ_TBL_TYPE AS TABLE OF CR_OBJ_TYPE;


Код: 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.
 -- Цикл по курсору 3
 procedure get_PrebivanieTB(
   cur_viborka out t_cursor
  ,xdate in date
 )
 is
  TYPE CR_OBJ_TYPE AS OBJECT(
    numopzn VARCHAR2(30)
   ,namvrr VARCHAR2(55)
   ,numdoc VARCHAR2(20)
   ,mesto VARCHAR2(255)
   ,lat VARCHAR2(7)
   ,lng VARCHAR2(8)
   ,dateizm DATE 
  );
  [color=yellow]TYPE CR_OBJ_TBL_TYPE AS TABLE OF CR_OBJ_TYPE;[/color]

  CURSOR cr IS
  SELECT CR_OBJ_TYPE(
   numopzn,
   namvrr,  
   numdoc,
   mesto,
   lat,
   lng,
   dateizm
  ) x
  FROM
 . . .



С уважением,
Владимир
...
Рейтинг: 0 / 0
Oracle 8.1.7 курсоры и VARRAY
    #39374642
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеев,

1. Object это SQLный тип и не может быть обьявлен в Pl/SQL.

2. Eщe раз: PL/SQLные типа SQL не кушает. Типы опрeделяем в SQL как я и показал:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
CREATE OR REPLACE
  TYPE CR_OBJ_TYPE
    AS OBJECT(
    numopzn VARCHAR2(30)
   ,namvrr VARCHAR2(55)
   ,numdoc VARCHAR2(20)
   ,mesto VARCHAR2(255)
   ,lat VARCHAR2(7)
   ,lng VARCHAR2(8)
   ,dateizm DATE
              )
/
CREATE OR REPLACE
  TYPE CR_OBJ_TBL_TYPE
    AS TABLE OF CR_OBJ_TYPE
/



А в процедуре используем.

SY.
...
Рейтинг: 0 / 0
Oracle 8.1.7 курсоры и VARRAY
    #39374646
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеевНадо сопровождать и по-мелочи модернизировать.Ты ж ни черта не понимаешь. Дай ей просто сдохнуть своей смертью. Ведь если от неё хоть как-то зависят ныне живущие, то ты можешь сотворить чёртов армагеддон своей "модернизацией".
...
Рейтинг: 0 / 0
Oracle 8.1.7 курсоры и VARRAY
    #39374651
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Elic, сегодня, 07:56 [20045755]

>Ты ж ни черта не понимаешь...
Я инженер. Всю жизнь что-то не понимаю, не знаю, не умею. И это нормально.
Не нормально, если инженер не хочет учиться этому, не хочет учиться думать.
Относительно данной задачи на мах/мин, то в среде Oracle 8.1.7 пока она не находит красивого решения.
Не получается у Данилы-мастера каменный аленький цветочек.
...
Рейтинг: 0 / 0
Oracle 8.1.7 курсоры и VARRAY
    #39374655
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеевЯ инженер. Всю жизнь что-то не понимаю, не знаю, не умею. И это нормально.
Не нормально, если инженер не хочет учиться этому, не хочет учиться думать.
Относительно данной задачи на мах/мин, то в среде Oracle 8.1.7 пока она не находит красивого решения.
Не получается у Данилы-мастера каменный аленький цветочек.Этакий инженер-универсал старой закалки? Похер какой науки какой гранит грызть? Типа терпенье и труд всё перетрут? А не сдохнет ли к тому времени ишак или падишах?
...
Рейтинг: 0 / 0
Oracle 8.1.7 курсоры и VARRAY
    #39374656
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>SY, сегодня, 04:18 [20045709]

>...Типы опрeделяем в SQL как я и показал:

Имею (файл):

С уважением,
Владимир
...
Рейтинг: 0 / 0
Oracle 8.1.7 курсоры и VARRAY
    #39374659
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Elic, сегодня, 09:12 [20045836]

>...А не сдохнет ли к тому времени ишак или падишах?
Вы видимо не хотите принять простого факта - информационная система на объекте работает много лет.
Теперь заказчику нужна интерактивная ГИС, геокоординаты база содержит.
ГИС разработал, теперь шлифую - для комфортной работы клиента, время реакции ГИС должна быть в пределах 4 сек.
...
Рейтинг: 0 / 0
Oracle 8.1.7 курсоры и VARRAY
    #39374777
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеев,

Ну ведь это азы. Ну нeт у пользоватeля X привилегии на cоздание типа - значит либо даем привилегию CREATE TYPE либо из под привилегирированного пользоватeля создает тип в схеме X.

SY.
...
Рейтинг: 0 / 0
Oracle 8.1.7 курсоры и VARRAY
    #39384621
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>SY, 25 дек 16, 15:22 [20046412]
>Ну ведь это азы ...

Общие принципы знаю, но логику работы и какие клавиши нажимать (PL/SQL Developer) понимаю с трудом.
Мне, по духу, ближе Microsoft, где на каждый чих есть пример.

Резуме:
1. В курсоре формирую промежуточную выборку.
2. Обработка и запись в vr_tab CR_OBJ_TBL_TYPE := CR_OBJ_TBL_TYPE();
3. Формирую курсор на клиента.
4. Если переписать в tbl_tmp_gis - штатно.

Код: 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.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
procedure get_PrebivanieTB(
   cur_viborka out t_cursor
   ,xdate in date
 )
 is
  CURSOR cr IS
     SELECT 
      TRIM(obv.numopzn) numopzn
     ,slv.namvrr namvrr  
     ,jdk.numdoc numdoc
     ,obj.ABBROBJR  mesto
     ,SUBSTR(loc.coord, 1, 7) lat
     ,SUBSTR(loc.coord, 8, 8) lng
     ,obv.dateizm dateizm
    FROM
     . . .
     ,( SELECT . . .  FROM . . .   WHERE . . .) pv
     ,( SELECT . . .  FROM . . .   WHERE . . .) svyaz
     ,( SELECT . . .  FROM . . .   WHERE . . .  AND jdc.codformuv = sfu.codformuv (+) ) jdk
    WHERE 
      obv.DEL IS NULL
     AND obv.coddoc = jdk.coddoc (+)
      . . . 
     AND TRUNC(obv.dateizm) <= xdate
    ORDER BY
      obv.numopzn
   );
  
  xrow cr%ROWTYPE;
  vr_tab CR_OBJ_TBL_TYPE := CR_OBJ_TBL_TYPE();
  i BINARY_INTEGER;

 BEGIN
  xrow.numopzn := '#';
  i := 0; 

  FOR cr_row IN cr LOOP
    -- Обработка информации по новому ТБ ?
   IF xrow.numopzn <> cr_row.x.numopzn THEN
    -- Да. Обработка 1-ой строки курсора? 
    IF xrow.numopzn <> '#' THEN
      -- Нет не первой. Перепись мах/мин строки старого ТБ в vr_tab
      vr_tab.EXTEND;
      i := i+1;
      vr_tab(i):= CR_OBJ_TYPE(
        xrow.numopzn,xrow.namvrr,xrow.numdoc,xrow.mesto,xrow.lat,xrow.lng,xrow.dateizm 
      );
    END IF;
    xrow := cr_row; -- Новый ТБ

   -- Нет. Обработка информации по текущему ТБ
   ELSE
    -- Более позднее состояние ТБ?
    IF xrow.dateizm < cr_row.dateizm THEN
      -- Да.
      xrow:=cr_row;
    END IF;   
   END IF; 
  END LOOP;

  open cur_viborka for SELECT * FROM TABLE(vr_tab);
  
--  execute immediate 'TRUNCATE TABLE tbl_tmp_gis'; 
--  FOR j IN 1..i LOOP
--   xrow.numopzn := vr_tab(j).numopzn;
--   xrow.namvrr := vr_tab(j).namvrr;
--   xrow.numdoc := vr_tab(j).numdoc;
--   xrow.mesto := vr_tab(j).mesto;
--   xrow.lat := vr_tab(j).lat;
--   xrow.lng := vr_tab(j).lng;
--   xrow.dateizm := vr_tab(j).dateizm;
   
--   INSERT INTO tbl_tmp_gis VALUES (
--     xrow.numopzn,xrow.namvrr,xrow.numdoc,xrow.mesto,xrow.lat,xrow.lng,xrow.dateizm 
--   );
--  END LOOP;
--  open cur_viborka for SELECT * FROM tbl_tmp_gis;

 end get_PrebivanieTB; 
 
...
Рейтинг: 0 / 0
Oracle 8.1.7 курсоры и VARRAY
    #39384622
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>ВМоисеев, сегодня, 02:20 [20104942]
Прибавление:
...
Рейтинг: 0 / 0
Oracle 8.1.7 курсоры и VARRAY
    #39384636
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеевМне, по духу, ближе MicrosoftИ даже после этого ты смело грудью на амбразуру "Я всё смогу!" ?
...
Рейтинг: 0 / 0
Oracle 8.1.7 курсоры и VARRAY
    #39384819
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Elic

К чему это:
1. Чудак , ты можешь объяснить, зачем ты "изучаешь" ...
2. Ты ж ни черта не понимаешь ...
3. Этакий инженер-универсал старой закалки?...
4. И даже после этого ты смело грудью ...

Батенька, это же технический сайт, а не сайт бла-бла-бла.

По-делу. Да, в среде Oracle 8.1.7 у Данилы-мастера аленький цветочек пока не получается. Для задачи мах/мин в моём случае данность выборка, не таблица. И добавка UNION в SELECT построения выборки сильно увеличивает время отклика. Надо найти наиболее шуструю схему решения. Чем и занимаюсь по мере сил, хотя это и не совсем моя область - прикладник.
...
Рейтинг: 0 / 0
Oracle 8.1.7 курсоры и VARRAY
    #39384835
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скорее всего тип CR_OBJ_TBL_TYPE опредeлен b PL/SQL.

SY.
...
Рейтинг: 0 / 0
Oracle 8.1.7 курсоры и VARRAY
    #39384853
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>SY, сегодня, 22:14 [20106564]
>Скорее всего ...

Делал почти аккуратно.

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


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