powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Oracle 8i, курсоры и временная таблица
49 сообщений из 49, показаны все 2 страниц
Oracle 8i, курсоры и временная таблица
    #39367978
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Коллеги,
помогите дилетанту правильно расставить комментарии внутри BEGIN . . . end get_PrebivanieTB; :
Код: 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.
 
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
     ,obv.dateizm DESC
  );
  
  xstr varchar2(30);

 BEGIN
   execute immediate 'TRUNCATE TABLE tbl_tmp_gis'; 
   -- DELETE FROM  tbl_tmp_gis;
   -- COMMIT;

  xstr := '  ';
 
  --//-- Выборка первых строк в группах
  FOR row IN cr LOOP
   IF row.numopzn <> xstr THEN
    INSERT INTO tbl_tmp_gis VALUES (
      row.numopzn
     ,row.namvrr
     ,row.numdoc
     ,row.mesto
     ,row.lat
     ,row.lng
     ,row.dateizm 
    );
    xstr := row.numopzn;
   END IF; 
  END LOOP;
  
  -- COMMIT;
  
  open cur_viborka for 
  SELECT *
  FROM  tbl_tmp_gis;
 
  --  execute immediate 'TRUNCATE TABLE tbl_tmp_gis'; 
  -- DELETE FROM  tbl_tmp_gis;
  -- COMMIT;

 end get_PrebivanieTB; 



С уважением,
Владимир
...
Рейтинг: 0 / 0
Oracle 8i, курсоры и временная таблица
    #39368032
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеевпомогите дилетанту правильно расставить комментарии внутри BEGIN . . . end get_PrebivanieTB

Формат форума не позволит опубликовать столько нецензурных выражений.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Oracle 8i, курсоры и временная таблица
    #39368037
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Dimitry Sibiryakov, сегодня, 17:54 [20008649]
> ...

А по делу,- слабо.
...
Рейтинг: 0 / 0
Oracle 8i, курсоры и временная таблица
    #39368045
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеевА по делу,- слабо.
По делу - надо выкинуть всё между begin-end. И сами begin-end тоже выкинуть. Вместо всего
этого ужаса написать один запрос с оконными функциями. Или ещё и немного изменить
структуру БД чтобы обойтись без них. Работать будет быстрее.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Oracle 8i, курсоры и временная таблица
    #39368101
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Dimitry Sibiryakov, сегодня, 18:03 [20008708]

>Или ещё и немного изменить структуру БД ...
Не реально.

>По делу - надо выкинуть ...
Если не затруднит, покажите Ваш вариант.
Проверил 5-ть вариантов:
1. С аналитической функцией,
2. Обвал, - во временную таблицу записываю отсортированную выборку, её содержимое в курсор и клиенту,
3. Цикл по курсору - что прошу прокомментировать,
4. Дедушкин вариант - во временную таблицу записываю отсортированную выборку, далее SELECT c внутренним SELECT с MAX и группировкой --> содержимое в курсор и клиенту,
5. В лоб - 2-ва SELECT, один во FROM --> содержимое в курсор и клиенту.

п.с. в полную выборку входит UNION
...
Рейтинг: 0 / 0
Oracle 8i, курсоры и временная таблица
    #39368104
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Dimitry Sibiryakov, сегодня, 18:03 [20008708]

>... Вместо всего этого ужаса написать один запрос с оконными функциями.
Если Вы имеете ввиду аналитическую функцию row_number(), то этот вариант на объекте не катит.
Кроме того вдвое медленнее (на тестовой системе) вариантов цикла и дедушки, а система интерактивная и время её реакции не последний фактор.
...
Рейтинг: 0 / 0
Oracle 8i, курсоры и временная таблица
    #39368110
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеевЕсли Вы имеете ввиду аналитическую функцию row_number(), то этот вариант на объекте не катит.

Нет, я имел ввиду функцию FIRST_VALUE.

ВМоисеевКроме того вдвое медленнее (на тестовой системе) вариантов цикла и дедушки, а система
интерактивная и время её реакции не последний фактор.

Тогда Вам не стоило убивать возможность использования индексов для фильтрации своим TRIM().
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Oracle 8i, курсоры и временная таблица
    #39368129
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Dimitry Sibiryakov, сегодня, 19:35 [20009007]

>Нет, я имел ввиду функцию FIRST_VALUE.
Аналитические функции не работают на объекте.

