powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Текст исключения
9 сообщений из 9, страница 1 из 1
Текст исключения
    #38726796
exception2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
SET SQL DIALECT 3;

SET NAMES WIN1251;

SET CLIENTLIB 'fbclient.dll';

CREATE DATABASE 'localhost:R:\data\test.fdb'
USER 'SYSDBA' PASSWORD 'masterkey'
PAGE_SIZE 16384
DEFAULT CHARACTER SET WIN1251 COLLATION WIN1251;

CREATE GENERATOR TABLE1_GEN;
SET GENERATOR TABLE1_GEN TO 2;

CREATE EXCEPTION EXCEPTION_MSG 'ERROR!';

SET TERM ^ ; 

CREATE OR ALTER PROCEDURE TEST (
    XZ1 INTEGER,
    XZ2 INTEGER,
    XZ3 INTEGER)
RETURNS (
    RESULT VARCHAR(80))
AS
BEGIN
  SUSPEND;
END^

SET TERM ; ^

CREATE TABLE TABLE1 (
    ID   INTEGER NOT NULL,
    XZ1  INTEGER NOT NULL,
    XZ2  INTEGER NOT NULL,
    XZ3  INTEGER NOT NULL
);

ALTER TABLE TABLE1 ADD CONSTRAINT PK_TABLE1 PRIMARY KEY (ID);

SET TERM ^ ;

/* Trigger: TABLE1_BIU0 */
CREATE OR ALTER TRIGGER TABLE1_BIU0 FOR TABLE1
ACTIVE BEFORE INSERT OR UPDATE POSITION 0
as
begin
 if (new.xz1=new.xz2) then
  exception exception_msg 'Error 1';
end
^

/* Trigger: TABLE1_BIU1 */
CREATE OR ALTER TRIGGER TABLE1_BIU1 FOR TABLE1
ACTIVE BEFORE INSERT OR UPDATE POSITION 1
as
begin
 if (new.xz1=new.xz3) then
  exception exception_msg 'Error 2';
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE TEST (
    XZ1 INTEGER,
    XZ2 INTEGER,
    XZ3 INTEGER)
RETURNS (
    RESULT VARCHAR(80))
AS
begin
 result = 'OK';
 begin
  insert into table1(id,xz1,xz2,xz3)
   values(gen_id(table1_gen,1),:xz1,:xz2,:xz3);
  when any do
   result = 'Error: '||???;
 end
 suspend;
end^

SET TERM ; ^



Пример: есть таблица, у нее несколько триггеров, которые неким образом проверяют вносимые/изменяемые данные и в зависимости от неких условий выдают ошибку, каждый с определенным текстом. Есть процедура, которая содержит операции вставки/изменения данных в этой таблице. Как в этой процедуре достать текст исключений из триггеров?
...
Рейтинг: 0 / 0
Текст исключения
    #38726799
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exception2,

никак
...
Рейтинг: 0 / 0
Текст исключения
    #38726847
exception2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dimitrexception2,

никак

Ну через контекстные переменные, конечно, можно протащить текст ошибки, но это усложняет код и хз каким боком может выйти в будущем. Может есть еще какие варианты? Может в следующих версиях планируются шаги в этом направлении?
...
Рейтинг: 0 / 0
Текст исключения
    #38726855
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exception2,

голосуй за CORE-2040
может быть когда-нибудь и появится
...
Рейтинг: 0 / 0
Текст исключения
    #38726875
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello, Симонов Денис!
You wrote on 22 августа 2014 г. 15:55:44:

Симонов Денис> голосуй за CORE-2040 < http://tracker.firebirdsql.org/browse/CORE-2040>
> может быть когда-нибудь и появится так вродь тикет закрыт же.

зы: проголосовал
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Текст исключения
    #38727034
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий> так вродь тикет закрыт же.

У меня отображается статус "Орен", в хистори вроде тоже закрытия не видно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Текст исключения
    #38727040
H.e.l.p
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exception2,

как вариант:
1. делаем таблицу исключений
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
CREATE TABLE USERTEMPERRTEXT (
    TRANSACTIONID  INTEGER NOT NULL,
    ERRTEXT        VARCHAR(1021)
);

ALTER TABLE USERTEMPERRTEXT ADD CONSTRAINT PK_USERTEMPERRTEXT PRIMARY KEY (TRANSACTIONID);


COMMENT ON TABLE USERTEMPERRTEXT IS 
'Временные сообщения об ошибке.';

COMMENT ON COLUMN USERTEMPERRTEXT.TRANSACTIONID IS 
'ИД текущей транзакции';

COMMENT ON COLUMN USERTEMPERRTEXT.ERRTEXT IS 
'Сообщение об ошибке';



2. Делаем обертку для генерации исключений

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
SET TERM ^ ;

create or alter procedure F_ERROR (
    I_ERRTEXT varchar(1021))
as
declare variable V_TRANSACTIONID integer;
begin
  V_TRANSACTIONID = current_transaction;
  I_ERRTEXT = coalesce(:I_ERRTEXT, 'Ошибка');
  -- Сохранение
  in autonomous transaction do
  update or insert into USERTEMPERRTEXT (TRANSACTIONID, ERRTEXT)
  values (:V_TRANSACTIONID, :I_ERRTEXT);
  -- Исключение
  exception E_ABORT :I_ERRTEXT;
end^

SET TERM ; ^

COMMENT ON PROCEDURE F_ERROR IS
'Процедура генерации ошибки';

COMMENT ON PARAMETER F_ERROR.I_ERRTEXT IS
'Сообщение об ошибке';



3. Делаем обертку для получения ошибки
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
SET TERM ^ ;

create or alter procedure F_GETERROR
returns (
    O_ERRTEXT varchar(1021))
as
declare variable V_TRANSACTIONID integer;
begin
  V_TRANSACTIONID = current_transaction;
  -- Получаем текстовку
  in autonomous transaction do select ERRTEXT
  from USERTEMPERRTEXT
  where TRANSACTIONID = :V_TRANSACTIONID into O_ERRTEXT;
  -- Сторнируем
  in autonomous transaction do
  delete from USERTEMPERRTEXT
  where TRANSACTIONID = :V_TRANSACTIONID;
  -- Возвращаем
  suspend;
end^

SET TERM ; ^

COMMENT ON PROCEDURE F_GETERROR IS
'Процедура получения текущей ошибки';

COMMENT ON PARAMETER F_GETERROR.O_ERRTEXT IS
'Описание ошибки';



4. Если нужно, вызываем исключение через оберту
Код: plsql
1.
if (....) then execute procedure F_ERROR('Текст ошибки');



5. Обрабатываем
Код: plsql
1.
2.
3.
4.
5.
when exception E_ABORT do
      select coalesce(O_ERRTEXT, 'Хз что')
      from F_GETERROR
      left join RDB$DATABASE on 1 = 1
      into O_ERRTEXT;

...
Рейтинг: 0 / 0
Текст исключения
    #38727054
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello, Гаджимурадов Рустам!
You wrote on 22 августа 2014 г. 18:30:12:

Гаджимурадов Рустам> У меня отображается статус "Орен", в хистори вроде тоже закрытия не видно.
это я не туда посмотрел.
там (справа) ещё дубликат есть.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Текст исключения
    #38727165
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий> там (справа) ещё дубликат есть.

Их вроде даже два.

P.S. Тоже хотел провотить. Но не смог - уже вотил
когда-то оказывается, хотя даже не помню когда. :)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Текст исключения
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]