Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Сравнение СУБД Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 47 48 49 50 51 [52] 53 54 55 56 .. 75   вперед  Ctrl
 Re: Выбор СУБД!  [new]
Зайцев Фёдор
Member

Откуда: Лужки
Сообщений: 5308
МСУ
locky
Лучше напишите мне функцийку, которая реализует nextval.

зы а задача - достаточно нередкая.


Промежуточная таблица + (IDENT_CURRENT + приращение)

Другого способа не знаю

Этого способа тоже нет. Это не nextval.
4 фев 09, 17:07    [6779347]     Ответить | Цитировать Сообщить модератору
 Re: Выбор СУБД!  [new]
МСУ
Member [заблокирован]

Откуда: http://codearticles.ru
Сообщений: 31089
locky
Если для вас это - лисапет, значит, у вас для этого имеется решение.

Глупость полнейшая. Сами открыли такой Закон?

locky
В студию, как говорится.

Я уже отвечал на этот вопрос.
4 фев 09, 17:13    [6779399]     Ответить | Цитировать Сообщить модератору
 Re: Выбор СУБД!  [new]
МСУ
Member [заблокирован]

Откуда: http://codearticles.ru
Сообщений: 31089
Зайцев Фёдор
Этого способа тоже нет. Это не nextval.

nextval нет по определению в сиквеле. Речь идет о велосипеде.
4 фев 09, 17:14    [6779411]     Ответить | Цитировать Сообщить модератору
 Re: тогда вопрос номер два!  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
Gluk (Kazan)
Вот и хочется наконец-то услышать такую задачу

Чорт, это будет долго....
Есть некая биллинговая система.
В ней есть начисления, есть документы оплаты, есть информация о судебной работе, о мировых соглашениях.

начисления
create table Debet(
Date datetime, -- месяц, за который проведены начисления
[Sum] money -- начисленная сумма
)

оплаты
create table Credit
(
Doc int, -- id документа
Type int, -- тип документа, 0 - квитанция, 1 - субсидия
[Sum] money, -- сумма оплаты
Df datetime, -- начало периода оплаты, всегда 1-е число месяца
Dt datetime -- конец периода оплаты, всегда последнее число месяца
)

судебные решения
create table Court(
[Sum1] money, --сумма по решению суда
[sum2] money -- уже выплаченная сумма
[sum3] money, -- сумма обязательного платежа
Df datetime, -- начало периода оплаты, всегда 1-е число месяца
Dt datetime -- конец периода оплаты, всегда последнее число месяца
)
-- обязательные платежи по мировому соглашению
create table Pays
(
Date datetime, -- месяц платежа
[Sum] money -- сумма обязательного платежа
)
--уже разнесенные оплаты
create table distr
(
doc int, -- id разнесенного документа
date datetime, -- месяц, на который относится оплата
[sum] money -- отнесенная сумма
)

правила разнесения:
1. Оплата разносится по месяцам зажолженности от первого неоплаченного периода до последнего в пределах периода оплаты, указанного в документе оплаты.
2. если после разнесения документа оплаты на документе осталась неразнесённая сумма, то эта сумма разносится начиная с самого первого неоплаченного периода вверх.
3. остаток суммы бросается на последний период.
4. если существует неполностью оплаченное судебное решение, то документ сначала относится на неоплаченные периоды в рамках периода, указанного в судебном решении. на каждый месяц относится не более суммы, указанной в судебном решении в качестве обязательного платежа. Разноска производится в рамках суммы судебного решения. Остаток суммы разносится по п.п. 1-3
5. если есть мировое соглашение, то сначала разносится сумма обязательного платежа по мировому соглашению на указанный период, остаток суммы разносится по п.п. 1-3.
6. если в документах оплаты есть субсидия, то сначала разносится она, пропорционально по месяцам, указанным в периоде документа, независимо от того, оплачены периоды или нет. "Копейки" теряться не должны
7. если в результате разбиения получилось так, что какой-то период "переплачен", сумма переплаты должна быть снята с этого периода и разнесена по вышеуказанным правилам. Действие должно быть произведено до и после разноски (до - для того чтобы учесть результаты перерасчетов, после - для того, чтобы учесть побочные эффекты субсидии).