>Тогда Вам не стоило убивать ...
Убрал, никакой реакции.
...
Рейтинг: 0 / 0
Oracle 8i, курсоры и временная таблица
    #39368304
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеевЕсли Вы имеете ввиду аналитическую функцию row_number(), то этот вариант на объекте не катит.

Аналитические функции не работают на объекте.


Версию и редакцию СУБД в студию.
...
Рейтинг: 0 / 0
Oracle 8i, курсоры и временная таблица
    #39368342
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
envВерсию и редакцию СУБД в студию.Сабж не виден?
...
Рейтинг: 0 / 0
Oracle 8i, курсоры и временная таблица
    #39368394
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic,

Насколько я помню, row_number() и first_value() в 8i уже были (со второго кажется релиза).
...
Рейтинг: 0 / 0
Oracle 8i, курсоры и временная таблица
    #39368396
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic,

пруф

посему уточняю возможности версии ТС
...
Рейтинг: 0 / 0
Oracle 8i, курсоры и временная таблица
    #39368408
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
env пруф посему уточняю возможности версии ТСТ.е. ты не в курсе, что на любой версии 8i использование аналитики в PL/SQL (который, наш боря назвал "объектом") было крайне затруднено?
...
Рейтинг: 0 / 0
Oracle 8i, курсоры и временная таблица
    #39368463
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic,

В том чиcле при использовании во view?
...
Рейтинг: 0 / 0
Oracle 8i, курсоры и временная таблица
    #39368810
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>env, сегодня, 09:25 [20009923]

>Версию и редакцию СУБД в студию.

1. Сожалею, но на данный момент нужной информацией не обладаю.
2. На тестовом примере вариант аналитической функции примерно вдвое проигрывает варианту цикла.
3. Почему на 2-ой строке с -- execute immediate 'TRUNCATE TABLE tbl_tmp_gis'; возникает ошибка?

С уважением,
Владимир.
...
Рейтинг: 0 / 0
Oracle 8i, курсоры и временная таблица
    #39368816
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеев3. Почему на 2-ой строке с -- execute immediate 'TRUNCATE TABLE tbl_tmp_gis'; возникает ошибка? http://www.bugtraq.ru/forum/faq/general/smart-questions.html] RTFM
...
Рейтинг: 0 / 0
Oracle 8i, курсоры и временная таблица
    #39368826
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Elic, сегодня, 16:34 [20013096]

>RTFM
К чему это, - есть конкретный вопрос по представленному тексту.
...
Рейтинг: 0 / 0
Oracle 8i, курсоры и временная таблица
    #39368847
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеевК чему этоRTFM Error Messages (FAQ)
...
Рейтинг: 0 / 0
Oracle 8i, курсоры и временная таблица
    #39368861
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеев3. Почему на 2-ой строке с -- execute immediate 'TRUNCATE TABLE tbl_tmp_gis'; возникает ошибка?


Хрустальный шар сегодня плохо работает, не видно ни кода ошибки ни описания
...
Рейтинг: 0 / 0
Oracle 8i, курсоры и временная таблица
    #39368922
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Elic, сегодня, 16:56 [20013232]

>RTFM Error Messages (FAQ)
Что имею: ORA-08103
...
Рейтинг: 0 / 0
Oracle 8i, курсоры и временная таблица
    #39369134
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elicenv пруф посему уточняю возможности версии ТСТ.е. ты не в курсе, что на любой версии 8i использование аналитики в PL/SQL (который, наш боря назвал "объектом") было крайне затруднено?ТС еще и путается в показаниях, похоже на боевой и на программерской у него разные восьмерки
Oracle having first
...
Рейтинг: 0 / 0
Oracle 8i, курсоры и временная таблица
    #39369263
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Вячеслав Любомудров, сегодня, 05:35 [20015047]

>... похоже на боевой и на программерской у него разные восьмерки ...
У меня такие-же подозрения, но сисадмин против.
Сети разные:
1. боевая - нормальная локальная сеть на базе Windows Server 2003 и Oracle 8i,
2. тестовая - виртуализация VMWare, Windows Server 2003 и Oracle 8i 1.7
3. Но вопрос, как правильно очищать временные таблицы Oracle, не потерял актуальности
...
Рейтинг: 0 / 0
Oracle 8i, курсоры и временная таблица
    #39369265
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисееввопрос, как правильно очищать временные таблицы Oracle, не потерял актуальности

