powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Перечислители (SEQUENCE) в Oracle 8i...
25 сообщений из 44, страница 1 из 2
Перечислители (SEQUENCE) в Oracle 8i...
    #32047692
Alex Zemlyansky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ребят, помощи прошу, подскажите правильный ли у меня ход мысли?! Я создаю таблицу в Oracle, обозначаю первичный ключ, создаю перечислитель (SEQUENCE) и... дальше непонятки как работает этот перечислитель??? Я думаю, что его надо создавать один для всех первичных ключей? Или для каждой таблицы и каждого уникального ключа свой?

-- Последовательность для генерации первичных ключей
CREATE SEQUENCE s_clients
START WITH 1
INCREMENT BY 1;
-- Клиенты
CREATE TABLE t_clients
(
id NUMBER(20) NOT NULL,
olf NVARCHAR2(7) NULL, -- Орг.-пр.форма
long_title NVARCHAR2(200) NULL, -- Полное имя
short_title NVARCHAR2(70) NULL, -- Краткое имя
inn NVARCHAR2(12) NULL, -- ИНН
okpo NVARCHAR2(20) NULL, -- ОКПО
kpp NVARCHAR2(9) NULL, -- КПП
CONSTRAINT pk_clients PRIMARY KEY (id)
);

Неудобно как-то получается... а если я в Делфи захочу сделать вставку полей в dbGrid-е? Откуда "Оракул" возьмёт значение первичного ключа?! Тригер на вставку писать?Вопрос: как организовать ключи (включая и foreign key), чтоб сохранилась целостность данных? Может есть какая нибудь хитрость? Поделитесь опытом, плиз!Вообще я на Оракула с MS SQL Server пересел... может есть какой нибудь AUTOINCREMENT?! Сбросте, кому не жалко, на мыло сценарии на PL/SQL, буду очень признателен.
...
Рейтинг: 0 / 0
Перечислители (SEQUENCE) в Oracle 8i...
    #32047695
Alex Zemlyansky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Упс! А ящик-то я свой и не указал :). Неправильно как-то :).
Ящик мой: zemal@fronda.ru или AZemlyansky@fronda.ru
...
Рейтинг: 0 / 0
Перечислители (SEQUENCE) в Oracle 8i...
    #32047705
nick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> Я думаю, что его надо создавать один для всех первичных ключей? Или для каждой таблицы и каждого уникального ключа свой?
Как хочешь. Оба варианта имеют право на жизнь.

>Откуда "Оракул" возьмёт значение первичного ключа?! Тригер на вставку писать?
Да или обязать это делать клиента.

>Вопрос: как организовать ключи (включая и foreign key), чтоб сохранилась целостность данных?
А в чем проблема?

>может есть какой нибудь AUTOINCREMENT?!
Нет.
...
Рейтинг: 0 / 0
Перечислители (SEQUENCE) в Oracle 8i...
    #32047714
Alex Zemlyansky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Значит без тригера не обойтись... :( жаль, что такая морока... как-то неудобно и непривычно с "мелкософта" на серьёзные вещи переходить :). Значит будет всё писать с нуля и ручками... не хочу я с "ервин"-ом мучатся :).
...
Рейтинг: 0 / 0
Перечислители (SEQUENCE) в Oracle 8i...
    #32047733
lvv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lvv
Гость
Триггер писать прийдется, или insert ручками писать
А лучше всего найти такой компанент для Delphi DOA(Direct Oracle Access) и все твои проблемы пропадут
...
Рейтинг: 0 / 0
Перечислители (SEQUENCE) в Oracle 8i...
    #32047753
Alex Zemlyansky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Знаю такое дело... вот только мне посоветовали пользоваться ODAC, а совсем не DOA :)... говорят, что ODAC круче и удобнее :). Кстати, я не понял... получается, что компонент будет сам ворочить ключами?! Это не есть хорошо!!! Я не люблю, когда клиенту так открыта БД!!! Так не должно быть!!! Это уже называется распределённая логика! Всё должно выполняться и формироваться на сервере, а не на клиенте!!! Вот от этого БД и падают, потому что клиенты пытаются одновременно одинаковые клюси в уникальное поле запихать!!! Я прихожу к мнению, что DOA мне неподходит :).
...
Рейтинг: 0 / 0
Перечислители (SEQUENCE) в Oracle 8i...
    #32047765
nick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
>вот только мне посоветовали пользоваться ODAC, а совсем не DOA :)... говорят, что ODAC круче и удобнее :).
Это вопрос религии. Я использую и то и другое, в зависимости от положения звёзд :).

>Кстати, я не понял... получается, что компонент будет сам ворочить ключами?!
Нет там такого. Просто многие веши сделаны более прямо чем у ADO, BDE и др.
...
Рейтинг: 0 / 0
Перечислители (SEQUENCE) в Oracle 8i...
    #32047781