На выходе должен получится select, который приведёт табличку distr в непротиворечивое состояние.

зы на самом деле в исходном тз было несколько страниц правил, которые учитывали кучу всяких там нюансов и т.д, но, как мне кажется - хватит и этого.
4 фев 09, 17:16    [6779431]     Ответить | Цитировать Сообщить модератору
 Re: тогда вопрос номер два!  [new]
Yo.!
Guest
softwarer

Эти редкие задачи можно и нужно решать с помощью GTT.

+1
с учетом, что на GTT можно и вью одевать, читаемость процедур с GTT гораздо больше.
4 фев 09, 17:16    [6779432]     Ответить | Цитировать Сообщить модератору
 Re: тогда вопрос номер два!  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
softwarer
locky
Если есть задача, которую не решить без LTT,

Таких нет. Вы незаметно меняете тему между "одним запросом" и "без LTT".

М.б., заодно откажемся и от локальных переменных? Зачем они? Ведь всегда можно завести "глобальную"...
4 фев 09, 17:18    [6779452]     Ответить | Цитировать Сообщить модератору
 Re: тогда вопрос номер два!  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
softwarer
Эти редкие задачи можно и нужно решать с помощью GTT.

.... раз уж другого ничего нету...
4 фев 09, 17:19    [6779456]     Ответить | Цитировать Сообщить модератору
 Re: тогда вопрос номер два!  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 67534
Блог
locky
М.б., заодно откажемся и от локальных переменных? Зачем они? Ведь всегда можно завести "глобальную"...

Если локальных переменных требуется пара штук на всю систему - безусловно, лучше завести глобальную и не плодить сущностей без необходимости.
4 фев 09, 17:20    [6779464]     Ответить | Цитировать Сообщить модератору
 Re: тогда вопрос номер два!  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
softwarer
locky
М.б., заодно откажемся и от локальных переменных? Зачем они? Ведь всегда можно завести "глобальную"...

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



а как быть, если две процедуры, одна из которых вызывает вторую - используют переменную i как счетчик цикла?
называть их i_proc1 и i_proc2?
4 фев 09, 17:22    [6779473]     Ответить | Цитировать Сообщить модератору
 Re: тогда вопрос номер два!  [new]
Gluk (Kazan)
Member

Откуда:
Сообщений: 9365
locky
Gluk (Kazan)
Вот и хочется наконец-то услышать такую задачу

Чорт, это будет долго....
Есть некая биллинговая система.
В ней есть начисления, есть документы оплаты, есть информация о судебной работе, о мировых соглашениях.

начисления
create table Debet(
Date datetime, -- месяц, за который проведены начисления
[Sum] money -- начисленная сумма
)

оплаты
create table Credit
(
Doc int, -- id документа
Type int, -- тип документа, 0 - квитанция, 1 - субсидия
[Sum] money, -- сумма оплаты
Df datetime, -- начало периода оплаты, всегда 1-е число месяца
Dt datetime -- конец периода оплаты, всегда последнее число месяца
)

судебные решения
create table Court(
[Sum1] money, --сумма по решению суда
[sum2] money -- уже выплаченная сумма
[sum3] money, -- сумма обязательного платежа
Df datetime, -- начало периода оплаты, всегда 1-е число месяца
Dt datetime -- конец периода оплаты, всегда последнее число месяца
)
-- обязательные платежи по мировому соглашению
create table Pays
(
Date datetime, -- месяц платежа
[Sum] money -- сумма обязательного платежа
)
--уже разнесенные оплаты
create table distr
(
doc int, -- id разнесенного документа
date datetime, -- месяц, на который относится оплата
[sum] money -- отнесенная сумма
)