Завершением транзакции или сессии в зависимости от её (таблицы) типа.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Oracle 8i, курсоры и временная таблица
    #39369282
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеев1. боевая - нормальная локальная сеть на базе Windows Server 2003 и Oracle 8i,
2. тестовая - виртуализация VMWare, Windows Server 2003 и Oracle 8i 1.7Это археологический музей или институт времени?
...
Рейтинг: 0 / 0
Oracle 8i, курсоры и временная таблица
    #39369301
dmdmdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Работает. Чего трогать-то?
Кассовую программу под DOS будем менять только потому что закон выпустили. А так бы еще работала и работала.
...
Рейтинг: 0 / 0
Oracle 8i, курсоры и временная таблица
    #39369307
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Dimitry Sibiryakov, сегодня, 14:46 [20015806]

>Завершением транзакции или сессии в зависимости от её (таблицы) типа.
Вариант по предложенному тексту может быть выполнен несколько раз в сессии.
1. В локальной сети не один пользователь
2. Конструкция open cur_viborka for SELECT * FROM tbl_tmp_gis похоже вызывает AUTOCOMMIT, вариант ON COMMIT DELETE ROWS не проходит
3. Вариант ON COMMIT PRESERVE ROWS требует очистки после после open cur_viborka, так как априори неизвестно, будут ли еще обращения
4. После закрытия коннекта на компьютере пользователя Oracle сессия не закрывается.

С уважением,
Владимир
...
Рейтинг: 0 / 0
Oracle 8i, курсоры и временная таблица
    #39369489
ВМоисееввариант ON COMMIT DELETE ROWS не проходит
у тебя ни один вариант "не проходит", так что, домыслы про коммиты не имеют оснований.
...
Рейтинг: 0 / 0
Oracle 8i, курсоры и временная таблица
    #39369491
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеевПосле закрытия коннекта на компьютере пользователя Oracle сессия не закрывается.Это какой-то новый, ещё не известный науке ископаемый вид Oracle-а.
...
Рейтинг: 0 / 0
Oracle 8i, курсоры и временная таблица
    #39369496
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
изтвоисеевВМоисееввариант ON COMMIT DELETE ROWS не проходит
у тебя ни один вариант "не проходит", так что, домыслы про коммиты не имеют оснований.Ну, если у него действительно в средстве доступа включен AUTOCOMMIT, по после выполнения PL/SQL блока, где заполняется временная таблица и открывается курсор по ней, выполнится COMMIT, временная таблица очистится и попытка выборки из открытого по ней курсора огребет ORA-08103
На мой взгляд, AUTOCOMMIT -- зло (по крайней мере, в Oracle), но в том же JDBC он включен по-дефолту, и его надо отключать явно

Но ТС молчит в каком окружении он работает, даже версию назвать не в состоянии.
Выдает только свои догадки, матчасть изучать не хочет и, в общем, уныл
...
Рейтинг: 0 / 0
Oracle 8i, курсоры и временная таблица
    #39369530
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
возможно, у ТС автокоммит в транкейте времянки
...
Рейтинг: 0 / 0
Oracle 8i, курсоры и временная таблица
    #39369532
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TRUNCATE сам по себе коммит
...
Рейтинг: 0 / 0
Oracle 8i, курсоры и временная таблица
    #39369539
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Elic, сегодня, 09:29 [20017424]

>Это какой-то новый, ещё не известный науке ископаемый вид Oracle-а.
Нет, всё определено - на тестовой системе стоят:
1. Серверная часть, на виртуальной машине Windows Server 2003 x32 EE SP2 R2 и Oracle 8i 1.7
2. Часть разработчика, - на виртуальной машине Windows 10 x64, Oracle instantclient-basic-win64-10.2.0.5, Devart dotConnect for Oracle Express (dcoraclefree(9))
3. Реализация доступа к Oracle -у:

