powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Перечислители (SEQUENCE) в Oracle 8i...
19 сообщений из 44, страница 2 из 2
Перечислители (SEQUENCE) в Oracle 8i...
    #32049480
Noname
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тогда почему у меня (Oracle9i (9.2) под Win2k) не вываливается? Единственно, нужно после insert ... выдавать commit, иначе другие сессии отдыхают (если из SQL Plus, например).
...
Рейтинг: 0 / 0
Перечислители (SEQUENCE) в Oracle 8i...
    #32049483
.dba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Тогда почему у меня (Oracle9i (9.2) под Win2k) не
>вываливается? Единственно, нужно после insert ...
>выдавать commit, иначе другие сессии отдыхают (если из
>SQL Plus, например).

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
   1   create or replace trigger proba before insert on laud
   2   for each row
   3   begin
   4   lock table laud in exclusive mode;
   5    --select decode(max(n1),null,0,max(n1))+1 into :new.n1 from proba;
 
   6 * end;
SQL> /

Trigger wurde erstellt.

SQL> insert into laud select * from dual;
insert into laud select * from dual
            *
FEHLER in Zeile  1 :
ORA- 04091 : table TEST.LAUD is mutating, trigger/function may not see it
ORA- 06512 : at  "TEST.PROBA" , line  2 
ORA- 04088 : error during execution of trigger 'TEST.PROBA'


Это раз, а во-вторых в теле тригера нельзя делать коммит или роллбек. У меня, конечно, 8.1.7, но не думаю что это все так поменялось в 9-ке.
...
Рейтинг: 0 / 0
Перечислители (SEQUENCE) в Oracle 8i...
    #32049516
Noname
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Никто не говорит, что в теле триггера можно использовать commit или rollback. Но в 9.2 этот триггер работает !!!
...
Рейтинг: 0 / 0
Перечислители (SEQUENCE) в Oracle 8i...
    #32049525
Noname
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кстати, в Oracle8 (8.0.5) тоже работает.
...
Рейтинг: 0 / 0
Перечислители (SEQUENCE) в Oracle 8i...
    #32049538
.dba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Кстати, в Oracle8 (8.0.5) тоже работает.

2Noname
Приведите, пожалуйста, свой листинг. Я проверял на 8.0.5, 8.1.5 и 8.1.7 и везде одинаковый результат.
...
Рейтинг: 0 / 0
Перечислители (SEQUENCE) в Oracle 8i...
    #32049557
Lazy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тоже решил посмотреть :-)
8.0.5 Linux
insert into laud select * from dual
ORA-04091: table LAUD is mutating, trigger/function may not see it
Наверное Noname пошутил.
...
Рейтинг: 0 / 0
Перечислители (SEQUENCE) в Oracle 8i...
    #32049586
Noname
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ей богу не шучу. Oracle 8.0.5 на WinNT 4 sp6. Привожу полный вывод SQL Plus (без всяких монтажей):


SQL*Plus: Release 8.0.5.0.0 - Production on Wed Sep 11 9:6:17 2002

(c) Copyright 1998 Oracle Corporation. All rights reserved.


Connected to:
Oracle8 Release 8.0.5.0.0 - Production
PL/SQL Release 8.0.5.0.0 - Production

SQL> show user
USER is "SCOTT"
SQL> create table proba(
2 n1 number,
3 c1 varchar2(20));

Table created.

SQL> create or replace trigger proba before insert on proba
2 for each row
3 begin
4 lock table proba in exclusive mode;
5 select decode(max(n1),null,0,max(n1))+1 into :new.n1 from proba;
6 end;
7 /

Trigger created.

SQL> insert into proba(c1) values('qqq');

1 row created.

SQL> select * from proba;

N1 C1
--------- --------------------
1 qqq

SQL>
...
Рейтинг: 0 / 0
Перечислители (SEQUENCE) в Oracle 8i...
    #32049627
nick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня тоже работает на 8.1.7 (Linux)
Но это же не универсальный тригер, он не будет работать в запросе
insert into mytable (поля_кроме_ID) (select поля from othertable)
Так что без sequence необойтись
...
Рейтинг: 0 / 0
Перечислители (SEQUENCE) в Oracle 8i...
    #32049644
