Здравствуйте, Уважаемые!
Есть Оракл 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".
Если триггер отключить, всё проходит нормально.
Где я ошибся?
Здравствуйте 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>Где я ошибся?
Триггер у тебя неверный.
Здравствуйте PPA, Вы писали:
PPA>Такой ошибки не должно быть, у тебя что-то с настрйокой клиента еще не так.
PPA>они говорят с таких слов:
PPA>ORA-Код траляля.
Ошибка такая есть — я её сам вижу

, хотя в справочнике я её и не нашёл.
PPA>У тебя в случае с таким триггером должна ругаться на "мутируемость"
На мутируемость он ругается при update, а у меня insert
K>>Если триггер отключить, всё проходит нормально.
K>>Где я ошибся?
PPA>Триггер у тебя неверный.
А где именно? Я хотел всего-навсего нумеровать строки
Здравствуйте 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;
Здравствуйте 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;
Так-то она работает, но почему мой вариант не сработал? Что там не так? Меня это тревожит
Здравствуйте 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 триггер. Но это не ваш случай.
Андрей