Код: c#
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.
    //-- Готовим данные по местам пребывания ТБ
    //-----------------------------------------
    void f_Выборка() {
      гп.оПребываниеТБ.lst_ПребываниеТБ = null;
      гп.оПребываниеТБ.lst_ПребываниеТБ = new List<row_ПребываниеТБ>();
      using (OracleConnection conOra = new OracleConnection(гп.oradb)) {
        using (OracleCommand cmdOra = new OracleCommand()) {
          cmdOra.Connection = conOra;
          cmdOra.CommandType = CommandType.StoredProcedure;
          cmdOra.CommandText = "NCUYAO_GIS.get_PrebivanieTB";
          cmdOra.Parameters.Clear();
          cmdOra.Parameters.Add("cur_viborka", OracleDbType.Cursor).Direction = ParameterDirection.Output;
          cmdOra.Parameters.Add("xdate", OracleDbType.Date, ParameterDirection.Input).Value = dtp_Пребывание.Value;
          try {
            conOra.Open();
            odr = cmdOra.ExecuteReader();
            while (odr.Read()) {
              DbToRow();
              гп.оПребываниеТБ.lst_ПребываниеТБ.Add(xrow);
            }
          }
          catch (Exception ex) {
            MessageBox.Show("Ошибка Oracle: {0}", ex.ToString());
            гп.оПребываниеТБ.lst_ПребываниеТБ = null;
          }
        }
      }
    }
...
Рейтинг: 0 / 0
Oracle 8i, курсоры и временная таблица
    #39369546
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Вячеслав Любомудров, сегодня, 09:57 [20017452]

>Но ТС молчит в каком окружении он работает, даже версию назвать не в состоянии.
Относительно тестовой системы - в предыдущем сообщении.
Относительно системы объекта - живу в Редкино, боевая система в другом городе. Просто так попасть туда нельзя. Система сдана, идет сопровождение. Менять системные настройки работающего комплекса без уважительных на то причин сисадмин не даст. Моя задача стоит несколько особняком в комплексе, построенном на PL/SQL с использованием PL/SQL-картриджа и применением языка JavaScript.

Вопрос по приведенному тексту. Есть две группы команд:
-- execute immediate 'TRUNCATE TABLE tbl_tmp_gis';
-- DELETE FROM tbl_tmp_gis;
-- COMMIT;
Так как приведено в тексте - работает.
Если снять комментарии с --D... и --COMMIT во второй группе - работает.
Но не понятно, что будет с ресурсами временной таблицей.
В инете много пишут как создать временную таблицу, как записать туда данные, но нет информации как аккуратно очистить временную таблицу ON COMMIT PRESERVE ROWS
...
Рейтинг: 0 / 0
Oracle 8i, курсоры и временная таблица
    #39369583
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеев>Вячеслав Любомудров, сегодня, 09:57 [20017452]

>Но ТС молчит в каком окружении он работает, даже версию назвать не в состоянии.
Относительно тестовой системы - в предыдущем сообщении.
Относительно системы объекта - живу в Редкино, боевая система в другом городе. Просто так попасть туда нельзя. Система сдана, идет сопровождение. Менять системные настройки работающего комплекса без уважительных на то причин сисадмин не даст. Моя задача стоит несколько особняком в комплексе, построенном на PL/SQL с использованием PL/SQL-картриджа и применением языка JavaScript.Странно, что ты не разрабатываешь на Oracle 12c, ну или хотя бы 11g
Это сейчас в тренде
Понять что между 8 (8.0) и 8i (8.1) очень большая разница, ты, видимо, не хочешь

ВМоисеевВопрос по приведенному тексту. Есть две группы команд:
-- execute immediate 'TRUNCATE TABLE tbl_tmp_gis';
-- DELETE FROM tbl_tmp_gis;
-- COMMIT;
Так как приведено в тексте - работает.
Если снять комментарии с --D... и --COMMIT во второй группе - работает.
Но не понятно, что будет с ресурсами временной таблицей.
В инете много пишут как создать временную таблицу, как записать туда данные, но нет информации как аккуратно очистить временную таблицу ON COMMIT PRESERVE ROWSДаже временная таблица подчиняется обычным правилам -- на открытый курсор обычный DML (DELETE), даже после COMMIT продолжает действовать правило версионника -- достанем данные из UNDO на момент открытия курсора. Но после TRUNCATE (или COMMIT в ON COMMIT DELETE ROWS) сегмент уже не торт -- грубо говоря, того сегмента просто нет. Ты можешь оттянуть агонию, задав сортировку или вытащив первую строку, но это именно то, за что надо отрывать руки, ибо ошибка стрельнет в самый непредсказуемый момент.

Зачем здесь вообще временная таблица -- непонятно, но если все остальное намного тормознее -- то и используй временную таблицу правильно.
Если ON COMMIT DELETE ROWS -- никаких AUTOCOMMIT, если PRESERVE ROWS -- TRUNCATE перед заполнением, но не забывай, что это DDL, и как следствие COMMIT
...
Рейтинг: 0 / 0
Oracle 8i, курсоры и временная таблица
    #39369689
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Вячеслав Любомудров, сегодня, 15:29 [20017978]

