Re: Catching DML exceptions in PL/pgSQL
От | Joe Conway |
---|---|
Тема | Re: Catching DML exceptions in PL/pgSQL |
Дата | |
Msg-id | 3EEEE5CE.1000509@joeconway.com обсуждение исходный текст |
Ответ на | Catching DML exceptions in PL/pgSQL (Radu-Adrian Popescu <radu.popescu@aldratech.com>) |
Ответы |
Re: Catching DML exceptions in PL/pgSQL
|
Список | pgsql-sql |
Radu-Adrian Popescu wrote: > ..................... > begin > _res.code:=1; > select id into iid from log where id=_id; > if not found then begin > _res.msg:=''insert''; > *insert into log (log, data) values (_log, _data); > if not found* then begin > _res.msg:=_res.msg || '' error''; > _res.code:=-1; > end; > end if; > end; > else begin > ..................... > The thing is if _data (parameter) is null and table has a (data <> null) check, > the insert would fail and abort the function before my "if not found" test. You could test for _data is null, and if so check attnotnull in pg_attribute. E.g. something like: declare iattnotnull bool [...] begin if _data is null then select into iattnotnull attnotnull from pg_catalog.pg_attribute where attrelid = 'log'::regclassand attname = 'data'; if iattnotnull then _res.code := -1; [...] > Is there anything I can do to make sure the function always returns _res ? > Something along the lines of Oracle's exception handling, or the @@error trick > in mssql ? There is currently no way to "catch" the exception in PL/pgSQL, but maybe the above would work for you. HTH, Joe
В списке pgsql-sql по дате отправления: