Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Хранимая процедура на категоризацию / 12 сообщений из 12, страница 1 из 1
22.05.2006, 08:41
    #33741574
Katt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранимая процедура на категоризацию
Здраствуйте. Правильные проектировщики сказали - категоризацию двух таблиц (типа: т.е. в третью таблицу подставляется id из первой таблицы, либо из второй) разруливать хранимой процедурой.
А опыта в их написании - нема.
Подскажите пожалуйста, как так однозначно сделать insert, чтобы точно было известно откуда (из 1ой или 2ой таблицы) id?
...
Рейтинг: 0 / 0
22.05.2006, 19:50
    #33743712
ZemA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранимая процедура на категоризацию
KattЗдраствуйте. Правильные проектировщики сказали - категоризацию двух таблиц (типа: т.е. в третью таблицу подставляется id из первой таблицы, либо из второй) разруливать хранимой процедурой.
А опыта в их написании - нема.
Подскажите пожалуйста, как так однозначно сделать insert, чтобы точно было известно откуда (из 1ой или 2ой таблицы) id?
Либо ты неправильно понял, либо проектировщики неправильные.
должно быть так: 1-я (основная), 2-я и 3-я (категории).
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
например:
сотрудники (основная)
---
код
фамилия
имя
отчество

торговые_агенты (1-я категория)
---
код_сотрудника (внешний ключ на таблицу "сотрудники")
дата_приема_на_работу
оклад

механики (2-я категория)
---
код_сотрудника (внешний ключ на таблицу "сотрудники")
тариф_за_час

хранимая процедура типа:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
create function добавить_механика(varchar, varchar, varchar, numeric)
returns int4 as '
declare
  _фамилия alias for $1;
  _имя alias for $2;
  _отчество alias for $3;
  _тариф_за_час alias for $4;
  _код int4;
begin
  insert into сотрудники (фамилия, имя, отчество) values (_фамилия, _имя, _отчество);
  
  _код := select currval(''сотрудники_код_seq'');

  insert into механики (код_сотрудника, тариф_за_час) values (_код, _тариф_за_час);

  return _код;
end;
' language plpgsql;
...
Рейтинг: 0 / 0
23.05.2006, 07:25
    #33744055
Katt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранимая процедура на категоризацию
Описываю подробно ситуацию...
Есть T_Студенты и T_Сотрудники. Есть T_ВыдачаСправок. Дак вот справки могут выдаваться либо студенту, либо сотруднику, т.е. в T_ВыдачаСправок должна храниться id_студента или id_сотрудника.
...
Рейтинг: 0 / 0
23.05.2006, 15:16
    #33745836
ZemA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранимая процедура на категоризацию
KattОписываю подробно ситуацию...
Есть T_Студенты и T_Сотрудники. Есть T_ВыдачаСправок. Дак вот справки могут выдаваться либо студенту, либо сотруднику, т.е. в T_ВыдачаСправок должна храниться id_студента или id_сотрудника.
по моему так:

справки
---
код
...
еще что-то

справки_для_студентов
---
код_справки (вк на справки)
код_студента (вк на студентов)

справки_для_сотрудников
---
код_справки (вк на справки)
код_сотрудника (вк на сотрудников)
...
Рейтинг: 0 / 0
23.05.2006, 15:44
    #33745971