>... Зачем здесь вообще временная таблица -- непонятно...
Мои грубые замеры скорострельности цикла по курсору (текст в посте) показывают его преимущество (6 сек против 12 сек с аналитической функцией).

Итак, пусть имеем Oracle 8i 1.7 (тестовая система) и вариант цикла.
После выполнения
open cur_viborka for SELECT * FROM tbl_tmp_gis;
данные уходят на клиента.
А что с tbl_tmp_gis? Таблица не пуста.
Будет ли еще одно обращение и execute immediate 'TRUNCATE TABLE tbl_tmp_gis'; неизвесно.
Клиент в рамках сессии может заниматься другими работами. Ресурсы tbl_tmp_gis в подвешенном состоянии.

DELETE tbl_tmp_gis;
COMMIT;
удаляет информацию строк, но не место занимаемое ими.
...
Рейтинг: 0 / 0
Oracle 8i, курсоры и временная таблица
    #39371484
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Dimitry Sibiryakov, 15 дек 16, 19:35 [20009007]

>Нет, я имел ввиду функцию FIRST_VALUE.
Как аккуратно написать этот запрос:

Код: 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.
 procedure get_PrebivanieTB(
   cur_viborka out t_cursor
   ,xdate in date
 )
 is
  sql_sel varchar2(2000) := '
    SELECT 
      obv.numopzn numopzn
     ,FIRST_VALUE(slv.NAMVRR) 
       OVER(PARTITION BY obv.numopzn,obv.dateizm ORDER BY obv.numopzn, obv.dateizm DESC) namvrr
     ,FIRST_VALUE(jdk.numdoc) 
       OVER(PARTITION BY obv.numopzn,obv.dateizm ORDER BY obv.numopzn, obv.dateizm DESC)numdoc
     ,FIRST_VALUE(obj.ABBROBJR)
       OVER(PARTITION BY obv.numopzn,obv.dateizm ORDER BY obv.numopzn, obv.dateizm DESC) mesto
     ,FIRST_VALUE(SUBSTR(loc.coord, 1, 7))
       OVER(PARTITION BY obv.numopzn,obv.dateizm ORDER BY obv.numopzn, obv.dateizm DESC) lat
     ,FIRST_VALUE(SUBSTR(loc.coord, 8, 8))
       OVER(PARTITION BY obv.numopzn,obv.dateizm ORDER BY obv.numopzn, obv.dateizm DESC) 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
     ,obv.dateizm DESC
  ';
  
  BEGIN
   open cur_viborka for sql_sel;

 end get_PrebivanieTB; 



С уважением,
Владимир
p.s. можно ли убрать ORDER BY из WHERE
...
Рейтинг: 0 / 0
Oracle 8i, курсоры и временная таблица
    #39371669
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеев,

Документации по 8i под рукой нет, но предположу, что конструкция вида
Код: plsql
1.
open cur for 'select :1 from dual' using l_variable

там рабоает.
...
Рейтинг: 0 / 0
Oracle 8i, курсоры и временная таблица
    #39371670
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеевможно ли убрать ORDER BY из WHERE

Overkill ©SY
...
Рейтинг: 0 / 0
Oracle 8i, курсоры и временная таблица
    #39372328
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>env, сегодня, 10:59 [20030823]

Ничего не понял. Изучаю язык Oracle 8i 1.7.
Требуется найти решение стандартной задачи на мах/мин. Разбиваем множество отсортированных строк выборки на группы и из каждой группы берем первую строку, получаем результирующую выборку.

Например на LINQ решение почти аналогичной задачи можно записать так:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
      lst_МестаСНВ3 = (
        from row in lst_СНВ3
        group row by new {glat = row.ilat, glng = row.ilng }
        into g
        select new row_МестоСНВ3() {
          blm = g.Count() > 1,   //--blm <- true, если несколько объектов в одном месте
          lat = g.First().ilat,
          lng = g.First().ilng,
          тип = g.First().tipobj
        }
      ).ToList();


Dimitry Sibiryakov (15 дек 16, 19:35 [20009007]) предложил применить FIRST_VALUE.
Меня интересует, как выглядит решение.

С уважением,
Владимир.
...
Рейтинг: 0 / 0
Oracle 8i, курсоры и временная таблица
    #39372486
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>ВМоисеев, вчера, 00:29 [20029904]
Прибавление.
Такой вариант по скорострельности эквивалентен циклу по курсору

