Пишем простейшую хранимую процедуру, которая умеет иногда генерировать исключения:
CREATE PROCEDURE tmp_proc (
p_foo int
)
IF p_foo = 0 THEN
RAISE EXCEPTION -746, 0, "tmp_proc-raised exception";
END IF
END PROCEDURE;
Вызываем её из перла посредством DBD::Informix:
“EXECUTE PROCEDURE tmp_proc (p_foo = ?)”, prepare, execute..
Как ожидалось, получаем
DBI::err = '-746', DBI::errstr='SQL: -746: tmp_proc-raised exception'
Преобразуем процедуру в функцию:
CREATE PROCEDURE tmp_func (
p_foo int
)
RETURNING int;
DEFINE foo int;
IF p_foo = 0 THEN
RAISE EXCEPTION -746, 0, "tmp_func-raised exception";
END IF
LET foo = p_foo+1;
RETURN foo;
END PROCEDURE;
“EXECUTE PROCEDURE tmp_func (p_foo = ?)”, prepare, execute..
И фиг там. execute успешно отрабатывает, возвращает 0E0, DBI::err и DBI::errstr совершенно undefined, всё прекрасно, никаких ошибок.
А вот если потом вызвать fetchrow_array(), то только тогда
DBI::err = '-746', DBI::errstr='SQL: -746: tmp_func-raised exception'.
Что совсем плохо, если какой-нибудь fetch() совсем не вызывать, то функция, похоже, совсем не запускается. Либо результаты её работы откатываются. Потому что изначально я на это наткнулся на функции, которая проверяет данные, добавляет строку в таблицу и возвращает ID от добавленной строки. Вот если этот ID потом не считать с помощью fetch, то данные в таблицу вообще не попадают.
Я даже не понимаю, куда тут копать..
Оригинал этой записи. Комментировать можно тут или там.
Любые материалы из этого блога запрещается использовать на сайте livejournal.ru в любой форме и любом объёме