Katt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранимая процедура на категоризацию
Не нужно T_СправкиДля, т.к. справки выдаются только студентам, а вот забрать и расписаться за справку (электронная подпись) могут студенты или сотрудник... :(
...
Рейтинг: 0 / 0
14.06.2006, 14:29
    #33790289
Misha Tyurin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранимая процедура на категоризацию
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
хранимая процедура типа:

create function добавить_механика(varchar, varchar, varchar, numeric)
returns int4 as '
declare
  _фамилия alias for $1;
  _имя alias for $2;
  _отчество alias for $3;
  _тариф_за_час alias for $4;
  _код int4;
begin
  insert into сотрудники (фамилия, имя, отчество) values (_фамилия, _имя, _отчество);
  
  _код := select currval(''сотрудники_код_seq'');

  insert into механики (код_сотрудника, тариф_за_час) values (_код, _тариф_за_час);

  return _код;
end;
' language plpgsql;
...
Рейтинг: 0 / 0
14.06.2006, 14:32
    #33790304
Misha Tyurin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранимая процедура на категоризацию
Так можно наткнуться на конкретные косяки когда cuvral после inserta. Надо сначал получить код через nextval а потом его юзать в последующтих инсертах.
...
Рейтинг: 0 / 0
14.06.2006, 15:25
    #33790528
wbear
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранимая процедура на категоризацию
Misha Tyurin Так можно наткнуться на конкретные косяки когда cuvral после inserta. Надо сначал получить код через nextval а потом его юзать в последующтих инсертах.


не путай человека.. не наткнется...

оба(и как ты сказал и как человек написал) способа одинаково безопасные.
...
Рейтинг: 0 / 0
14.06.2006, 15:39
    #33790579
Misha Tyurin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранимая процедура на категоризацию
А вдруг после инсерта залезет набор команд, там про какую-нибудь обработку дополнительную вставки (длительная обработка), а потом перед вставкой записи в ссылающуюся таблицу вызовется этот currval..., надо сразу эти дела учистывать, мне кажется, чтобы потом ничего не пошло криво. Хотя согласен что всё это мимо основной темы.
...
Рейтинг: 0 / 0
15.06.2006, 17:27
    #33793787
resu
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранимая процедура на категоризацию
KattОписываю подробно ситуацию...
Есть T_Студенты и T_Сотрудники. Есть T_ВыдачаСправок. Дак вот справки могут выдаваться либо студенту, либо сотруднику, т.е. в T_ВыдачаСправок должна храниться id_студента или id_сотрудника.

по моему надо сделать след. структуру для "T_ВыдачаСправок"
Код: plaintext
1.
2.
3.
4.
5.
create table "T_ВыдачаСправок" (
 id serial NOT NULL,
 id_студента int4,
 id_сотрудника int4,
 ... 
)

+ либо создать trigger либо 2 checkconstraint либо проверять в коде на недопустимоть присутствия одновременно в одной записи обоих полей:
"id_студента" и "id_сотрудника"
т.е. одно всегда должно быть NULL!!

потом запрос:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
select *,
  case
    when id_сотрудника is not null then "забрал сотрудник: "  || name_сотрудника
    when id_студента is not null then "забрал студент: "  || name_студента 
    when id_сотрудника is null AND id_студента is null  then "не забрана" 
     else "not defined"
   end as "KTO_ZABRAL"
from "T_ВыдачаСправок" vs LEFT JOIN "T_Студенты" st ON vs.id_студента = st.id_студента 
   LEFT JOIN "T_Сотрудники" so ON vs.id_сотрудника = so.id_сотрудника
...
Рейтинг: 0 / 0
16.06.2006, 08:56
    #33794501
Katt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранимая процедура на категоризацию
Спасибо, resu!
Ну и всем остальным за отклик.
...
Рейтинг: 0 / 0
16.06.2006, 13:11
    #33795438
wbear
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранимая процедура на категоризацию
Misha TyurinА вдруг после инсерта залезет набор команд, там про какую-нибудь обработку дополнительную вставки (длительная обработка), а потом перед вставкой записи в ссылающуюся таблицу вызовется этот currval..., надо сразу эти дела учистывать, мне кажется, чтобы потом ничего не пошло криво. Хотя согласен что всё это мимо основной темы.

да и пусть залезет... curval ВОЗВРАЩАЕТ ЗНАЧЕНИЕ ПОСЛЕ НЕКСТВАЛА В ТЕКУЩЕЙ СЕСИИ..
внимательнее доки читать надо.

да чего чего, а этот вопрос надо поставить первым в FAQ если он будет.
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Хранимая процедура на категоризацию / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]