Код: 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.
 procedure get_PrebivanieTB(
   cur_viborka out t_cursor
   ,xdate in date
 )
 is
  sql_sel varchar2(2000) := '
    SELECT DISTINCT 
      obv.numopzn numopzn
     ,FIRST_VALUE(slv.NAMVRR) 
       OVER(PARTITION BY obv.numopzn ORDER BY  obv.dateizm DESC) namvrr
     ,FIRST_VALUE(jdk.numdoc) 
       OVER(PARTITION BY obv.numopzn ORDER BY  obv.dateizm DESC)numdoc
     ,FIRST_VALUE(obj.ABBROBJR)
       OVER(PARTITION BY obv.numopzn ORDER BY  obv.dateizm DESC) mesto
     ,FIRST_VALUE(SUBSTR(loc.coord, 1, 7))
       OVER(PARTITION BY obv.numopzn ORDER BY  obv.dateizm DESC) lat
     ,FIRST_VALUE(SUBSTR(loc.coord, 8, 8))
       OVER(PARTITION BY obv.numopzn ORDER BY  obv.dateizm DESC) lng
     ,MAX(obv.dateizm)
       OVER(PARTITION BY obv.numopzn) 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
  ';
  
  BEGIN
   open cur_viborka for sql_sel;

 end get_PrebivanieTB; 



Коллеги, подскажите, где можно улучшить.
...
Рейтинг: 0 / 0
Oracle 8i, курсоры и временная таблица
    #39372524
ВМоисеевулучшить.критерии лучшести каковы?
...
Рейтинг: 0 / 0
Oracle 8i, курсоры и временная таблица
    #39372585
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеев,

Возникают сильные сомнения в работоспособности приведённого варианта.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
 ,xdate in date

'    .....
     AND TRUNC(obv.dateizm) <= xdate
    ORDER BY
      obv.numopzn
     ,obv.dateizm DESC
  ';



Неужто это работает на 8i? Или это обычная магия данных вроде

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
set serveroutput on
declare
  l_sql varchar2(100);
  l_c   sys_refcursor;
  l_res dual%rowtype;
  l_str varchar2(10) := 'Y';
begin
  l_sql := 'select d.* from dual d, (select chr(88) l_str from dual) where d.dummy = l_str';

  open l_c for l_sql;
  loop
    fetch l_c into l_res;
      exit when l_c%notfound;
     dbms_output.put_line(l_res.dummy);
  end loop;

  close l_c; 
end;
/


...
Рейтинг: 0 / 0
Oracle 8i, курсоры и временная таблица
    #39372588
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеев,

И выберите уже какой-то один язык именования объектов. А то глазам больно смотреть на этот пиджин инглиш getProebyvanie, mesto, dateizm и т.п.
...
Рейтинг: 0 / 0
Oracle 8i, курсоры и временная таблица
    #39372926
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>env, сегодня, 10:03 [20035272]

>И выберите уже какой-то один язык именования объектов...
База данных создана не мною, это есть данность.
Как прикладник, чаще всего использую русскую терминологию, благо Microsoft не ограничивает.
...
Рейтинг: 0 / 0
Oracle 8i, курсоры и временная таблица
    #39372936
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>env, сегодня, 09:58 [20035250]

>Неужто это работает на 8i?
Извините за текстовую ошибку. Правильно (рабочее) так:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
 
     . . .
     AND TRUNC(obv.dateizm) <= 
       to_date(' || '''' || TO_CHAR(xdate, 'dd.mm.yyyy') || '''' || ')
    ORDER BY 
      obv.numopzn
     . . .
...
Рейтинг: 0 / 0
Oracle 8i, курсоры и временная таблица
    #39372944
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic, а конструкции KEEP FIRST/LAST уже были в 8i?
...
Рейтинг: 0 / 0
Oracle 8i, курсоры и временная таблица
    #39372981
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
envElic, а конструкции KEEP FIRST/LAST уже были в 8i?RTFM Aggregate Functions (8.1.7) (FAQ)
...
Рейтинг: 0 / 0
Oracle 8i, курсоры и временная таблица
    #39373043
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic,

Спасибо, Виталий.
...
Рейтинг: 0 / 0
Oracle 8i, курсоры и временная таблица
    #39373089
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
49 сообщений из 49, показаны все 2 страниц
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Oracle 8i, курсоры и временная таблица
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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