Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Первичнй ключ по двум столбцам? [D7]


Страницы:   1 2

tytus ©   (2006-08-21 14:17:00) 

Доброго дня ВСЕМ! В таблице есть столбец MID (number) и MSoftName(varchar2(10)). Нужно, чтобы записи в таб. имели вид:
MID    MSoftName
1       V-10
2       V-10
3       V-10
1       V-15
2       V-15
4       V-10
3       V-15

Подскажите как такое можно осуществить.


evvcom   (2006-08-28 08:54:00) [1]

> [37] atruhin ©   (22.08.06 14:05)
> Это ты о чем?

Что именно непонятно? Ладно, забудь. Вариант
> [36] ANB ©   (22.08.06 12:56)
мне больше нравится. Это и удовлетворяет твоим требованиям, и очень оптимально.


atruhin   (2006-08-22 14:05:00) [2]

> [30] evvcom ©   (22.08.06 08:32)
>Или думать? Если не сказано, что вот это именно тот случай, значит это не >он? См. [22]. Только такое в триггере не пойдет, а для хранимки в самый
>раз.

Это ты о чем? Можно пожалуйста поподробнее?


ANB   (2006-08-22 12:56:00) [3]


> tytus   (22.08.06 12:48) [35]

1. Ты тормоз. Одак не требует БДЕ, ксати, он умеет работать и без клиента оракла
2. в таблице отставляешь 2 поля :
MID, MSoftName. Кстати, MSoftName неплохо было бы заменить ссылкой на справочник.

запрос :

select MT.MID, MT.MSoftName,
  ROW_NUMBER()
  OVER (PARTITION BY MT.MSoftName ORDER BY MT.MID) AS MNN
from MainTable MT

вернет тебе нужный набор данных. Первичный ключ сделай по MID, и создай индекс (по барабану какой - уникальный или нет) по MSoftName, MID.

И не надо никаких хранимок.

ЗЫ. Оракл рулит !


tytus   (2006-08-22 12:48:00) [4]

>[33]
У меня DOA 4.0.7.1 а там нету такого.
СТавил триал ODAC 5.7.. там есть, но не устраивает по двум причинам - там нужен модуль DB, что подразумевает установку на клиента BDE - а сие непозволимо. Вторая - все время вылетает сообщение, что версия компонентов триальная (60 дней), что напрягает... Может есть другие компоненты БЕЗ BDE?


ANB   (2006-08-22 12:44:00) [5]

Кстати, выброси на фиг поле MNN. Это значение при желании можно получить прямо в запросе.


ANB   (2006-08-22 12:42:00) [6]


> Использую TOracleQuery с параметрами

Используй TOracleStoredProc и не мучайся.


tytus   (2006-08-22 12:29:00) [7]

Доброго дня всем!
решил делать проще. MID оставил в покое - через t_Seq.NextVal и все.
Добавил новый столбец - MNN, в котором как раз и будет счетчик типов софта:
MID    MNN    MSoftName
1       1        V-10
2       2        V-10
3       3        V-10
4       1        V-15
5       2        V-15
6       4        V-10
7       3        V-15

Вот написал процедуру.
create or replace procedure GetNewMNNValue(AName in varchar2, NewVal out number) is
begin
  select Max(MNN) into NewVal from MainTable where MainTable.MSoftname=AName;
end GetNewMNNValue;

Теперь другая проблема. Использую TOracleQuery с параметрами
:MNAME string, NEWMNNV: number. Как мне вызвать эту процедуру, чтобы получить новое значение для софта?
//Funct - TOracleQuery
Funct.SetVariable('MNAME','V-10');
Funct.Execute;
MNNVal:=Funct.GetVariable(0);
Как мне написать параметр SQL для сего компонента???
пишу так - Execute GetNewMNNValue(:MNAME, :NEWMNNV); - ошибка...


Anatoly Podgoretsky   (2006-08-22 09:06:00) [8]

