Ошибка IBM DB2 SQL-код 724 и состояние SQL Server 54038 - PullRequest
0 голосов
/ 22 сентября 2019

Я пытался вставить некоторые примеры данных в таблицу, но процессор командной строки db2 возвращает это сообщение: «DB21034E Команда была обработана как оператор SQL, поскольку она не была действительной командой процессора командной строки. Во время обработки SQL она вернула:SQL0723N В триггерном операторе SQL в триггере «EDWIN.CALLCQ» произошла ошибка. Информация, возвращаемая для ошибки, включает SQLCODE "-724", SQLSTATE "54038" и токены сообщения «EDWIN.CHKQUANTITY | PROCEDURE». SQLSTATE = 09000 "

Вот моя процедура

create procedure chkQuantity (Cart_ID int,Food_ID int, Food_Quantity int)begin declare c cursor with return for select sum(Food_Quantity) from Cart_details group by Cart_ID;open c; If(Food_Quantity <= 10)then insert into cart_details(Cart_ID,Food_ID,Food_Quantity) values (Cart_ID , Food_ID ,Food_Quantity);Else signal sqlstate'45000' set message_text = '1 Cart Maximum order only 10 food Quantity' ;delete from cart_details where cart_details_id=cart_details_id; end if;close c; end

триггер

create trigger callCQ after insert on cart_details referencing new as N for each row mode db2sql call chkQuantity(N.Cart_ID, N.Food_ID, N.Food_Quantity)

таблица

create table Cart_Details(Cart_Details_ID int not null primary key ,Cart_ID int , Foreign Key(Cart_ID) references Cart,Food_ID int,foreign key(Food_ID) references Food, Food_quantity int check(food_quantity <= 10))

1 Ответ

0 голосов
/ 22 сентября 2019

В описании сообщения SQL0724N четко указано, что:

SQL0724N
Активация имя-объекта типа тип объекта будет превышать максимальный уровень косвенного каскадирования SQL.

Объяснение
Каскадирование косвенного SQL происходит, когда триггер активирует другой триггер (возможно, с помощью правил удаления ссылочных ограничений) или подпрограмма, содержащая SQL, вызывает другую подпрограмму.Глубина этого каскадирования ограничена 16 для триггеров и 64 для подпрограмм.Обратите внимание, что рекурсивные ситуации, когда триггер включает триггерный оператор SQL, который прямо или косвенно вызывает активацию одного и того же триггера, или когда подпрограмма прямо или косвенно вызывает себя, является формой каскадирования, которая с большой вероятностью может вызвать эту ошибку, если естьнет условий для предотвращения превышения каскадом лимита.Тип объекта: TRIGGER, FUNCTION, METHOD или PROCEDURE.Указанное имя объекта является одним из объектов, которые были бы активированы на семнадцатом уровне каскадирования.

Ответ пользователя
Начните с объектов, которые активируются или вызываются оператором, получившим эту ошибку.Если какой-либо из этих объектов является рекурсивным, убедитесь, что существует какое-то условие, которое не позволяет объекту быть активированным или вызванным больше, чем позволяет ограничение.Если это не является причиной проблемы, следуйте цепочке объектов, которые активированы или вызваны, чтобы определить цепочку, которая превышает каскадный предел.

Вы вызываете подпрограмму, вставляющую строку в таблицу вafter insert триггер.Это приводит к тому, что рекурсивные вызовы этого триггера превышают допустимое количество каскадных вызовов.

...