Доброго времени суток
Есть БД, в таблицах которой множество ограничений целостности, каждое из которых имеет заранее известное имя. Как узнать имя ограничения, вызвавшего исключение при выполнении ХП?
Есть таблица и ограничение:
CREATE TABLE NEW_TABLE (
NUMBER BIGINT,
STRING VARCHAR(64)
);
ALTER TABLE NEW_TABLE ADD CONSTRAINT CHK1_NEW_TABLE check (STRING IS NOT NULL);
Пример. Если использовать IBExpert для вставки в эту таблицу, то получим следующее:
insert into new_table(number, string) values(null, null);
Operation violates CHECK constraint on view or table.
Operation violates CHECK constraint CHK1_NEW_TABLE on view or table NEW_TABLE.
At trigger 'CHECK_3941'.
Теперь пишу следующую ХП:
create procedure NEW_PROCEDURE (
pNumber bigint,
pString varchar(64))
returns (
sql bigint,
gds bigint,
message varchar(4096))
as
begin
insert into new_table(number, string) values(:pNumber, :pString);
sql = 0;
gds = 0;
suspend;
when any do
begin
sql = SQLCODE;
gds = GDSCODE;
VIOLATED_CHECK_NAME = FUNC(sql, gds); --- вот с этим проблема
message = FUNC(VIOLATED_CHECK_NAME);
suspend;
end
end
На RSDN есть статья про обработку ошибок БД на примере именно Firebird (
http://rsdn.ru/article/db/FBErrors.xmlАвтор(ы): Лихачёв Владимир Николаевич
Дата: 26.04.2009
При разработке программ, работающих с БД, важным моментом является обработка ошибочных ситуаций и информативность сообщений, предназначенных для конечного пользователя. При сложной структуре БД формирование таких сообщений для каждой отдельной ситуации может требовать довольно значительных усилий. Обработка ошибок, основанная на анализе структуры БД, и с учётом различных специфических ситуации позволит уменьшить трудозатраты и повысить качество программного обеспечения.
), но там речь идет о формировании сообщения об ошибке на основании сообщения сервера. А вот последнего у меня как раз и нет!
Если кто-то в курсе, как решить вопрос, напишите, буду очень благодарен.