lvv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lvv
Гость
ODAC или DOA, вам решать
Просто в DOA есть такое свойство у Query SequenceField в котором можно указать, что для поля ID использовать такой-то sequence. А уж если вы перепутаете sequence, так его можно и в триггере запросто перепутать. Тогда и редактировать таблицы на клиенте не хорошо, пускай этим процедуры на сервере занимаются. Все это довольно спрорные вопросы, я считаю что sequence Oracle значительно удобнее identity MS SQL, другие может быть со мной будут не согласны
...
Рейтинг: 0 / 0
Перечислители (SEQUENCE) в Oracle 8i...
    #32047783
lvv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lvv
Гость
Вернее не у Query а у TOracleDataSet
...
Рейтинг: 0 / 0
Перечислители (SEQUENCE) в Oracle 8i...
    #32047811
Alex Zemlyansky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так! Теперь понял! А что, у ODAC нет перечислений :). Я всё равно уже тригером реализовал генерацию уникального значения первичного ключа. Я думаю так будет лучше :). Вот такой получился тригер:

CREATE OR REPLACE TRIGGER c_tr_bi_clients
BEFORE INSERT ON c_t_clients
FOR EACH ROW
BEGIN
SELECT MAX(id)+1
INTO :new.id
FROM c_t_clients;
END c_tr_bi_clients;
...
Рейтинг: 0 / 0
Перечислители (SEQUENCE) в Oracle 8i...
    #32047815
MW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть у ODAC поддержка перечислений.
в свойстве KeySequence для TOraQuery надо указать имя
перечисления для ключевого поля.
...
Рейтинг: 0 / 0
Перечислители (SEQUENCE) в Oracle 8i...
    #32047819
.dba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>CREATE OR REPLACE TRIGGER c_tr_bi_clients
>BEFORE INSERT ON c_t_clients
>FOR EACH ROW
>BEGIN
>SELECT MAX(id)+1
>INTO :new.id
>FROM c_t_clients;
>END c_tr_bi_clients;

А где тут гарантия уникальности? Только в возвращении опоздавшему с коммитом сообщения об ошибке про дупликацию первичного ключа?
...
Рейтинг: 0 / 0
Перечислители (SEQUENCE) в Oracle 8i...
    #32047837
Alex Zemlyansky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да ладно уж... ну извратился я :)... уже исправился :). Воспользовался функцией NEXTVAL в тригере на генерацию ключа :). Спасибо всем за просвещение :). Большое спасибо!
...
Рейтинг: 0 / 0
Перечислители (SEQUENCE) в Oracle 8i...
    #32048023
alvako
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Alex Zemlyansky
и что триггер с SELECT MAX(id)+1 у тебя работал??? Вроде как должно было ORA-04091 вылезти...
...
Рейтинг: 0 / 0
Перечислители (SEQUENCE) в Oracle 8i...
    #32048030
Black Cat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> alvako
С точки зрения 8 Оракула все нормально и все работает. Другой вопрос об эффективности...
...
Рейтинг: 0 / 0
Перечислители (SEQUENCE) в Oracle 8i...
    #32048259
SAA_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Alvako

У меня вариации с MAX работали. Ошибок TABLE IS MUTATING не было.
Я предпочитаю чуть-чуть другую конструкцию триггера на автоинкремент:

create or replace trigger my_trigger before insert on my_table for each row
begin
if :new.my_autoencriment is null then
select my_sequence.NEXTVAL from dual;
end if;
end;

Проверка на пустое значение автоинкрементального поля расширяет мои возможности. Хочу значение подставляю сам, а не хочу, пусть об этом Oracle заботится :)
...
Рейтинг: 0 / 0
Перечислители (SEQUENCE) в Oracle 8i...
    #32048341
Andrey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to SAA_
вот тогда ты точно на проблемы с уникальностью значения в поле нарвешься :)
...
Рейтинг: 0 / 0
Перечислители (SEQUENCE) в Oracle 8i...
    #32048390
SAA_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Неа... скорее я просто защищаюсь от собственной забывчивости. В своих программах я предпочитаю использовать ту же последовательность, ну а если забыл, то в этом мне поможет триггер.
...
Рейтинг: 0 / 0
Перечислители (SEQUENCE) в Oracle 8i...
    #32048471
shurikt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Из-за аналогичной идеи "защищаться от собственной забывчивости" (использовали аналогичный подход на триггере) мы недавно поплатились данными. Дело в том, что продвинутые и ленивые пользователи нашли в Forms (6i) такую дивную функцию - Дублировать запись. А прикол в том, что эта функция дублирует данный блок полностью в том числе и поля с ключами. В итоге получились записи с дублирующимися ключами. Так что если вы имеете дело с формс и поле у Вас не primary key, лучше убрать проверку на null.
...
Рейтинг: 0 / 0
Перечислители (SEQUENCE) в Oracle 8i...
    #32048600