правила разнесения:
1. Оплата разносится по месяцам зажолженности от первого неоплаченного периода до последнего в пределах периода оплаты, указанного в документе оплаты.
2. если после разнесения документа оплаты на документе осталась неразнесённая сумма, то эта сумма разносится начиная с самого первого неоплаченного периода вверх.
3. остаток суммы бросается на последний период.
4. если существует неполностью оплаченное судебное решение, то документ сначала относится на неоплаченные периоды в рамках периода, указанного в судебном решении. на каждый месяц относится не более суммы, указанной в судебном решении в качестве обязательного платежа. Разноска производится в рамках суммы судебного решения. Остаток суммы разносится по п.п. 1-3
5. если есть мировое соглашение, то сначала разносится сумма обязательного платежа по мировому соглашению на указанный период, остаток суммы разносится по п.п. 1-3.
6. если в документах оплаты есть субсидия, то сначала разносится она, пропорционально по месяцам, указанным в периоде документа, независимо от того, оплачены периоды или нет. "Копейки" теряться не должны
7. если в результате разбиения получилось так, что какой-то период "переплачен", сумма переплаты должна быть снята с этого периода и разнесена по вышеуказанным правилам. Действие должно быть произведено до и после разноски (до - для того чтобы учесть результаты перерасчетов, после - для того, чтобы учесть побочные эффекты субсидии).

На выходе должен получится select, который приведёт табличку distr в непротиворечивое состояние.

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


Про один запрос так сходу не скажу (разьве что действительно MODEL задействовать)
Но GTT для этой задачи, насколько я понимаю ВПОЛНЕ ДОСТАТОЧНО
4 фев 09, 17:23    [6779479]     Ответить | Цитировать Сообщить модератору
 Re: тогда вопрос номер два!  [new]
Зайцев Фёдор
Member

Откуда: Лужки
Сообщений: 5308
softwarer
locky
М.б., заодно откажемся и от локальных переменных? Зачем они? Ведь всегда можно завести "глобальную"...

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

IMHO, если требуется 2 локальных переменных, нужно заводить именно 2 локальных переменных )
4 фев 09, 17:23    [6779484]     Ответить | Цитировать Сообщить модератору
 Re: тогда вопрос номер два!  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
Gluk (Kazan)
Про один запрос так сходу не скажу (разьве что действительно MODEL задействовать) Но GTT для этой задачи, насколько я понимаю ВПОЛНЕ ДОСТАТОЧНО

Да. для этой задачи - вполне достаточно GTT.
И для других подобных задач - вполне достаточно GTT.
Одна вот только проблема.
Если систем, чуть более, чем наполовину, состоит из вот таких задач - рано или поздно устаешь придумывать уникальные названия для GTT. А также причины, по которым вместо одного пакета/процедуры ты присылаешь DDL для целого вороха дополнительных объектов.
4 фев 09, 17:25    [6779496]     Ответить | Цитировать Сообщить модератору
 Re: тогда вопрос номер два!  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 67534
Блог
locky
softwarer
locky
М.б., заодно откажемся и от локальных переменных? Зачем они? Ведь всегда можно завести "глобальную"...

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


Вообще забавно. Одновременно оказывается, что вместо LTT вменяемые люди используют аналоги коллекций - но одновременно "священную корову LTT не трожь, нужнейшая вещь".

locky
а как быть, если две процедуры, одна из которых вызывает вторую - используют переменную i как счетчик цикла?
называть их i_proc1 и i_proc2?

Вах, как я ждал этого примера! И как Вы поступаете в этом случае с LTT? В ситуации, например, "Подпрограмма А создает таблицу именем X и вызывает подпрограмму Б, которая с ней работает. Подпрограмма В создает таблицу именем X другой структуры и тоже вызывает Б"?
4 фев 09, 17:27    [6779502]     Ответить | Цитировать Сообщить модератору
 Re: тогда вопрос номер два!  [new]
Gluk (Kazan)
Member

Откуда:
Сообщений: 9365
locky
рано или поздно устаешь придумывать уникальные названия для GTT.


Не повод, для обычных таблиц же ты не устаешь названия придумывать ?

locky

А также причины, по которым вместо одного пакета/процедуры ты присылаешь DDL для целого вороха дополнительных объектов.


