|
|
|
СУБД для учета финансовых потоков?
|
|||
|---|---|---|---|
|
#18+
Председатель Маоа теперь представьте Уважаемый, Вы пожалуйста сначала покажите свое решение, потом будем разбираться с другими Вашими... веселыми представлениями. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2006, 13:27 |
|
||
|
СУБД для учета финансовых потоков?
|
|||
|---|---|---|---|
|
#18+
SergSuperкстати вот пример недостатка оракловского null в строках по сравнению с ансишным Да нет недостатка, просто я расписал этот фрагмент так, чтобы неоракловцы точно поняли, что имеется в виду. Реально там следовало бы использовать функцию nvl2 и результат был бы таким же, как у Вас. Впрочем, это как раз наиболее неудачная особенность null-ов. Почему неудачная - приведу пример: Код: plaintext В этом случае, если из-за ошибки программиста coeff окажется null-ом, данные просто молча погибнут. Я бы предпочел, чтобы такая ситуация трактовалась как ошибка (возбуждала исключение). Вы в своем примере удачно используете эту особенность, но имхо редкое удобство неадекватно потенциальным минусам. Yo.!! Мне кажется, кто-то из нас двоих тормозит, и мне кажется, это не я. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2006, 13:38 |
|
||
|
СУБД для учета финансовых потоков?
|
|||
|---|---|---|---|
|
#18+
softwarer Мне кажется, кто-то из нас двоих тормозит, и мне кажется, это не я. да, стормозил, мне показалось, что в начале был sql. а не динамический. ЗЫ. а зачем nvl2, imho nvl вполне хватает ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2006, 13:47 |
|
||
|
СУБД для учета финансовых потоков?
|
|||
|---|---|---|---|
|
#18+
Yo.!! imho nvl вполне хватает ? Решение с nvl, которое я вижу, нравится мне меньше, чем использование nvl2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2006, 13:51 |
|
||
|
СУБД для учета финансовых потоков?
|
|||
|---|---|---|---|
|
#18+
Председатель Маоа что в оракле нет isnull()? Cкорее всего нет. Нафиг ему плохо названная нестандартная функция? В стандарте есть coalesce, которая удобнее и ораклового nvl, и mssql-ного isnull. На текущий момент я рекомендую своим использовать в коде именно coalesce. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2006, 13:55 |
|
||
|
СУБД для учета финансовых потоков?
|
|||
|---|---|---|---|
|
#18+
softwarer Председатель Маоа теперь представьте Уважаемый, Вы пожалуйста сначала покажите свое решение, потом будем разбираться с другими Вашими... веселыми представлениями. Судя по вашему примеру, Вы хотите показать, что вы даете грант юзеру на процедуру чужой для него схемы, а на таблицу не даете. И при попытке вызвать процедуру он получает выборку, а при попытке сделать прямой селект к таблице от винта. Я правильно понял? Просто в оракле совсем несилен. Если это так, то такое же можно сделать в MSSQL,заводите юзера и даете ему грант на процедуру с селектом,а на прямой select не даете. Опять таки, если я правильно разобрался в вашем коде. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2006, 14:17 |
|
||
|
СУБД для учета финансовых потоков?
|
|||
|---|---|---|---|
|
#18+
Председатель МаоЕсли это так, то такое же можно сделать в MSSQL Ну так сделайте, пожалуйста. Покажите код и результаты, полный скрипт, который любой может выполнить и увидеть. Напоминаю: 1. Есть два пользователя, t_app и t_user (или как угодно еще названные) 2. У пользователя t_app есть таблица 3. У пользователя t_app есть процедура, получающая строку фильтра и возвращающую выборку из таблицы, отфильтрованную указанным выражением 4. Пользователь t_user может вызвать процедуру и увидеть результаты 5. Пользователю t_user недоступен прямой select к таблице ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2006, 14:22 |
|
||
|
СУБД для учета финансовых потоков?
|
|||
|---|---|---|---|
|
#18+
SergSuper Председатель Мао SergSuper Председатель Мао2 softwarer а теперь представьте что ваше безобидная лишняя строчка open по свой сути применяет иной механизм выборки данных. То есть обычный селект будет намного быстрее работать, чем перебор строчек. А когда большой объем выборки, оракл скажет кря? Не факт, это только домыслы Так может давайте проверим? А что проверять? И там и там процедуры выплёвывают данные клиенту. Почему должна быть разница? Допустим у вас есть 6000 записей, вам нужно их вернуть. При селекте это будет одна итерация к серверу с 6000 строками, а при курсоре 6000 итераций по одной записи. Улавливаете разницу. Это конечно очень натянуто, но суть я думаю ясна. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2006, 14:23 |
|
||
|
СУБД для учета финансовых потоков?
|
|||
|---|---|---|---|
|
#18+
Председатель МаоДопустим у вас есть 6000 записей, вам нужно их вернуть. При селекте это будет одна итерация к серверу с 6000 строками, а при курсоре 6000 итераций по одной записи. Улавливаете разницу. Это конечно очень натянуто, но суть я думаю ясна. Конечно, улавливаем. Допустим, мы хотим вывести эти данные в грид, показать пользователю. Вашей программе придется ждать, пока с сервера приедут все 6000 (или 60000. или 600000) записей. Моя запросит первые сто строк, покажет первые двадцать пять, и если пользователь не будет особо нажимать PgDn, оставшиеся никогда у сервера и не попросит. Если же мне потребуются все строки, например чтобы построить по ним какую-нибудь хитрую графику, я установлю FetchSize в миллион и опять же получу их "за одну итерацию". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2006, 14:28 |
|
||
|
СУБД для учета финансовых потоков?
|
|||
|---|---|---|---|
|
#18+
softwarer SergSuperкстати вот пример недостатка оракловского null в строках по сравнению с ансишным Да нет недостатка, просто я расписал этот фрагмент так, чтобы неоракловцы точно поняли, что имеется в виду. Реально там следовало бы использовать функцию nvl2 и результат был бы таким же, как у Вас. Так точно же мне кажется не получится, но я думаю тут и так всё понятно Хотя интересно посмотреть как это выглядит с nvl2 и nvl softwarer Впрочем, это как раз наиболее неудачная особенность null-ов. Почему неудачная - приведу пример: Код: plaintext В этом случае, если из-за ошибки программиста coeff окажется null-ом, данные просто молча погибнут. Я бы предпочел, чтобы такая ситуация трактовалась как ошибка (возбуждала исключение). Вы в своем примере удачно используете эту особенность, но имхо редкое удобство неадекватно потенциальным минусам. Если поле не допускает нулов - то будет ошибка. Мне кажется наоборот удобно когда есть некая отдельная сущность. А на самом деле это больше дело привычки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2006, 14:35 |
|
||
|
СУБД для учета финансовых потоков?
|
|||
|---|---|---|---|
|
#18+
softwarer Председатель МаоДопустим у вас есть 6000 записей, вам нужно их вернуть. При селекте это будет одна итерация к серверу с 6000 строками, а при курсоре 6000 итераций по одной записи. Улавливаете разницу. Это конечно очень натянуто, но суть я думаю ясна. Конечно, улавливаем. Допустим, мы хотим вывести эти данные в грид, показать пользователю. Вашей программе придется ждать, пока с сервера приедут все 6000 (или 60000. или 600000) записей. Моя запросит первые сто строк, покажет первые двадцать пять, и если пользователь не будет особо нажимать PgDn, оставшиеся никогда у сервера и не попросит. Если же мне потребуются все строки, например чтобы построить по ним какую-нибудь хитрую графику, я установлю FetchSize в миллион и опять же получу их "за одну итерацию". Спорить не буду. Вы правы. Для прикладного применения принципиальной разницы нет. Конечному юзеру одновременно не нужно сразу 6000, элементарно на монитор не влезет. хватит и 100. Я просто сужу по MS, рекомендуется использовать курсоры, лишь тогда когда без них никак, а в оракл я так понял бегает по курсорам с крейсерской скоростью ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2006, 14:40 |
|
||
|
СУБД для учета финансовых потоков?
|
|||
|---|---|---|---|
|
#18+
SergSuper Так точно же мне кажется не получится, но я думаю тут и так всё понятно Хотя интересно посмотреть как это выглядит с nvl2 и nvl Код: plaintext 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. куда nvl2 честно говоря и не знаю ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2006, 14:44 |
|
||
|
СУБД для учета финансовых потоков?
|
|||
|---|---|---|---|
|
#18+
Yo.!!, достаточно было одной строчки вобщем без ANDа фильтер не получается :) а я почему-то считал что ISNULL - это ансишное, а COALESCE - это от SyBase... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2006, 14:56 |
|
||
|
СУБД для учета финансовых потоков?
|
|||
|---|---|---|---|
|
#18+
SergSuperХотя интересно посмотреть как это выглядит с nvl2 и nvl Код: plaintext 1. 2. SergSuperЕсли поле не допускает нулов - то будет ошибка. Если не допускает, то будет ошибка. А если допускает? SergSuperМне кажется наоборот удобно когда есть некая отдельная сущность. А на самом деле это больше дело привычки. Null как отдельная сущность - очень хорошая вещь. Это не дело привычки, поверьте, это дело соответствия инструмента задачам. Я работал над проектом, где было принято неиспользование null-ов, и насмотрелся на вытекающие из этого проблемы и ошибки, которые люди делали и делали несмотря на привычку. Я целиком за null как отдельную сущность, но данную конкретную деталь его определения - "большинство операций с null дает результатом null" - я бы сделал иначе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2006, 15:26 |
|
||
|
СУБД для учета финансовых потоков?
|
|||
|---|---|---|---|
|
#18+
Привет, softwarer! Ты пишешь: softwarers> Я целиком за null как отдельную сущность, но данную конкретную деталь его определения - s> "большинство операций с null дает результатом null" - я бы сделал иначе.интересно об этом поговорить. как именно иначе? -- With best regards, Мимопроходящий. Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2006, 15:28 |
|
||
|
СУБД для учета финансовых потоков?
|
|||
|---|---|---|---|
|
#18+
Мимопроходящийкак именно иначе? Операции, в которых может участвовать null, можно разбить на три группы: - те, в которых его участие осмысленно (is null, =, ||) - те, в которых его участие [почти всегда] бессмысленно (скажем, арифметика) - те, в которых вообще говоря бессмысленно, но сложно отфильтровать (скажем, агрегатные функции) Куда отнести сравнение на меньше-больше - не уверен, интуитивно хочется во вторую группу, но есть ситуации, в которых будет уместна первая, так что скорее туда. Так вот, первую и третью группы я бы оставил работать как сейчас, а во второй аргумент null считал бы ошибкой. Разумеется, все это строится на предположении о существовании "бессмысленных" операций. А это предположение - на том, что с ситуацией, где арифметика с участием null осмысленна, я не сталкивался. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2006, 16:04 |
|
||
|
СУБД для учета финансовых потоков?
|
|||
|---|---|---|---|
|
#18+
Привет, softwarer! Ты пишешь: softwarers> - те, в которых его участие [почти всегда] бессмысленно (скажем, арифметика) s> Так вот, первую и третью группы я бы оставил работать как сейчас, а во второй аргумент null считал бы ошибкой. s> Разумеется, все это строится на предположении о существовании "бессмысленных" операций. s> А это предположение - на том, что с ситуацией, где арифметика с участием null осмысленна, я не сталкивался. ну а ныне, к примеру, стоимость = количество * цена, если любой из операндов NULL, то результат NULL, вполне логичен. ты предлагаешь генерить exception для таких случаёв? -- With best regards, Мимопроходящий. Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2006, 16:18 |
|
||
|
СУБД для учета финансовых потоков?
|
|||
|---|---|---|---|
|
#18+
softwarer SergSuperЕсли поле не допускает нулов - то будет ошибка. Если не допускает, то будет ошибка. А если допускает? А если поле допускает значение null, и в него таки записали null, пусть и по ошибке, по поводу чего СУБД возвращать ошибку? Если coeff окажется нулём -- тоже возвращать ошибку? А ведь данные пострадают немногим меньше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2006, 17:00 |
|
||
|
СУБД для учета финансовых потоков?
|
|||
|---|---|---|---|
|
#18+
softwarer Председатель МаоЕсли это так, то такое же можно сделать в MSSQL Ну так сделайте, пожалуйста. Покажите код и результаты, полный скрипт, который любой может выполнить и увидеть. Напоминаю: 1. Есть два пользователя, t_app и t_user (или как угодно еще названные) 2. У пользователя t_app есть таблица 3. У пользователя t_app есть процедура, получающая строку фильтра и возвращающую выборку из таблицы, отфильтрованную указанным выражением 4. Пользователь t_user может вызвать процедуру и увидеть результаты 5. Пользователю t_user недоступен прямой select к таблице Код: plaintext 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. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2006, 17:09 |
|
||
|
СУБД для учета финансовых потоков?
|
|||
|---|---|---|---|
|
#18+
Если не строить динамическую строку, а возвращать нормальный селект, то курсоры и прочее открывать не нужно. Все нормально отработает. Как вариант еще можно динамически в сессии законнектится под sa затем дать права на select, отработать select, забрать права, отконнектится как sa. Но лучше курсор. То есть mssql 2000, насчет 2005 не в курсе при построении в процедуре строки select, работает так же как будто бы он прямой. Но если в проц. записать прямой селект статический, то он будет нормально отрабатывать у юзера, у которго нет гранта на селект, но есть грант на процедуру. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2006, 17:16 |
|
||
|
СУБД для учета финансовых потоков?
|
|||
|---|---|---|---|
|
#18+
Председатель, ну чего изощряться то? Вопрос был в том можно ли в 2000-м запустить динамический запрос под правами создателя процедуры. Ответ: НЕТ. В 2005 можно. Ну смешно же where вручную писать ( left(@name,3)=@filter). Мало ли чего нельзя, зачем рефлексировать - это же не говорит что без этого вообще невозможно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2006, 17:32 |
|
||
|
СУБД для учета финансовых потоков?
|
|||
|---|---|---|---|
|
#18+
SergSuperПредседатель, ну чего изощряться то? Вопрос был в том можно ли в 2000-м запустить динамический запрос под правами создателя процедуры. Ответ: НЕТ. В 2005 можно. Ну смешно же where вручную писать ( left(@name,3)=@filter). Мало ли чего нельзя, зачем рефлексировать - это же не говорит что без этого вообще невозможно Просто softwarer настаивал, чтобы ему привели код. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2006, 17:39 |
|
||
|
СУБД для учета финансовых потоков?
|
|||
|---|---|---|---|
|
#18+
softwarerНет, не так. Точнее, я не имею личного опыта - не вижу никакого смысла использовать ODBC - но кого-то из спрашиваюших лично посылал в статью, где расписывалось, как использовать эту фичу через ODBC.Посылать - дело нехитрое. Но что-то мне подсказывает, что реализация этой фичи даже если и возможна через ODBC, то сопровождается неоправданным геморроем в духе "мы это, конечно, сделать можем, но лучше не надо". ODBC не допускает асинхронной передачи данных, следовательно, эмуляция такой возможности будет более чем сложной при реализации и с весьма убогими результатами. softwarerПростуда здесь вызвана тем фактом, что клиентский код начинает неоправданно зависеть от реализации серверного.Хмм, степень оправданности - вещь достаточно субъективная. Полагаю в Oracle тоже найдутся подобные казусы, но мы о них разумеется, говорить не будем. softwarer ChAНо если правильно помню, то стандарт ODBC не поддерживает Тем хуже для него. Я не понимаю, какой смысл кивать на кривой и мертвый стандарт и гордиться наследованием его глупостей.Ну это всего лишь Ваше мнение, да и слухи о его смерти сильно преувеличены. IMHO, наличие любого общепринятого стандарта лучше, чем его отсутствие. Впрочем, знаком с Вашим пренебрежением к любым стандартам, включая законы ;) Хорошо, что это ограничивается только словами. softwarerРезюмируя: по сравнению с MSSQL, в Oracle для записи того же требуется одна лишняя строка (open for select вместо просто select). Этим мы покупаем именованные параметры-рекордсеты и возможность легко крутить выборки так, как нам удобно, в частности передавать их между подпрограммами и использовать на сервере.Это только синтаксис, за которым скрывается мощный промежуточный слой, доступный клиентам фактически только через "родной" API. А курсоры и в MSSQL можно передавать из вызываемой процедуры в вызывающую процедуру, только этим, как правило, никто не пользуется, так как принято работать с множествами, а не рекордсетами. Инструмент диктует правила владения им, топором забивать гвозди можно, но не так удобно, как молотком. softwarerЧто касается второго из приведенных мной примеров, то подозреваю ответа на него я не дождусьЕсли Вы про это , то с какого лешего Вы ждете ответа от меня ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2006, 17:41 |
|
||
|
СУБД для учета финансовых потоков?
|
|||
|---|---|---|---|
|
#18+
Председатель Мао Ээ.... я бы отметил, что в постановке задачи говорится о фильтрации произвольным выражением, а не о передаче маски для конкретного поля. Если говорить о задаче в том объеме, который сделали Вы, мне кажется можно обойтись без промежуточной таблицы, возвращая статическую выборку - например, используя like по переданному значению. Но я бы отметил именно тот факт, что в MSSQL при полноценном решении придется делать так, как делаете Вы - сначала динамическим sql с собственными правами наполнить временную таблицу, а потом статическим sql вернуть ее наружу. Эффективность этой конструкции.... не впечатляет, имхо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2006, 17:49 |
|
||
|
СУБД для учета финансовых потоков?
|
|||
|---|---|---|---|
|
#18+
ChAПосылать - дело нехитрое Хм. ChA Но что-то мне подсказывает Это "что-то" - то же, что подсказывало ее невозможность? ChA, что реализация этой фичи даже если и возможна через ODBC, то сопровождается неоправданным геморроем в духе "мы это, конечно, сделать можем, но лучше не надо". Хм. Вообще-то весь ODBC - отлично вписывается в формулировку неоправданный геморрой в духе "мы это, конечно, сделать можем, но лучше не надо". Сколь я помню ту статью, никакого дополнительного геморроя при этом нет. Cерверная процедура остается неизменной, в ODBC результат возвращается так же, как вернулся бы из аналогичной MSSQL-процедуры и выбирается тем же клиентским кодом. ChAХмм, степень оправданности - вещь достаточно субъективная. В общем случае - да. Тем не менее, зависимость интерфейса от реализации - повсеместно считается неоправданной. ChAПолагаю в Oracle тоже найдутся подобные казусы, но мы о них разумеется, говорить не будем. Наверное, найдутся. Говорите, с интересом послушаю. Вон, председатель тоже был уверен в наличии казуса. ChAНу это всего лишь Ваше мнение, да и слухи о его смерти сильно преувеличены. Ну, "мнение" таки весомее "отмазок". Слухи же Вы легко можете развеять, если приведете внушительный список распространенного прикладного ПО, использующего ODBC как единственный либо основной интерфейс взаимодействия с БД. Могу даже ограничить задачу: список ПО авторства Microsoft, использующего ODBC как единственный либо основной интерфейс. Относительно ПО авторства Oracle и OCI - поверите на слово, что приведу такой список? ChAIMHO, наличие любого общепринятого стандарта лучше, чем его отсутствие. Общепринятых стандартов в RDBMS нет. Что же до стандартов вообще - наличие хороших стандартов хорошо, наличие плохих стандартов плохо. Отсутствие стандартов - посередине. ChAВпрочем, знаком с Вашим пренебрежением к любым стандартам, включая законы ;) Хорошо, что это ограничивается только словами. Поверхностное знакомство диктует поверхностные выводы. ChAА курсоры и в MSSQL можно передавать из вызываемой процедуры в вызывающую процедуру Стоп. Курсоры или рекордсеты? Поясню: в описанном механизме Oracle я могу один и тот же курсор и использовать на сервере, и передать на клиента. То есть если есть хранимка, возвращающая выборку, я могу использовать эту выборку и на сервере, и на клиенте. Сколь я понимаю в MSSQL, тот явный курсор, который можно передать, и тот неявный рекордсет, который едет на клиента - разные вещи, "одной процедуры для обоих применений" сделать не удастся. Или я заблуждаюсь? ChAто с какого лешего Вы ждете ответа от меня ? А кто Вам сказал, что я жду ответа от Вас? Эта фраза - часть резюме по сравнению. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2006, 18:10 |
|
||
|
|

start [/forum/topic.php?fid=35&msg=34134414&tid=1553427]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
38ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
| others: | 231ms |
| total: | 375ms |

| 0 / 0 |