vskv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поясню немного за месье SAA_, так как знаю специфику его приложений :)

Так вот, в этих приложениях последовательности используются только на полях, которые являются primary key. А пользователь в формах этот ID даже не видит.

Плюс триггеры получаются универсальные на before insert on update:
Код: plaintext
1.
2.
3.
4.
5.
...
if :new.pk_row is null then 
:pk_row:= tabX_pk_seq.NEXTVAL; 
end if; 
:new.change_time:=sysdate;
:new.user_id:=...


2SAA_
А почему при аналогичном триггере, но вместо MAX(amt) стояло SUM(amt) вылезал TABLE IS MUTATING TABLE ???
Или я чего-то про то, как работает MAX не понимаю?
...
Рейтинг: 0 / 0
Перечислители (SEQUENCE) в Oracle 8i...
    #32048632
shurikt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я упомянул, что этот косячек вылезет если это поле не primary key. А насчет того, что "это поле пользователи даже не видят" так в этом как раз таки и загвоздка, что пользователи этого поля не видят, но оно все равно дублируется (т.к. оно есть в блоке данных). А в блоке данных оно должно быть, чтобы Вы могли ему присвоить вручную ключ.

А насчет универсальности триггера - в данном случае он также универсален:
Код: plaintext
1.
2.
3.
4.
5.
6.
...
if inserting then 
:pk_row:= tabX_pk_seq.NEXTVAL; 
end if; 
:new.change_time:=sysdate;
:new.user_id:=...
...
Рейтинг: 0 / 0
Перечислители (SEQUENCE) в Oracle 8i...
    #32048633
shurikt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я упомянул, что этот косячек вылезет если это поле не primary key. А насчет того, что "это поле пользователи даже не видят" так в этом как раз таки и загвоздка, что пользователи этого поля не видят, но оно все равно дублируется (т.к. оно есть в блоке данных). А в блоке данных оно должно быть, чтобы Вы могли ему присвоить вручную ключ.

А насчет универсальности триггера - в данном случае он также универсален:
Код: plaintext
1.
2.
3.
4.
5.
6.
...
if inserting then 
:pk_row:= tabX_pk_seq.NEXTVAL; 
end if; 
:new.change_time:=sysdate;
:new.user_id:=...
...
Рейтинг: 0 / 0
Перечислители (SEQUENCE) в Oracle 8i...
    #32049232
SAA_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ljublju kogda umnie ljudi kritikujut metodi... no esli uchest escho odnu specifiku moih prilozenij na Developer 6i, to ja bi skazal tak: Est u nas odin proizvditel softa blagodarja kotoromu ja nauchilsja delat sledujuschie triggeri na forme s prostenkim tekstom NULL; Narpimer triggeri KEY-CLRBLK, KEY-DELREC, KEY-DUPREC chto privodit k odnoznachnomu ignoru vot etih zabavnih kombinacij Ctrl+F4, Shift-F6 i prochee.

A est escho odin prikol u moego ljubimogo proizvoditelja... nazimaesh elementarnuju F7 (ENTER_QUERY) i gljadish kak s kazdim F7 u tebja SEQUENCE rastet na edenichku. Ili skazem nazimaesh strelku vniz v forme gde principialno na bloke dolzen bit trigger WHEN-NEW-RECORD-INSTANCE s tekstom FIRST_RECORD; i zabavljaeshsja tem, kak medljeno krushitsja idealogija softa (to vSkv call 2 me by phone) o kotoroj mne vtirali polchasa :)
...
Рейтинг: 0 / 0
Перечислители (SEQUENCE) в Oracle 8i...
    #32049428
Noname
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А вот такой триггер без SEQUENCE обеспечит уникальность?:

create or replace trigger proba before insert on proba
for each row
begin
lock table proba in exclusive mode;
select decode(max(n1),null,0,max(n1))+1 into :new.n1 from proba;
end;
...
Рейтинг: 0 / 0
Перечислители (SEQUENCE) в Oracle 8i...
    #32049436
.dba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>А вот такой триггер без SEQUENCE обеспечит
>уникальность?:
>
>create or replace trigger proba before insert on proba
>for each row
>begin
>lock table proba in exclusive mode;
>select decode(max(n1),null,0,max(n1))+1 into :new.n1 from
>proba;
>end;

Вывалится в ошибку ORA-04091 про мутирующую таблицу.
...
Рейтинг: 0 / 0
25 сообщений из 44, страница 1 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Перечислители (SEQUENCE) в Oracle 8i...
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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