atruhin ©   (22.08.06 05:17) [29]
Ни о каком ручном вводе в вопросе нет слов, сказано только что результат должен быть таким, а такое не возможно в принципе, нет закона упорядочивания, нет ни каких дополнительных полей для проведения упорядочивания. Ничего нет.


evvcom   (2006-08-22 08:32:00) [9]

> [29]
> как такое можно организовать?

Читать не умеем? Или думать? Если не сказано, что вот это именно тот случай, значит это не он? См. [22]. Только такое в триггере не пойдет, а для хранимки в самый раз.


atruhin   (2006-08-22 05:17:00) [10]

Ну хорошо. Но речь не об упорядоченности, насколько я понял автора он привел данные, скажем в порядке ввода. Причем из заголовка темы следует, что первичный ключ у него по первым 2 столбцам. Все нормально, в чем проблемма? По крайней мере с точки зрения БД.
Второй столбец вводится вручную, первый автогенерация, но счетчик свой для каждого значения второго столбца.
Это насколько мой телепатор сработал.
Кстати чисто теоретически, как такое можно организовать?


Anatoly Podgoretsky   (2006-08-21 21:31:00) [11]

atruhin ©   (21.08.06 19:57) [26]
Не наблюдается, это просто случайная последовательность, закона нет


sniknik   (2006-08-21 21:08:00) [12]

> Ну почему же нет? Для каждого значения MSoftName свой порядковый счетчик.
это логика задания зничения MID, но где упорядоченность? упорядоченно должно бы было так
1       V-10
2       V-10
3       V-10
4       V-10
1       V-15
2       V-15
3       V-15


atruhin   (2006-08-21 19:57:00) [13]

> [24] Anatoly Podgoretsky ©   (21.08.06 19:09)
> Нет ни какой упорядоченности

Ну почему же нет? Для каждого значения MSoftName свой порядковый счетчик.


Fay   (2006-08-21 19:21:00) [14]

> ЭТО не выборка, а так должны располагаться данные в таблице...
Бред


Anatoly Podgoretsky   (2006-08-21 19:09:00) [15]

В этой последовательности
1       V-10
2       V-10
3       V-10
1       V-15
2       V-15
4       V-10
3       V-15

Нет ни какой упорядоченности


atruhin   (2006-08-21 16:49:00) [16]

Насколько я понял.
Ему нужно создавать порядковый номер свой для каждого типа товара, автоматически при вводе наименования товара. Т.е. Аналог журналов учета где для каждого товара свой журнал.
Кстати как это сделать не создавая для каждой позиции генератор не представляю. Единственное что приходит в голову уникальный индекс на 2 поля, вставка через хранимку, при соответствующем исключении увеличивать номер.
PS С ораклом не работал, размышляю на уроне IB


evvcom   (2006-08-21 16:39:00) [17]

> [16]
Дык, у тебя ошибка синтаксиса.
> Result=Max(select MNN from MainTable where MainName=MMODNAME order by MNN);

select max(MNN) into Result from MainTable where MainName=MMODNAME
А нафига тебе там order by?


Sergey13   (2006-08-21 15:55:00) [18]

> [19] tytus   (21.08.06 15:45)
> ЭТО не выборка, а так должны располагаться данные в таблице

На это ты не в силах повлиять, поверь.

> [20] tytus   (21.08.06 15:48)
Можно по всякому, главное понять ЧТО делать, КОГДА и ЗАЧЕМ.


tytus   (2006-08-21 15:48:00) [19]

>ALL
а вообще-то (см. вопрос) командиру кто-то сказал (продвинутые юзеры оракла, наверное), что ТАК МОЖНО делать...


tytus   (2006-08-21 15:45:00) [20]

>[18]
Чуйствую - пошлете меня скоро. ЭТО не выборка, а так должны располагаться данные в таблице...
Наверное нужно в начале получить новое MID, затем выбрать все значения MNN, с именем софта, введенного пользователем, отсортировать по возрастанию MNN, и сей максимальный MNN уже использовать для вставки записи.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо