Начало » Использование СУБД » Firebird, HQbird, InterBase » Странность с исключениями в EB (Выколупано из теста на CORE-3029)
Странность с исключениями в EB [сообщение #5069] |
Fri, 17 May 2024 00:56 |
SD
Сообщений: 417 Зарегистрирован: August 2022
|
Senior Member |
|
|
Вот вводная:
create sequence test_gen;
recreate table test_row
(id int not null,
did int not null,
pid int not null,
dep int not null
);
alter table test_row add constraint pk_test_row primary key(id);
create unique index ix_test_row1 on test_row(did, pid, dep);
commit;
insert into test_row(id, did, pid,dep) values(1, 2, 3, 4);
commit;
Вот собственно блок:
set term !!;
execute block returns(id int, did int, dep int, pid int)
as
declare variable xid int;
begin
select id,did, pid,dep
from test_row
where id=(select min(id) from test_row)
into :xid, :did, pid, :dep;
while (1=1) do
begin
delete from test_row r where r.id = :xid;
insert into test_row(id, did, dep, pid)
values (gen_id(test_gen, 1), :did, :dep, :pid);
suspend;
when any do
exception;
end
end !!
Вопрос на засыпку: почему он перед ошибкой возвращает две строки?
Совершенно аналогичная процедура:
create or alter procedure sp_test
returns(id int, did int, dep int, pid int)
as
declare variable xid int;
begin
select id,did, pid,dep
from test_row
where id=(select min(id) from test_row)
into :xid, :did, pid, :dep;
while (1=1) do
begin
delete from test_row r where r.id = :xid;
insert into test_row(id, did, dep, pid)
values (gen_id(test_gen, 1), :did, :dep, :pid);
suspend;
when any do
exception;
end
end !!
select * from sp_test !!
Возвращает одну строку.
Чего я не понимаю?
|
|
|
Переход к форуму:
Текущее время: Sun Dec 22 15:48:36 GMT+3 2024
Общее время, затраченное на создание страницы: 0.00770 секунд
|