Форум: "Начинающим";
Текущий архив: 2008.06.08;
Скачать: [xml.tar.bz2];
ВнизОсвобождение ресурса в finally Найти похожие ветки
← →
ANB (2008-05-04 15:13) [440]Мой ответ :
with X as
(
select
"<?xml version="1.0" encoding="windows-1251" ?>
<requests>
<request request_type="101" request_sum="15.45"/>
<request request_type="102" request_sum="15.45"/>
<request request_type="104" request_sum="16.45"/>
<request request_type="101" request_sum="11.45"/>
<request request_type="101" request_sum="15.45"/>
<request request_type="101" request_sum="15.45"/>
<request request_type="101" request_sum="15.45"/>
<request request_type="102" request_sum="15.45"/>
<request request_type="101" request_sum="15.45"/>
<request request_type="101" request_sum="15.45"/>
<request request_type="103" request_sum="15.45"/>
<request request_type="101" request_sum="14.45"/>
<request request_type="105" request_sum="15.45"/>
<request request_type="101" request_sum="15.45"/>
<request request_type="101" request_sum="11.45"/>
<request request_type="106" request_sum="15.45"/>
<request request_type="101" request_sum="12.45"/>
<request request_type="101" request_sum="15.45"/>
<request request_type="101" request_sum="15.45"/>
<request request_type="107" request_sum="15.45"/>
<request request_type="101" request_sum="15.45"/>
<request request_type="102" request_sum="18.45"/>
<request request_type="103" request_sum="15.45"/>
<request request_type="101" request_sum="15.45"/>
</requests>
"
XMLValue
from dual
)
select
request_type
,count(*) request_count
,sum(request_sum) request_count
from
(
select
extractvalue (value (XMLValue), "/request@request_type") request_type
,to_number(extractvalue (value (XMLValue), "/request@request_sum"),"999999999999.9999") request_sum
from
table
(
xmlsequence
(
xmltype((
select
XMLValue
from
X
)).extract ("/requests/request")
)
) XMLValue
)
group by
request_type
-- Начал 15:02
-- Закончил 15:12
Зазвиняюсь за задержку - начальник отвлек. Время честное.
← →
ANB (2008-05-04 15:15) [441]Да. Реальное решение будет еще проще, т.к. я заранее перегоню клоб в переменную.
← →
ANB (2008-05-04 15:18) [442]Для тех, у кого нету оракла ответ :
REQUEST_TYPE REQUEST_COUNT REQUEST_COUNT
1 101 15 219.75
2 102 3 49.35
3 103 2 30.9
4 104 1 16.45
5 105 1 15.45
6 106 1 15.45
7 107 1 15.45
← →
ANB (2008-05-04 15:19) [443]Ой. Накосячил чуток.
Код :
with X as
(
select
"<?xml version="1.0" encoding="windows-1251" ?>
<requests>
<request request_type="101" request_sum="15.45"/>
<request request_type="102" request_sum="15.45"/>
<request request_type="104" request_sum="16.45"/>
<request request_type="101" request_sum="11.45"/>
<request request_type="101" request_sum="15.45"/>
<request request_type="101" request_sum="15.45"/>
<request request_type="101" request_sum="15.45"/>
<request request_type="102" request_sum="15.45"/>
<request request_type="101" request_sum="15.45"/>
<request request_type="101" request_sum="15.45"/>
<request request_type="103" request_sum="15.45"/>
<request request_type="101" request_sum="14.45"/>
<request request_type="105" request_sum="15.45"/>
<request request_type="101" request_sum="15.45"/>
<request request_type="101" request_sum="11.45"/>
<request request_type="106" request_sum="15.45"/>
<request request_type="101" request_sum="12.45"/>
<request request_type="101" request_sum="15.45"/>
<request request_type="101" request_sum="15.45"/>
<request request_type="107" request_sum="15.45"/>
<request request_type="101" request_sum="15.45"/>
<request request_type="102" request_sum="18.45"/>
<request request_type="103" request_sum="15.45"/>
<request request_type="101" request_sum="15.45"/>
</requests>
"
XMLValue
from dual
)
select
request_type
,count(*) request_count
,sum(request_sum) request_sum
from
(
select
extractvalue (value (XMLValue), "/request@request_type") request_type
,to_number(extractvalue (value (XMLValue), "/request@request_sum"),"999999999999.9999") request_sum
from
table
(
xmlsequence
(
xmltype((
select
XMLValue
from
X
)).extract ("/requests/request")
)
) XMLValue
)
group by
request_type
Ответ :
REQUEST_TYPE REQUEST_COUNT REQUEST_SUM
1 101 15 219.75
2 102 3 49.35
3 103 2 30.9
4 104 1 16.45
5 105 1 15.45
6 106 1 15.45
7 107 1 15.45
Мона засчитать, что закончил в 15:19.
← →
Palladin © (2008-05-04 15:25) [444]
procedure TForm1.Button1Click(Sender: TObject);
Type
PRec=^TRec;
TRec=Record
Count:Integer;
Sum:Currency;
End;
Var
theSource:TWRXMLElements;
theReqs:TWRXMLElements;
theResults:TWRIntegerMap;
nType:Integer;
fSum:Currency;
n,i:Integer;
Function _NewElement:PRec;
Begin
New(Result);
Result.Count:=0;
Result.Sum:=0;
End;
begin
theResults:=TWRIntegerMap.Create;
Try
theSource:=CreateWRXMLFromFile("c:\test.xml");
Try
If theSource.Count=2 Then theReqs:=theSource[1].Elements.ByName["request"] Else
If theSource.Count=1 Then theReqs:=theSource[0].Elements.ByName["request"] Else Exit;
If theReqs=Nil Then Exit;
For i:=0 to theReqs.Count-1 Do
Begin
nType:=theReqs[i].AsInt["request_type"];
fSum:=theReqs[i].AsCur["sum"];
If Not theResults.Find(nType,n) Then theResults.Add_Integer(nType,Integer(_NewElement),n);
Inc(PRec(theResults.IntegerData[n]).Count);
With PRec(theResults.IntegerData[n])^ Do Sum:=Sum+fSum;
End;
For i:=0 to theResults.Count-1 Do
With PRec(theResults.IntegerData[i])^ Do
Memo1.Lines.Add("Type:"+IntToStr(theResults[i])+", Count:"+IntToStr(Count)+", Sum:"+CurrToStr(Sum));
Finally
theSource.Free;
End;
Finally
For i:=0 to theResults.Count-1 Do
Dispose(PRec(theResults.IntegerData[i]));
theResults.Free;
End;
end;
жду вопросов и претензий
← →
Palladin © (2008-05-04 15:27) [445]о как... мы оказывается не о делфи...
← →
ANB (2008-05-04 15:42) [446]
> о как... мы оказывается не о делфи...
1. Где было про делфи ?
2. Время больше моего
3. Код у меня явно короче
4. В Д7 у меня не компиляется (ругается на неизвестный тип WRXMLElements)
Что надо прикрутить в юзес ?
← →
ANB (2008-05-04 15:45) [447]Претензии :
1. А где ООП то ?
2. По собственно коду претензий особо нету.
Но : For i:=0 to theResults.Count-1 Do
Dispose(PRec(theResults.IntegerData[i])); меня слегка смущает. Это действительно безопасно ?
← →
Palladin © (2008-05-04 15:56) [448]
> ANB (04.05.08 15:45) [447]
> 1. А где ООП то ?
Везде, я оперирую тремя объектами.
> Но : For i:=0 to theResults.Count-1 Do
> Dispose(PRec(theResults.IntegerData[i])); меня слегка смущает.
> Это действительно безопасно ?
абсолютно
> 4. В Д7 у меня не компиляется (ругается на неизвестный тип
> WRXMLElements)
> Что надо прикрутить в юзес ?
Ничего не нужно, без моих библиотек он у тебя и не скомпилируется. В кратце:
TWRXMLElements,TWRXMLElements - классы представляющие элементы распарсенного XML файла
TWRIntegerMap - класс, карты ключ-значение
← →
Восхищенный (2008-05-04 15:59) [449]> ANB (04.05.08 15:45) [447]
> 1. А где ООП то ?
ООП как раз видно. Не видно ПП. Скорее, это ХП называется.
:о)
← →
ANB (2008-05-04 16:05) [450]
> TWRXMLElements,TWRXMLElements - классы представляющие элементы
> распарсенного XML файла
А про сторонние компоненты я тоже ничего не писал :) Но все соответствует задаче - чем удобнее, тем и пользуемся.
> Везде, я оперирую тремя объектами.
ИМХО : Использование готовых классов - это не совсем ООП. Иначе мона сказать, что я тока ООП и использую.
← →
ANB (2008-05-04 16:07) [451]Пока вывод : противники ПП пользуются им таки, когда нужно быстро чего-нибудь написать.
← →
Palladin © (2008-05-04 16:21) [452]
> А про сторонние компоненты я тоже ничего не писал :)
Ну ты много чего не писал. Да и не сторонние они, они мои личные, и это не компоненты, а библиотека классов разработанная несколько лет назад. Она продолжает развиваться и дальше. XML, например, я реализовал совсем не давно. При чем развивается так, что старые проекты использовавшие эту библиотеку, продолжают компилироваться.
> ИМХО : Использование готовых классов - это не совсем ООП.
Это как раз ООП. Как ты думаешь, на кой нужны классы сами по себе? А никому они не нужны сами по себе. Они призваны решать какие-то задачи. Если ты ожидал, что я сейчас начну рождать систему из мелких классов для решения этой задачи, то ты ошибаешься, у меня набор конкретных классов, однажды написанных, и использование из в совокупности позволяет быстро решить, как эту задачу, так и множество других. Причем решение это интуитивно понятно для тех кто даже и не знает эти классы. Из названий методов и обращений можно догадаться что происходит.
А ты как поклонник ПП и противник ООП не должен пользоватся существующими классами, а разбить процедуру на подпроцедуры. Вот это и будет ПП.
← →
Игорь Шевченко © (2008-05-04 16:28) [453]Palladin © (04.05.08 15:25) [444]
Фаулер бы тебя с дерьмом смешал :)
← →
ANB (2008-05-04 16:28) [454]
> А ты как поклонник ПП и противник ООП не должен пользоватся
> существующими классами, а разбить процедуру на подпроцедуры.
> Вот это и будет ПП.
Гм. Ну тогда я не поклонник ПП, наоборот - крутой ООП программер, т.к. готовыми классами активно пользовался и пользоваться буду. Т.к. удобно и быстро.
А вот свои классы буду как и раньше, писать, тока если очень надо будет и явно будут напрашиваться.
Кстати, твой результат с моим сошелся ?
И последнее - несмотря на использование готового НЕШТАТНОГО кода, я написал минимум втрое быстрее и раз в 5 короче. Причем с использованием штатных процедур сервера.
← →
Palladin © (2008-05-04 16:28) [455]
> Игорь Шевченко © (04.05.08 16:28) [453]
А кто это и за что? позвольте поинтересоваться.. )
← →
ANB (2008-05-04 16:30) [456]
> Гм. Ну тогда я не поклонник ПП, наоборот - крутой ООП программер,
> т.к. готовыми классами активно пользовался и пользоваться
> буду. Т.к. удобно и быстро.
> А вот свои классы буду как и раньше, писать, тока если очень
> надо будет и явно будут напрашиваться.
Смайлик забыл :)
ту ИШ : будь арбитром, сравни код :)
← →
Восхищенный (2008-05-04 16:31) [457]> ANB (04.05.08 16:28) [454]
А можно маленький вопрос - что будет, если понадобится перейти на другой сервер?
:о)
← →
Palladin © (2008-05-04 16:38) [458]
> ANB (04.05.08 16:28) [454]
> Кстати, твой результат с моим сошелся ?
я проверил прежде чем запостить...
> А вот свои классы буду как и раньше, писать, тока если очень
> надо будет и явно будут напрашиваться.
Ну вот видишь, вот и разница между нами только в том, что они у меня явно напрашиваются чаще чем у тебя. А все потому, что работаем мы в разных темах. Я разрабатываю фирменный сервер приложений и API для него. Причем один разрабатываю. Другие только пользуются API и пишут уже клиентские приложения. Да и серьезные приложения все равно тоже я пишу не могу другим доверить, а то нагородят... кроме полного переписывания в результате ничего не останется сделать...
А ты не знаю...
← →
Anatoly Podgoretsky © (2008-05-04 16:39) [459]> ANB (04.05.2008 16:05:30) [450]
Так один из плюсов ООП как раз и состоит в повторном использование кода, в том числе и чужого.
← →
Игорь Шевченко © (2008-05-04 16:40) [460]Palladin © (04.05.08 16:28) [455]
> А кто это
Мартин Фаулер такой. Программист. Автор книг по UML, Рефакторингу и архитектуре корпоративных приложений.
> и за что?
За код, вестимо :)
Где блин инкапсуляция, полиморфизм и прочие там ... наследования ? :)
Что за глобальные переменные n,i ? :)
ANB (04.05.08 16:30) [456]
> ту ИШ : будь арбитром, сравни код :)
Оба кода плохие - вручную посчитать гораздо быстрее.
или скачать из сети нечто, через XPath решающее нужную задачу без всякого оракла
← →
Palladin © (2008-05-04 16:47) [461]
> Где блин инкапсуляция, полиморфизм и прочие там ... наследования
> ? :)
как это где? это все прекрасно используется в TWRIntegerMap и TWRXMLElements... )
но программисту-клиенту этого видеть и знать об этом и не нужно... )
> Что за глобальные переменные n,i ? :)
какие они глобальные, они очень даже локальные... :)
> Мартин Фаулер такой. Программист. Автор книг по UML, Рефакторингу
> и архитектуре корпоративных приложений.
не читал... а может и читал, только автора не запомнил...
← →
ANB (2008-05-04 16:48) [462]
> А можно маленький вопрос - что будет, если понадобится перейти
> на другой сервер?
> :о)
А зачем переходить на другой сервер ?
Проблема возникнет тока если подать на вход более 60 тысяч строк.
Тады придется разбирать XML руками.
Кистате, у Palladin этот вопрос решен ?
> Я разрабатываю фирменный сервер приложений
Трехслойка - самое хреновое новшество от МС.
← →
ANB (2008-05-04 16:51) [463]
> Оба кода плохие - вручную посчитать гораздо быстрее.
Дамс. Об этом варианте я не подумал.
> или скачать из сети нечто, через XPath решающее нужную задачу
> без всякого оракла
1. Эт еще надо найти, скачать и поставить, а оракл уже под рукой
2. Возможности SQL при этом отвалятся. Группировать, что - руками ?
← →
Игорь Шевченко © (2008-05-04 16:53) [464]Palladin © (04.05.08 16:47) [461]
> какие они глобальные, они очень даже локальные... :)
Прошу пардону. Увидел объявление переменных над функцией, решил, что глобальные. Рефлекс, знаете ли.
Вот может твой код и делает то, что надо, но он жутко неясный. Куча всяких деталей вида приведений типов, мелких локальных переменных сильно его загрязняет. Ну и немецкий язык тоже (это когда у объекта берется внутреннее свойство-объект и вызывается метод этого свойства) не проясняет логики
Foo.Elements.ByName(....)
← →
Игорь Шевченко © (2008-05-04 16:53) [465]
> Группировать, что - руками ?
в Excel-е
← →
Palladin © (2008-05-04 16:54) [466]
> Кистате, у Palladin этот вопрос решен ?
дело в том что у меня вообще никакого сервера не используется....
> Проблема возникнет тока если подать на вход более 60 тысяч
> строк.
это смешная цифра...
← →
Игорь Шевченко © (2008-05-04 16:56) [467]В Excel мне потребовалась ровно одна минута чтобы получить результат:
Названия столбцов
101 102 103 104 105 106 107
sum 219,75 49,35 30,9 16,45 15,45 15,45 15,45
Общий итог
362,8
← →
Игорь Шевченко © (2008-05-04 17:00) [468]ANB (04.05.08 16:51) [463]
> 1. Эт еще надо найти, скачать и поставить, а оракл уже под
> рукой
> 2. Возможности SQL при этом отвалятся. Группировать, что
> - руками ?
Видишь ли, Excel - он еще более у всех под рукой и не такой толстый, как оракл.
А если у тебя файл изменится, ты его по новой будешь в with вставлять ?
← →
ANB (2008-05-04 17:03) [469]
> дело в том что у меня вообще никакого сервера не используется.
> ...
Не, я не про это. Файл тысяч в 60 строк аналогичной структуры твой класс нормально съест ?
Просто XMLDom клинит начиная примерно с такого объема.
Мне пришлось писать парсер на клиенте.
> Игорь Шевченко © (04.05.08 16:56) [467]
Вот млин. Самая высокая скорость кодирования. Но опять таки это не ООП :)
← →
Восхищенный (2008-05-04 17:04) [470]> ANB (04.05.08 16:48) [462]
> А зачем переходить на другой сервер ?
А мало ли... например, появился новый заказчик со сходной задачей.. а у него Oracle не используется... да и вообще никакая СУБД не используется... а хочется повторного использования кода, а получается облом-с. Не лучше ли один раз написать, а потом юзать где угодно и сколько угодно?
Да и вообще, какое отношение имеет парсинг XML к серверам БД? Вот нужно XML-файл распарсить - так что ж, из-за этого всем клиентам Oracle ставить, что ли? Как то неправильно это, наверное... монстроидально как-то...
← →
ANB (2008-05-04 17:05) [471]
> А если у тебя файл изменится, ты его по новой будешь в with
> вставлять ?
Не. Это я для наглядности и простоты.
Так файл либо в табличку либо в параметр хранимки.
← →
ANB (2008-05-04 17:06) [472]
> Видишь ли, Excel - он еще более у всех под рукой и не такой
> толстый, как оракл.
Дистрибутив офиса скока весит ?
← →
Palladin © (2008-05-04 17:11) [473]
> ANB (04.05.08 17:03) [469]
Мой класс не является парсером, мой класс лишь представление данных, парсером я пользуюсь внешним... кстати MSXML... сейчас попробую создать большой xml файл и обработать...
← →
Игорь Шевченко © (2008-05-04 17:14) [474]
> Дистрибутив офиса скока весит ?
Всяко легче дистрибутива Oracle
И в Excel-е больше народу умеют работать - поверь. Тот же Эрик Рэймонд пишет, что самый лучший путь решения - это не писать ничего, а найти средство, которое уже умеет решать нужную задачу. Если понадобиться - минимально его доработать (в случае с Excel - написать нужные макросы).
← →
ANB (2008-05-04 17:34) [475]
> И в Excel-е больше народу умеют работать - поверь. Тот же
> Эрик Рэймонд пишет, что самый лучший путь решения - это
> не писать ничего, а найти средство, которое уже умеет решать
> нужную задачу. Если понадобиться - минимально его доработать
> (в случае с Excel - написать нужные макросы).
+1. Согласен с "Эрик Рэймонд" на 100%.
У меня не получается на экселе выкрутится. Мне надо распарсенный XML в таблички разложить и хитро обработать. Но там уже много бизнес-кода.
> Всяко легче дистрибутива Oracle
Дистрибутив оракла весит примерно 260 метров. И ставится в течение 5 минут.
← →
ANB (2008-05-04 17:37) [476]
> Palladin © (04.05.08 17:11) [473]
>
> > ANB (04.05.08 17:03) [469]
>
> Мой класс не является парсером, мой класс лишь представление
> данных, парсером я пользуюсь внешним... кстати MSXML...
> сейчас попробую создать большой xml файл и обработать...
>
Это не критика. Эт я пробить возможности. А то что то полезли объемы и не всегда мона отбится от XML формата обмена. Я одну дырку заткнул, где совсем падало. Но решение мне ни фига не понравилось - парсер на клиенте, XML разбираю руками, как строку. Вроде по скорости ничего - 100 тысяч чисто разбор - секунд 20. Но все вместе - полчаса. Все довольны, т.к. раньше по двое суток колбасило, без гарантии, что вообще что то получится (как правило оут оф мемори ловили).
← →
Anatoly Podgoretsky © (2008-05-04 17:38) [477]> ANB (04.05.2008 16:51:43) [463]
С Ораклом, как бы проще скачать, поставить и настроить. А когда оно сможет у человека нормально заработать?
← →
Anatoly Podgoretsky © (2008-05-04 17:39) [478]> ANB (04.05.2008 17:06:52) [472]
А вот я компьютера без Экселя не видел, а вот без Оракла сколько угодно, а точнее я вообще не видел компьютера с Ораклом.
← →
Игорь Шевченко © (2008-05-04 17:42) [479]ANB (04.05.08 17:34) [475]
> Дистрибутив оракла весит примерно 260 метров
А то, что у меня 10.2.0.3 633 метра, так это просто случайность. И ставится малость подольше. Наверное машина медленная.
> У меня не получается на экселе выкрутится. Мне надо распарсенный
> XML в таблички разложить и хитро обработать. Но там уже
> много бизнес-кода.
Это уже другая задача ведь, а не та, которую ты привел ?
Я к другому - для довольно многих задач Excel вполне достаточен и умеющих им, Excel-ем пользоваться всяко больше, чем программистов всех мастей.
И для задач, подобных приведенной тобой, нет смысла соревноваться в скорости написания программы с ООП vs запрос для Oracle.
← →
Игорь Шевченко © (2008-05-04 17:43) [480]Anatoly Podgoretsky © (04.05.08 17:39) [478]
> а точнее я вообще не видел компьютера с Ораклом.
приезжай в Москву, покажу
Страницы: 1 2 3 4 5 6 7 8 9
10 11 12 13 14 15 16 17 вся ветка
Форум: "Начинающим";
Текущий архив: 2008.06.08;
Скачать: [xml.tar.bz2];
Память: 1.6 MB
Время: 0.237 c