Модераторы: LSD

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Хранимые процедуры и запрос, Oracle 
:(
    Опции темы
Zloxa
Дата 1.2.2013, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 37
Всего: 161



Цитата(RockClimber @  21.1.2013,  20:46 Найти цитируемый пост)
автора спасла бы фича под названием "pivot table", появившаяся в 11-м оракле. Можно было бы отказаться от "динамики".

Не спасла бы.
Применение и этой кляузы требует знание о структуре результата на этапе проектирования а не на этапе исполнения. Если мы на этапе проектирования не знаем структуру результата,  запрос все равно придется формировать динамически. Ну разве троху компактнее получается текст. В общем и целом pivot и unpivot это просто попсовая плюшка, не очень чтоб уж прям и мастхав.

Цитата(mbasil @  1.2.2013,  13:59 Найти цитируемый пост)
Обсуждался на http://habrahabr.ru/post/100798/

И ведь ЧСХ ни одного коментария к статье, что тема заявленной над катом динамики pivot не раскрыта чуть менее чем полностью в виду ее отсутствия.

mbasil, из вашего примера я не понял, вы ГТТ создаете одну на все случаи жизни? Если так, от чего так мало столбцов? Пивотинг over 99 значений по 4 символа в каждом столбце, полагаете вам с лихвой хватит?

Это сообщение отредактировал(а) Zloxa - 19.1.2016, 02:09


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
mbasil
Дата 2.2.2013, 08:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 399
Регистрация: 4.5.2007
Где: Москва

Репутация: 1
Всего: 13



Да, на все случаи жизни и для всех пользователей (GLOBAL TEMPORARY TABLE). Я просто отлаживал текст на маленьком примере, приведеном автором. В Oracle заявлено, что можно создавать таблицы с 1000 столбцами. Правда я задействовал временную таблицу, которая на самом деле "не настоящая" и сколько там можно создавать столбцов не знаю - выяснять лень. 

Некоторык комментарии:
1. Использовал я временную таблицу потому, что для выполнения операции в оперативной памяти при большом объеме может потребоваться слишком много памяти. Конечно, это требует времени на вставки, но DML операции в такой таблице не журналируются и в сегиенты отката не пишутся, так что вместо TRUNCATE можно смело использовать DELETE.
2. Поскольку это матричный отчет, трудно представить себе начальника с красным карандашом в руках и огнем в глазах анализируещего таблицу из 1000 столбцов - "замучается он". Так что по длительноиу размышлению в тртий раз намекаю, что отчеты форматировать надо на клиенте, передавая реляционные данные по сети компактно. Последние тенденции убеждают, что разделение труда между узлами системы не пустой звук, так как объемы сохраняемых данных растут и "напрягать" сервер задачами, которые ему не присущи фцнкционально, по меньшей мере, опрометчиво, даже если у вас супер серевер. Oracle же, например, в 9 версии предлагал форматировать HTML на сервере (ха). А с другой стороны Oacle Reports (хоть и кривоват), но позволяет уже много лет ваять из запросов многостраничные матричные отчеты "супер пупер" сложности.

Это сообщение отредактировал(а) mbasil - 2.2.2013, 08:21
PM MAIL   Вверх
Zloxa
Дата 2.2.2013, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 37
Всего: 161



Цитата(mbasil @  2.2.2013,  09:15 Найти цитируемый пост)
Использовал я временную таблицу потому, что для выполнения операции в оперативной памяти при большом объеме может потребоваться слишком много памяти.

Вы вот опубликовали некое решение. А от какой задачи это решение, наверное забыли упомянуть?
И уж простите за прямоту, но ваши портянки кода - откровенный г0внокод. Я честно попытался их почитать, но так и не понял от какой задачи зто решение.

Задача транспонирования решатеся одним запросом.
В приведенно вами же статье есть ссыль на решение от Кайта для версий <11
В процессе выполнения запросов, при необходимости, используется временный сегмент, совершенно не понятно какие расходы памяти вас так тревожат.


Это сообщение отредактировал(а) Zloxa - 2.2.2013, 12:41


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
mbasil
Дата 2.2.2013, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 399
Регистрация: 4.5.2007
Где: Москва

Репутация: 1
Всего: 13



to Zloxa

1. Код пишу, какой умею, во всяком случае он работает. Ясно, что я не пытаюсь предствить данное решение идеальным, как возможно не идеален и запрос, который не влезает в 32К. 
2. Вы читаете только то, что  можете критиковать хамским образом?  То что матричные отчеты надо форматировать на клиенте, а не гонять по сети ненужную метаинформацию, и то что такие инструменты как Oracle Reports это делают автоматически, вы пропустили, видмо, случайно.
3. Второй раз захожу на это ветку и второй же раз получаю от вас мягко говоря неприятные замечания. Видимо вам мои сообщения,  как завсегдатаю не нравятся вообще, а не по сути, а посему позвольте откланяться - вы ведь здесь хозяин
PM MAIL   Вверх
Zloxa
Дата 2.2.2013, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 37
Всего: 161



mbasil, простите меня за резкость столь ранившую Вас, но, поверьте, я не скуп на похвалу, и, если бы в вашем посте действительно было бы что-то достойное похвалы, за мной не заржавело бы. 

А резкая критика гoвнорешений, с моей точки зрения, на публичных ресурсах крайне необходима. И необходима она не столько для тех кто их публикует или тех, кто эту резкую критику преподносит, а для тех, кто молча почитывает и мотает на ус, возможно, сам еще будучи не в состоянии адекватно оценить суть решения.

Это сообщение отредактировал(а) Zloxa - 2.2.2013, 21:11


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
mbasil
Дата 7.2.2013, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 399
Регистрация: 4.5.2007
Где: Москва

Репутация: 1
Всего: 13



Не удержусь, чтобы не ответить, хотя и не собирался, поскольку гсп.Zloxa опять вместо рассмотрения сути закопался в формалистику. Отвечаю не ему (так как в похвалах и порицаниях не нуждаюсь), а тем, кто хочет все-же разобраться в предложенной задаче. Есть три способа решения поставленной проблемы:

1. Выполнить "pivoting" в оперативной памяти.
2. Выполнить "pivoting" во временной таблице, примерно так, как я писал в "гОвнОкоде".
3. Выполнить форматирование отчета на клиенте.

Вариант 3 предпочтительный, так как это правильное создание матричного отчета, когда клиенту по сети отправляется меньше информации, чем при "pivoting" в оперативной памяти и сервер не занят второстепенной для него задачей.

Вариант 2 предлагается использовать, когда клиент хочет не только запросить несколько раз результаты "pivoting'а", вырезая, например, отдельные части, но и внести изменения во временную таблицу (по желанию) прежде чем напечатать окончательный отчет.

Выполнять "pivoting" в оперативной памяти по варианту 1 стоит только лишь от лени.

Что касается "гОвнОкода" то связан он отчасти с необходимостью обработки строк, которую трудно сделать "красивой". Кроме того, я и не пытался наводить красоту, возможно именно от лени. Я уже 30 лет пишу коды и, видимо обленился вконец до "гОвнОкода". Полагаю, тем не менее, что вариант 2 вследствие перечисленных выше причин также имеет право на существование. И, ежели кто-либо предпочитающий красоту в коде предложит красивое решение, полагаю все будут только рады. Говорить же, что вариант 2 не нужен никогда потому, что "гОвнОкод" - по меньшей мере, высокомерно.

Это сообщение отредактировал(а) mbasil - 7.2.2013, 15:59
PM MAIL   Вверх
Zloxa
Дата 7.2.2013, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 37
Всего: 161



Цитата(mbasil @  7.2.2013,  16:55 Найти цитируемый пост)
1. Выполнить "pivoting" в оперативной памяти.

Объясните пожалуйста что вы называете пивотингом в оперативной памяти.

Традиционное решение задачи - динамическое формирование запроса, о котором идет речь в этой теме, и по той ссылке, которая приведена вами же, не есть суть "выполнение пивотинга в оперативной памяти". Выполнение этого запроса сервером не является "выполнением пивотинга в оперативной памяти". Наличие третьего пункта в вашем списке, как бы предполагает что речь идет не об оперативной памяти клиента. Применение своего оригинального подхода в пику ранее озвученных - традиционных вы обосновываете экономией памяти. Какой памяти? Альтернативой какому подходу вы предлагаете свое решение? В этой теме не было озвучено подхода, недостаток которого вы устранили своим решением.

Это сообщение отредактировал(а) Zloxa - 7.2.2013, 20:45


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
LSD
Дата 8.2.2013, 13:23 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 18
Всего: 538



Думаю надо пояснить некоторые моменты:
1. Тема давно имеет только академический интерес. Тот прототип который тогда разрабатывался уже давно почил в бозе.
2. Табличное представление формируется на клиенте, а не на сервере потому что на тот момент вся логика была на сервере.
3. 200-300 столбцов человеку вполне можно обозреть. Смысл как раз и был в том, чтобы наглядно видеть где что.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Zloxa
Дата 8.2.2013, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 37
Всего: 161



Цитата(LSD @  8.2.2013,  14:23 Найти цитируемый пост)
Тема давно имеет только академический интерес

Если имеет хотя бы академический интерес  smile, с 11й версии dbms_sql умеет возвращать и refcursor.
Раньше, походу, действительно не умел.
Удивился, что мне было позволено вернуть 1.5к, 5к столбцов, оказывается 1к столбцов это лимит для таблиц, сколько для вьюх-запросов надо буйт пошукать.
Пригорюнился над текстом ошибки, когда попросил 50к столбцов

Код

SQL> var valcnt number
SQL> var result refcursor
SQL> exec :valcnt := 3;

PL/SQL procedure successfully completed.

SQL> declare 
  2    v_sql dbms_sql.varchar2a;
  3    curid number;
  4    ret integer;
  5  begin
  6    v_sql(1) := 'select dummy val1';
  7    for i in 2..:valcnt loop
  8      v_sql(i) := ',level val'||i;
  9    end loop;
 10    v_sql(:valcnt+1) := 'from dual connect by level <=3';
 11    curid := dbms_sql.open_cursor;
 12    dbms_sql.parse(c => curid
 13                  ,statement => v_sql
 14                  ,lb => 1
 15                  ,ub => :valcnt+1
 16                  ,lfflg =>true 
 17                  ,language_flag => dbms_sql.native);
 18    ret := dbms_sql.execute(c => curid);
 19    :result := dbms_sql.to_refcursor(curid);
 20  end;
 21  /

PL/SQL procedure successfully completed.

SQL> print result;

V       VAL2       VAL3
- ---------- ----------
X          1          1
X          2          2
X          3          3

SQL> exec :valcnt := 500;

PL/SQL procedure successfully completed.

SQL> /

PL/SQL procedure successfully completed.

SQL> exec :valcnt := 1500;

PL/SQL procedure successfully completed.

SQL> /

PL/SQL procedure successfully completed.

SQL> exec :valcnt := 5000;

PL/SQL procedure successfully completed.

SQL> /

PL/SQL procedure successfully completed.

SQL> exec :valcnt := 50000;

PL/SQL procedure successfully completed.

SQL> /
declare
*
ERROR at line 1:
ORA-00600: internal error code, arguments: [mal0-size-too-large], [kksoff :
opitca], [], [], [], [], [], [], [], [], [], []
ORA-06512: at "SYS.DBMS_SQL", line 1321
ORA-06512: at line 12


SQL> select * from v$version where rownum = 1;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production

SQL> 


Это сообщение отредактировал(а) Zloxa - 8.2.2013, 14:58


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
LSD
Дата 8.2.2013, 15:32 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 18
Всего: 538



Цитата(Zloxa @  8.2.2013,  15:23 Найти цитируемый пост)
с 11й версии dbms_sql умеет возвращать и refcursor

Ура! Вот теперь
Цитата(Zloxa @  31.12.2012,  13:34 Найти цитируемый пост)
А ответа на вопрос, как ни печально, так и не прозвучало

ответа действительно прозвучала smile


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Zloxa
Дата 8.2.2013, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 37
Всего: 161



Цитата(LSD @  8.12.2004,  01:17 Найти цитируемый пост)
igon
Не поможет

Кстати, поможет, но лишь отчасти. Конкатенировать три строки уже не получится, но две - да.
Давешняя бага/особенность и по сей день смущает умы постигающие основы эксперементальным способом, а не аналитическим. В продуктивное решение нести такое конечно не след, но де факто получается ограничение длины натив динамик запроса в 64к, а не в 32к
Код

SQL> set serveroutput on
SQL> var result refcursor
SQL> declare 
  2    s1 varchar2(32767);
  3    s2 varchar2(32767);
  4  begin
  5    s1 := rpad('select *',32767,' ');-- добавляем пробелы справа
  6    s2 := lpad('from dual',32767,' '); -- добавляем пробелы слева
  7    dbms_output.put_line('total length ='||(length(s1)+length(s2)));
  8    open :result for s1||s2;
  9  end;
 10  /
total length =65534

PL/SQL procedure successfully completed.

SQL> print result;

D
-
X


а ручки то - вот они ©  smile 

Это сообщение отредактировал(а) Zloxa - 8.2.2013, 17:36


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Страницы: (3) Все 1 2 [3] 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Oracle"
Zloxa
LSD

Данный раздел предназначен для обсуждения проблем с Oracle Database, другие продукты Oracle здесь не обсуждаются. Просьба при создании темы, придерживаться следующих правил:

  • при создании темы давайте ей осмысленное название, описывающее суть проблемы
  • указывайте используемую версию базы, способ соединения и язык программирования
  • при ошибках обязательно приводите код ошибки и сообщение сервера
  • приводите код в котором возникла ошибка, по возможности дайте тестовый пример демонстрирующий ошибку
  • при вставке кода используйте соответсвующие теги: [code=sql] [/code] для подсветки SQL и PL/SQL кода, [code=java] [/code] - для Java, и т.д.

  • документация по Oracle: 9i, 10g, 11g
  • книги по Oracle можно поискать здесь
  • действия модераторов можно обсудить здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, LSD.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Oracle | Следующая тема »


 




[ Время генерации скрипта: 0.0747 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.