|
генерация id посредством триггера
|
|||
---|---|---|---|
#18+
Доброго дня. я человек новый в Оракле) мне 3 дня. есть такой вопрос. есть табличка с ключевым полем: CREATE TABLE abs ( num_ID NUMBER, OWNER VARCHAR2(30), NAME VARCHAR2(30), TYPE VARCHAR2(19), ); ALTER TABLE abs ADD ( CONSTRAINT PK_num_id PRIMARY KEY (num_id)); в эту таблицу вставили данные. после необходимо добавить триггер, который будет генерировать num_id при вставки новой записи, если только num_id не указан явно. Данный триггер откомпилировался без ошибок create or replace TRIGGER auto_id BEFORE INSERT ON abs FOR EACH ROW DECLARE BEGIN if :new.num_id is null then insert into abs (num_id, owner, name, type) values ((select max(num_id)from abs)+1, :new.owner, :new.name, :new.type); end if; END auto_id; insert into abs (owner, name, type) values (100, 100, 100); - в инсерте явно не указан num_id, при попытке добавить запись ругается на то что ноль нельзя записать в ключевое поле, ругается правильно... как раз задача тригера исправить это, но увы не получается. подскажите пожалуйста, где ошибаюсь? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2019, 10:15 |
|
генерация id посредством триггера
|
|||
---|---|---|---|
#18+
Nathgul Код: plsql 1. 2. 3.
Перевожу: перед вставкой вставить ещё одну другую хрень. RTFM Correlation Names and Pseudorecords (FAQ) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2019, 10:35 |
|
генерация id посредством триггера
|
|||
---|---|---|---|
#18+
ну я примерно так и думал) как правильно сделать? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2019, 10:42 |
|
генерация id посредством триггера
|
|||
---|---|---|---|
#18+
тригер after тоже использовать не могу, потому что запись не создается если поле с PK не может быть нулевым. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2019, 10:47 |
|
генерация id посредством триггера
|
|||
---|---|---|---|
#18+
Nathgul, :new.num_id:= ... насчет select max(num_id)from abs 1) если вставлять за раз несколько строк будет мутация (ошибка выполнения) ORA-04091: table ABS is mutating, trigger/function may not see it 2) при паралельной вставке возможен ORA-00001: unique constraint (PK_NUM_ID) violated обычно используют последовательность (в не древних версиях автономерацию); для лабы может и прокатит ТАК ДЕЛАТЬ НЕЛЬЗЯ!!! Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2019, 10:57 |
|
генерация id посредством триггера
|
|||
---|---|---|---|
#18+
Nathgulкак правильно сделать?Вдумчиво прочитать в приведённой документации: "A BEFORE trigger can change …" ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2019, 10:57 |
|
генерация id посредством триггера
|
|||
---|---|---|---|
#18+
Nathgulкак правильно сделать? использовать последовательность .... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2019, 10:58 |
|
генерация id посредством триггера
|
|||
---|---|---|---|
#18+
Stax ТАК ДЕЛАТЬ НЕЛЬЗЯ!!! Ты непоследователен. С одной стороны пережёвываешь, а с другой стороны так переживаешь. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2019, 10:59 |
|
генерация id посредством триггера
|
|||
---|---|---|---|
#18+
Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Итог: Table MYACCESS created. Table MYACCESS altered. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2019, 11:37 |
|
генерация id посредством триггера
|
|||
---|---|---|---|
#18+
Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
59 973 rows inserted. Trigger AUTO_ID compiled ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2019, 11:41 |
|
генерация id посредством триггера
|
|||
---|---|---|---|
#18+
Код: plsql 1. 2. 3.
MAX(OBJECT_ID) -------------- 73993 1 row inserted. OBJECT_ID OWNER OBJECT_NAME OBJECT_TYPE CREATED -------------- ------------------------------ --------------------------- 73994 200 200 Вроде работает, всем спс. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2019, 11:47 |
|
генерация id посредством триггера
|
|||
---|---|---|---|
#18+
Staxдля лабы может и прокатит нормальному преподу так не прокатит. это иногда прокатит в однопользовательской среде :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2019, 11:51 |
|
генерация id посредством триггера
|
|||
---|---|---|---|
#18+
StaxNathgulкак правильно сделать? использовать последовательность .... stax ... WHEN (new.OBJECT_id is null) DECLARE BEGIN select nvl(max(OBJECT_id),0)+1 into :new.OBJECT_id from MYACCESS; ... странно почему работает так как надо, синтаксис говорит вроде как иначе nvl пашет. Синтаксис Oracle/PLSQL функции NVL: NVL( string1, replace_with ) string1 - строка, которая проверяется на Null значение. replace_with - возвращаемое значение, если string1 является Null. можешь подсказать как правильно читать select nvl(max(OBJECT_id),0)+1 into :new.OBJECT_id from MYACCESS;??? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2019, 12:06 |
|
генерация id посредством триггера
|
|||
---|---|---|---|
#18+
NathgulВроде работает, всем спс. ВРОДЕ 1) добавте за раз несколько строк (insert from select) 2) добавте в двух сесcіях (паралельно/без commit) ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2019, 12:11 |
|
генерация id посредством триггера
|
|||
---|---|---|---|
#18+
StaxNathgulВроде работает, всем спс. ВРОДЕ 1) добавте за раз несколько строк (insert from select) 2) добавте в двух сесcіях (паралельно/без commit) ..... stax Код: plsql 1. 2. 3. 4. 5. 6. 7. 8.
Код: plsql 1. 2. 3. 4. 5. 6.
убрал nvl из тригера, отчистил таблицу, внес новые записи... не срабатывало пока не внес первую строку с указанием OBJECT_ID вручную. OBJECT_ID OWNER OBJECT_NAME ----------------------------------------------------- 1 200 200 200 2 200 200 200 3 200 200 200 4 200 200 200 5 200 200 200 6 200 200 200 6 rows selected. я так понимаю ключевым было FOR EACH ROW WHEN (new.OBJECT_id is null) DECLARE ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2019, 12:25 |
|
генерация id посредством триггера
|
|||
---|---|---|---|
#18+
NathgulДоброго дня. я человек новый в Оракле) мне 3 дня. Какую версию Oracle Database использует новый человек? Код: plsql 1.
? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2019, 12:47 |
|
генерация id посредством триггера
|
|||
---|---|---|---|
#18+
Nathgul я так понимаю ключевым было FOR EACH ROW WHEN (new.OBJECT_id is null) DECLARE не так WHEN условие срабатывания триггера (срабатываем если не задан id) имхо луче кодировать WHEN чем в теле IF nvl нужен токо для первой строкі (клгда табличка пустая) Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
зы Повторно триггер не годится для практического пользования 1) добавте за раз несколько строк (insert from select) 2) добавте в двух сесcіях (паралельно/без commit) ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2019, 12:54 |
|
генерация id посредством триггера
|
|||
---|---|---|---|
#18+
[quot Stax]Nathgul зы Повторно триггер не годится для практического пользования 1) добавте за раз несколько строк (insert from select) 2) добавте в двух сесcіях (паралельно/без commit) ..... stax Код: plsql 1. 2. 3. 4. 5.
добавлял двумя пакетами без комита. Итог 10 добавленных строк.. в таблице с OBJECT_ID полнейший порядок. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2019, 13:17 |
|
генерация id посредством триггера
|
|||
---|---|---|---|
#18+
Nathgulдобавлял двумя пакетами без комита. insert into MYaccess (owner, object_name, object_type) (select 200, 200, 200 from dual union all select 201, 201, 201 from dual) ps 2) добавте в двух сесcіях/компютерах/окнах (паралельно/одновременно/без commit) ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2019, 13:24 |
|
генерация id посредством триггера
|
|||
---|---|---|---|
#18+
Stax, ТС три дня от роду, он еще головку держать не научился, а ты ему про сессии какие то ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2019, 19:21 |
|
генерация id посредством триггера
|
|||
---|---|---|---|
#18+
Nathgulдобавлял двумя пакетами без комита. Итог 10 добавленных строк.. в таблице с OBJECT_ID полнейший порядок. Твой тригер может рабoтать только при INSERT VALUES и то в однопользовательском варианте. Пример INSERT SELECT: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Пример с 2мя пользователями: Сессия 1 выдает и не коммитит: Код: plsql 1. 2. 3. 4. 5.
Сессия 2 выдает и висит: Код: plsql 1. 2. 3.
Сессия 1 выдает коммит: Код: plsql 1. 2. 3. 4. 5.
Сессия 2 тут-же вылeтает с: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8.
Почему? Сессия не видит незакоммиченные изменения другх сессий. Посему Код: plsql 1.
сессии 2 выберет то-же значение что и сессия 1. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2019, 19:56 |
|
|
start [/forum/topic.php?fid=52&msg=39859765&tid=1882103]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
40ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
62ms |
get tp. blocked users: |
1ms |
others: | 16ms |
total: | 164ms |
0 / 0 |