Опять про Oracle
От: kmorozov  
Дата: 23.10.02 13:24
Оценка:
Здравствуйте, Уважаемые!
Есть Оракл 9и

Есть таблица

CREATE TABLE "MOROZOV"."TAB1" ("IDS" NUMBER(10) NOT NULL, "NUM" 
    NUMBER(10) NOT NULL)  
    TABLESPACE "USERS" PCTFREE 10 PCTUSED 0 INITRANS 1 MAXTRANS 
    255 
    STORAGE ( INITIAL 64K NEXT 0K MINEXTENTS 1 MAXEXTENTS 
    2147483645 PCTINCREASE 0) 
    LOGGING


На ней есть триггер


CREATE OR REPLACE TRIGGER "MOROZOV"."TRIG1" BEFORE
INSERT ON "MOROZOV"."TAB1" FOR EACH ROW BEGIN
 insert into tab1 (ids, num) values (seq_1.nextval, 0);
END;



Сиквенс seq_1 тоже есть

Запрос

insert into Morozov.tab1
(num)
values
(145)


Выдаёт ошибку "Сбой преобразования UTF8 и UCS2: failUTF8Conv".
Если триггер отключить, всё проходит нормально.

Где я ошибся?
Re: Опять про Oracle
От: PPA Россия http://flylinkdc.blogspot.com/
Дата: 23.10.02 13:34
Оценка:
Здравствуйте kmorozov, Вы писали:
K>
K>
K>CREATE OR REPLACE TRIGGER "MOROZOV"."TRIG1" BEFORE
K>INSERT ON "MOROZOV"."TAB1" FOR EACH ROW BEGIN

select seq_1.nextval into :NEW.IDS from dual;
new.num := 0; -- но тут лучше объявить это декларативно при создании таблички. (см код ниже)

K>END;
K>



create table TAB1
(
IDS NUMBER(10) not null,
NUM NUMBER(10) default 0 not null
)

если создашь так, то new.num := 0 в триггере не нужно.

K>
K>insert into Morozov.tab1
K>(num)
K>values
K>(145) 
K>


K>Выдаёт ошибку "Сбой преобразования UTF8 и UCS2: failUTF8Conv".


Такой ошибки не должно быть, у тебя что-то с настрйокой клиента еще не так.
они говорят с таких слов:

ORA-Код траляля.

У тебя в случае с таким триггером должна ругаться на "мутируемость"

K>Если триггер отключить, всё проходит нормально.

K>Где я ошибся?

Триггер у тебя неверный.
Re[2]: Опять про Oracle
От: kmorozov  
Дата: 23.10.02 13:44
Оценка:
Здравствуйте PPA, Вы писали:

PPA>Такой ошибки не должно быть, у тебя что-то с настрйокой клиента еще не так.

PPA>они говорят с таких слов:

PPA>ORA-Код траляля.


Ошибка такая есть — я её сам вижу , хотя в справочнике я её и не нашёл.

PPA>У тебя в случае с таким триггером должна ругаться на "мутируемость"


На мутируемость он ругается при update, а у меня insert

K>>Если триггер отключить, всё проходит нормально.

K>>Где я ошибся?

PPA>Триггер у тебя неверный.


А где именно? Я хотел всего-навсего нумеровать строки
Re[3]: Опять про Oracle
От: PPA Россия http://flylinkdc.blogspot.com/
Дата: 23.10.02 13:50
Оценка:
Здравствуйте kmorozov, Вы писали:

PPA>>ORA-Код траляля.


K>Ошибка такая есть — я её сам вижу , хотя в справочнике я её и не нашёл.


в инете поищи — лучше гуглом. какой код?

PPA>>У тебя в случае с таким триггером должна ругаться на "мутируемость"


K>На мутируемость он ругается при update, а у меня insert


должно и на инсерт.

K>>>Если триггер отключить, всё проходит нормально.

K>>>Где я ошибся?

PPA>>Триггер у тебя неверный.


K>А где именно? Я хотел всего-навсего нумеровать строки


Так я тебе правильный код привел.

CREATE OR REPLACE TRIGGER "MOROZOV"."TRIG1" BEFORE
INSERT ON "MOROZOV"."TAB1" FOR EACH ROW BEGIN

select seq_1.nextval into :NEW.IDS from dual;
new.num := 0; -- но тут лучше объявить это декларативно при создании таблички. (см код ниже)

END;
Re[4]: Опять про Oracle
От: kmorozov  
Дата: 23.10.02 13:56
Оценка:
Здравствуйте PPA, Вы писали:

PPA>Здравствуйте kmorozov, Вы писали:


PPA>>>ORA-Код траляля.


K>>Ошибка такая есть — я её сам вижу , хотя в справочнике я её и не нашёл.


PPA>в инете поищи — лучше гуглом. какой код?



Кода нет, я написал полный текст ошибки

PPA>>>У тебя в случае с таким триггером должна ругаться на "мутируемость"


K>>На мутируемость он ругается при update, а у меня insert


PPA>должно и на инсерт.


K>>>>Если триггер отключить, всё проходит нормально.

K>>>>Где я ошибся?

PPA>>>Триггер у тебя неверный.


K>>А где именно? Я хотел всего-навсего нумеровать строки


PPA>Так я тебе правильный код привел.


PPA>CREATE OR REPLACE TRIGGER "MOROZOV"."TRIG1" BEFORE

PPA>INSERT ON "MOROZOV"."TAB1" FOR EACH ROW BEGIN

PPA> select seq_1.nextval into :NEW.IDS from dual;

PPA> new.num := 0; -- но тут лучше объявить это декларативно при создании таблички. (см код ниже)

PPA>END;


Так-то она работает, но почему мой вариант не сработал? Что там не так? Меня это тревожит
Re[5]: Опять про Oracle
От: Andrey_N  
Дата: 23.10.02 17:10
Оценка:
Здравствуйте kmorozov, Вы писали:

[skip]

K>Так-то она работает, но почему мой вариант не сработал? Что там не так? Меня это тревожит


В триггере (EACH ROW) на таблицу нельзя делать запросы к той же таблице на которую запущен триггер. Другими словани EACH ROW триггер работает только с одной записью из таблицы.

Это выражение не противаречит данному условию:
select seq_1.nextval into :NEW.IDS from dual


В то время как это противоречит:
insert into tab1 (ids, num) values (seq_1.nextval, 0);


Если необхожимо в EACH ROW триггере работать с более чем одной записью, то надо делать VIEW и INSTEAD OF триггер. Но это не ваш случай.

Андрей
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.