Noname
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не будет. Но если не использовать вставки типа insert into table_name(...) select ..., то он имеет право на существование.
...
Рейтинг: 0 / 0
Перечислители (SEQUENCE) в Oracle 8i...
    #32049651
nick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в таком случае почти любой тригер имеет право на существование
я, например, использую тригер который ищет дыры в таблице и заполняю их, он тоже обеспечивает уникальность и тоже не работет с insert into ... select ...
все это частные случаи...
...
Рейтинг: 0 / 0
Перечислители (SEQUENCE) в Oracle 8i...
    #32049684
Noname
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А никто на общий случай не претендовал... Это один из способов обеспечения уникальности ключа в многопользовательской среде без использования SEQUENCE с известными ограничениями. Здесь тоже можно сделать поиск пробелов в ключе и прочие навороты.
...
Рейтинг: 0 / 0
Перечислители (SEQUENCE) в Oracle 8i...
    #32049703
nick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
если задаться целью избавиться от sequence, то можно еще проще
create or replace trigger my_trigger before insert on my_table for each row
begin
:new.id:=sys_guid;
end;
этод тригер удовлетворит и insert ... select ...
...
Рейтинг: 0 / 0
Перечислители (SEQUENCE) в Oracle 8i...
    #32049707
nick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
или вообще отказаться от id и от тригеров в пользу использования ROWID, будет всего-то одно ограничение...
...
Рейтинг: 0 / 0
Перечислители (SEQUENCE) в Oracle 8i...
    #32049727
Lazy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2Noname
>Ей богу не шучу.
твой пример и у меня проходит,а ты попробуй
insert into laud select * from dual;
:-)
...
Рейтинг: 0 / 0
Перечислители (SEQUENCE) в Oracle 8i...
    #32049873
SAA_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
select decode(max(n1),null,0,max(n1))+1 into :new.n1 from proba

Takoj sposob ne spravedliv dlja mnogopolzovatelskogo dostupa. Esli v tablicu dobavljajut 2, a to i bolee sessij odnovremenno? To kakov budet rezultat? Pobedit tot kto pervim skazet commit, a svalitsja tot, kto opazdal.
...
Рейтинг: 0 / 0
Перечислители (SEQUENCE) в Oracle 8i...
    #32069912
Denis_M
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Народ, помогите плиз. Есть последовательность sequence, как результат этой последовательности занести в конкретный столбец. Т.к. пока мой триггер не работает:

Create Trigger Dollar
Before Insert On Валюта
For Each Row
Begin
Select posledovat.Nextval INTO :new.ID_валюты
From Валюта;
END Dollar;
/
...
Рейтинг: 0 / 0
Перечислители (SEQUENCE) в Oracle 8i...
    #32070002
none
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Заметил одну тенденцию этого форума: самые простые, пустяковые вопросы собирает больше всего постов. Касается этого треда и например "Работа с файлами..."

Стыдно...
...
Рейтинг: 0 / 0
Перечислители (SEQUENCE) в Oracle 8i...
    #32070964
Trampler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В защиту
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;

Случай для PK
Иногда может возникнуть необходимость заполнения нескольких таблиц, связанных ключами, с помощью 1 скрипта/процедуры PL\SQL. Для того, чтобы связать дочерние и родительские записи, надо знать PK родителя. Если же в этом триггере убрать проверку на IS NULL, поле PK родителя будет изменено при вставке, и ничего не будет работать...
...
Рейтинг: 0 / 0
Перечислители (SEQUENCE) в Oracle 8i...
    #32071828
SAA_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
To: Denis_M
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Народ, помогите плиз. Есть последовательность sequence, как результат этой последовательности занести в конкретный столбец. Т.к. пока мой триггер не работает: 

Create Trigger Dollar 
Before Insert On Валюта 
For Each Row 
Begin 
Select posledovat.Nextval INTO :new.ID_валюты 
From Валюта; 
END Dollar; 
/


Выделена болдом ваша проблема. Используйте следующую конструкцию:
Select posledovat.Nextval INTO :new.ID_валюты
From Dual ;
...
Рейтинг: 0 / 0
19 сообщений из 44, страница 2 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Перечислители (SEQUENCE) в Oracle 8i...
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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