Присылается полюбому патч. Какая нафих разница скока там DDL и пакетов ?
4 фев 09, 17:34    [6779562]     Ответить | Цитировать Сообщить модератору
 Re: тогда вопрос номер два!  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
softwarer
Вах, как я ждал этого примера! И как Вы поступаете в этом случае с LTT? В ситуации, например, "Подпрограмма А создает таблицу именем X и вызывает подпрограмму Б, которая с ней работает. Подпрограмма В создает таблицу именем X другой структуры и тоже вызывает Б"?

примерно так же, как если бы там были объявлены локальные переменные с именем i
alter proc A
as 
 create table #temp(proc1 varchar(10))
 insert into #temp values('proca')
 select * from #temp
 exec b
go

alter proc B
as 
 create table #temp(proc2 varchar(10))
 insert into #temp values('procb')
 select * from #temp
go

exec A
go

proc1
----------
proca


proc2
----------
procb


4 фев 09, 17:36    [6779573]     Ответить | Цитировать Сообщить модератору
 Re: Выбор СУБД!  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
Yo.!
ну, какой празник. теперь майкрософтоский дба может отгадать удачно ли встал патч !
что ж может лет через 5 появятся статусы процедур, а через 10 и аналог фичи RAT из 11g ;)


Кратко прочитал:

автор
RAT is like a computerized tape recorder, allowing workload to be captured and replayed for testing and benchmarking purposes.


Простите, профайлер это умеет делать еще с 7ой версии, а анализатор и тюнировщик запросов умеет использовать эти трассы.

Yo.!
в моем
Microsoft SQL Server 2005 - 9.00.1399.06 (Intel X86) Oct 14 2005 00:33:37 Copyright (c) 1988-2005 Microsoft Corporation Standard Edition on Windows NT 5.2 (Build 3790: Service Pack 2)

SELECT count(*) FROM sys.all_objects WHERE name = 'sp_refreshsqlmodule'
возвращает ноль.


2005.90.1399.0 = SQL Server 2005 RTM, а sp2 у Вас на операционке стоит.
4 фев 09, 17:37    [6779579]     Ответить | Цитировать Сообщить модератору
 Re: тогда вопрос номер два!  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
softwarer
Вообще забавно. Одновременно оказывается, что вместо LTT вменяемые люди используют аналоги коллекций - но одновременно "священную корову LTT не трожь, нужнейшая вещь".

Коллекции, говорите....
И что, с ними можно производить все те же действия, что и с таблицами? И с тем же перформансом?
И с тем же удобством?
4 фев 09, 17:37    [6779585]     Ответить | Цитировать Сообщить модератору
 Re: тогда вопрос номер два!  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 67534
Блог
locky
примерно так же, как если бы там были объявлены локальные переменные с именем i

Отметим, однако, что Вы эдак незаметно ответили не на заданный вопрос, а на тот, который можете ответить Заданный остался без ответа, из чего заключаем, что с ответами негусто.

И вот теперь Вы имхо вляпались по полной программе. Потому как давайте чуть усложним Ваш пример.

alter proc A as 
  ..
  create table #temp ..
  ..
  exec B
go

alter proc B as 
  ..
  exec C
  ..
go

alter proc С as 
  ..
  select * from #temp
  ..
go

Задача программисту: модифицировать процедуру B, вставив кусок, создающий и использующий таблицу #temp. Проблему нужно объяснять?
4 фев 09, 17:42    [6779616]     Ответить | Цитировать Сообщить модератору
 Re: тогда вопрос номер два!  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
softwarer
Отметим, однако, что Вы эдак незаметно ответили не на заданный вопрос, а на тот, который можете ответить Заданный остался без ответа, из чего заключаем, что с ответами негусто.

Из этого нужно заключить, что мне нужно внимательнее читать вопросы
Да, будет ж.
4 фев 09, 17:43    [6779628]     Ответить | Цитировать Сообщить модератору
 Re: тогда вопрос номер два!  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
softwarer
Задача программисту: модифицировать процедуру B, вставив кусок, создающий и использующий таблицу #temp. Проблему нужно объяснять?

