Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
15-1209231698
Andy BitOff
2008-04-26 21:41
2008.06.08
Математика. Как реализовано?


2-1211102144
Alx
2008-05-18 13:15
2008.06.08
Проблема с целостностью данных


2-1211044712
lewka-serdceed
2008-05-17 21:18
2008.06.08
Нажатие на Enter


15-1209508896
BlueDragon
2008-04-30 02:41
2008.06.08
GPRS&amp;Модем


15-1209194604
USB
2008-04-26 11:23
2008.06.08
USB 1.1 или 2.0





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский