powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Триггеры
4 сообщений из 4, страница 1 из 1
Триггеры
    #37539601
new_era
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Народ, помогите плиз. Есть таблица t_klient со cтолбцами id_klienta, id_passport и fio_klienta .
Суть триггера в том что при добавлении нового клиента вводится id_passport, а если такой id уже есть в таблице, триггер должен сам вводить ФИО.
Вот что у меня вышло но db2 выдает ошибку
WHEN (exists (select *
from t_klient
where new_row.id_passport=t_klient.id_passport))
BEGIN ATOMIC
update db2admin.t_klient
set fio_klienta=(select t_klient.fio_klienta
from db2admin.t_klient
where new_row.id_passport=t_klient.id_passport)
where new_row.id_passport=t_klient.id_passport ;
END

Ошибка в триггерном операторе SQL в триггерной процедуре
"DB2ADMIN.TR_ADD_KLIENT". Код ошибки SQLCODE "-811", состояние
SQLSTATE "21000", элементы сообщения "". SQLSTATE=09000

Помогите пожалуйста!
...
Рейтинг: 0 / 0
Триггеры
    #37539682
RXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
new_era,

Прежде всего, обновлять ту же самую таблицу в триггере нельзя. Нужно использовать алиасы NEW и OLD.

Код: plaintext
SET NEW.fio_klienta = 'что-то с ручкой';

Смотрите в документации SQLSTATE, указанный в ошибке - это должно навести на мысль, что тут еще неправильно.

Модератор: Тема перенесена из форума "MySQL".
...
Рейтинг: 0 / 0
Триггеры
    #37543822
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
new_era,

>db2 "? sql811"
SQL0811N The result of a scalar fullselect, SELECT INTO statement, or
VALUES INTO statement is more than one row.

Explanation:

One of the following caused the error:
* Execution of an embedded SELECT INTO or VALUES INTO statement
resulted in a result table of more than one row.
* Execution of a scalar fullselect resulted in a result table of more
than one row.


Federated system users: this situation can be detected by federated
server or by the data source.

The statement cannot be processed.

User response:

Ensure that the statement contains the proper condition specifications.
If it does, there may be a data problem that is causing more than one
row to be returned when only one is expected.
Скорее всего проблема в том, что ваш scalar fullselect (тот, который вы для SET fio_clienta используете) возвращает несколько записей.
Во всяком случае на вашем триггере и этих данных вы получите такую ошибку, вставляя строку с id_klienta=3.
id_klientaid_passportfio_klienta11Иванов21Иванов31___
Не обращая внимание на вашу довольно странную систему учёта клиентов (получается, что вы храните более чем одного клиента с одинаковым номером паспорта), решение могло бы выглядеть так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
create trigger t_klient_bir
before insert on t_klient
referencing new as new_row
for each row
set fio_klienta = 
coalesce(
(
select fio_klienta 
from t_klient 
where t_klient.id_passport=new_row.id_passport
fetch first  1  row only
)
, new_row.fio_klienta)
Обратите внимание, что используется before триггер вместо after, и я беру первую попавшуюся фамилию (fetch first 1 row only) из существующих записей для вставляемого номера паспорта.
...
Рейтинг: 0 / 0
Триггеры
    #37553040
new_era
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mark Barinstein,

Спасибо. Проблема решена, тему считаю закрытой. Еще раз спасибо всем, кто принял участие в обсуждении.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Триггеры
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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