dil: (Default)
dil ([personal profile] dil) wrote2010-03-24 06:51 pm
Entry tags:

очередные перлово-sqlные грабли

Пишем простейшую хранимую процедуру, которая умеет иногда генерировать исключения:

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 в любой форме и любом объёме

[identity profile] kranov.livejournal.com 2010-03-25 05:45 am (UTC)(link)
напиши в cdi, там автор DBI иногда бывал.
http://groups.google.com/group/comp.databases.informix

а да

[identity profile] kranov.livejournal.com 2010-03-25 05:49 am (UTC)(link)
похожего поведения можно добится если включить OPTOFC и OPTMSG

http://publib.boulder.ibm.com/infocenter/idshelp/v111/topic/com.ibm.sqlr.doc/sqlr262.htm#sii-03-13606

http://publib.boulder.ibm.com/infocenter/idshelp/v111/topic/com.ibm.sqlr.doc/sqlr263.htm

Re: а да

[identity profile] dil.livejournal.com 2010-03-25 07:36 am (UTC)(link)
мне не надо похожего, мне как раз надо от него избавиться :)

Re: а да

[identity profile] kranov.livejournal.com 2010-03-25 08:38 am (UTC)(link)
я понимаю, это переменные окружения на клиенте, проверить их легко.

Re: а да

[identity profile] dil.livejournal.com 2010-03-25 12:23 pm (UTC)(link)
перепробовал обе переменные во всех сочетаниях, никакой разницы. execute завершается успешно, ошибка выползает в fetch