Кстати, для оракла можно сформулирова подобную же задачу: вставить в B кусок, использующий GTT temp с другой структурой.
Видимо, решается только административно.
4 фев 09, 17:45    [6779647]     Ответить | Цитировать Сообщить модератору
 Re: тогда вопрос номер два!  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
softwarer
Задача программисту: модифицировать процедуру B, вставив кусок, создающий и использующий таблицу #temp. Проблему нужно объяснять?

Хотя, если внимательнее почитать "Не повод, для обычных таблиц же ты не устаешь названия придумывать ?", то я могу ответить, что кому-то будет не в усталость, назвать табличку не #temp а #temp1.
4 фев 09, 17:49    [6779673]     Ответить | Цитировать Сообщить модератору
 Re: тогда вопрос номер два!  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 67534
Блог
locky
Да, будет ж.

OK. Из чего (с моей точки зрения) следует следующая вещь: должна быть политика именования LTT, надёжно предотвращающая такую ж. Что практически означает, что придуманные таким образом имена LTT отлично сойдут за имена GTT - которые "лень придумывать".
4 фев 09, 17:50    [6779679]     Ответить | Цитировать Сообщить модератору
 Re: тогда вопрос номер два!  [new]
SergSuper
Member

Откуда: SPb
Сообщений: 5488
softwarer
Разноска сложнее. И в принципе я верю в существование задач, которых таки не решить одним запросом. Другой вопрос, что их достаточно мало, и аргумент "без LTT просто не выжить из-за таких задач" меня не то чтобы убеждает.

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

Но можно и проще пример привести.
Есть в процедуре некий довольно большой запрос, который группирует различные данные и выдаёт итоги, порядка 30 записей в 4 колонках. Но нужно также иногда смотреть и протокол того что группируется - т.е. данные без группировки, это еще 3 колонки. Если бы были табличные переменные, я бы засунул туда несгруппированные данные, а потом бы в зависимости от того что нужно выдавал бы данные из неё в нужном виде. А так приходится изощряться. Ради такой ерунды объявлять новый объект в базе как-то глупо.
4 фев 09, 17:50    [6779686]     Ответить | Цитировать Сообщить модератору
 Re: тогда вопрос номер два!  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
softwarer
locky
Да, будет ж.

OK. Из чего (с моей точки зрения) следует следующая вещь: должна быть политика именования LTT, надёжно предотвращающая такую ж. Что практически означает, что придуманные таким образом имена LTT отлично сойдут за имена GTT - которые "лень придумывать".

Угу. в том случае, если LTT используется для передачи данных между процедурами.
Однако, в том случае если LTT используется таки как LTT (т.е. local) - видимо, не стоит морочить никому голову, заставляя придумывать "глобально уникальные имена).

кстати, а GTT спасает от рекурсивного вызова самой себя? Или её нужно дополнительно делить по уровню вложенности?
4 фев 09, 17:52    [6779705]     Ответить | Цитировать Сообщить модератору
 Re: тогда вопрос номер два!  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 67534
Блог
locky
Кстати, для оракла можно сформулирова подобную же задачу: вставить в B кусок, использующий GTT temp с другой структурой.

Такая задача сразу наткнётся на существование таблицы temp. Скорее всего, ещё на этапе постановки. Но в тестирование код с багой уже точно не дойдёт. В описанном же случае с LTT можно набросать сценарий, когда бага попадёт в production.

locky
то я могу ответить, что кому-то будет не в усталость, назвать табличку не #temp а #temp1.

Это если он внимательно обшарит все процедуры, найдёт незадействованное имя и каким-то образом гарантирует, что при последующих изменениях других процедур его не использует никто другой. Вопрос в том, что LTT (точнее, не сами LTT, а их неявная передача между ХП) закладывает заведомую бомбу. Это попытка локально описать нелокальный объект.
4 фев 09, 17:53    [6779717]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 47 48 49 50 51 [52] 53 54 55 56 .. 75   вперед  Ctrl
Все форумы / Сравнение СУБД Ответить