powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / suspend в execute block
25 сообщений из 30, страница 1 из 2
suspend в execute block
    #39026750
Alimkulov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет Всем!
Странная ошибка!

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
execute block (name varchar(10) = :name)
returns (gcode int, errmsg varchar(250))
as
begin
  gcode = 0;
  errmsg = '';

  insert into NEW_TABLE (NAME)
  values (:name);

  when any do
  begin
    gcode = gdscode;
    errmsg = 'Error';
  end
 suspend;
end



Сообщения ошибки:
Код: plaintext
1.
2.
3.
4.
5.
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 16, column 2.
suspend.
...
Рейтинг: 0 / 0
suspend в execute block
    #39026753
Alimkulov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Забыл!

Firebird 2.5
Dialect 3
...
Рейтинг: 0 / 0
suspend в execute block
    #39026756
pastor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alimkulov,
when - последний опкратор в блоке
...
Рейтинг: 0 / 0
suspend в execute block
    #39026758
Alimkulov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pastor,
Да, тогда работает. Спасибо! Но блок ничего не возвращает, хотя возникает ошибка!
...
Рейтинг: 0 / 0
suspend в execute block
    #39026783
fb user
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alimkulovpastor,
Да, тогда работает. Спасибо! Но блок ничего не возвращает, хотя возникает ошибка!
Там suspend не хватает.
...
Рейтинг: 0 / 0
suspend в execute block
    #39026797
Alimkulov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну ладно ребята! Скажу что я хочу!

Задача состоит в том, что записывать ошибку в журнал ошибок.

Есть таблица журнал ошибок:
SQL_CODE GDS_CODE SQL_STATE DATETIME "USER"

И любой другой таблица модифицируется через EXECUTE BLOCK. А EXECUTE BLOCK формируется динамически по таблицам и DDL оператором.

Тогда, на пример для INSERT, я получаю такую блоку:
Код: sql
1.
2.
3.
4.
5.
6.
execute block (NAME varchar(10) = :NAME)
as
begin
  insert into NEW_TABLE (NAME)
  values (:NAME);
end


И при возникновение ошибки написал так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
execute block (NAME varchar(10) = :NAME)
as
begin
  insert into NEW_TABLE (NAME)
  values (:NAME);

  when any do
  begin
    in autonomous transaction do
      insert into ERROR_LOG (SQL_CODE, GDS_CODE, SQL_STATE, DATETIME, "USER")
      values (sqlcode, gdscode, sqlstate, current_timestamp, current_user);
    exception;
  end
end


Но в ERROR_LOG ничего не записывается, хотя ошибки есть.

А если через процедуры все ОК:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
create or alter procedure NEW_PROCEDURE (NAME varchar(255))
as
begin
  insert into NEW_TABLE (NAME)
  values (:name);
  
  --Тут  записываем ошибку в журнал
end


Тогда идея динамичность...!

Или вообще как Вы решали подобные задачи?
...
Рейтинг: 0 / 0
suspend в execute block
    #39026801
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alimkulov,

всего то надо в лишний begin...end обвернуть

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
EXECUTE BLOCK (
    NAME VARCHAR(10) = :NAME)
RETURNS (
    GCODE  INT,
    ERRMSG VARCHAR(250))
AS
BEGIN
  GCODE = 0;
  ERRMSG = '';
  BEGIN
    INSERT INTO NEW_TABLE (NAME)
    VALUES (:NAME);

    WHEN ANY DO
    BEGIN
      GCODE = GDSCODE;
      ERRMSG = 'Error';
    END
  END
  SUSPEND;
END
...
Рейтинг: 0 / 0
suspend в execute block
    #39026805
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlimkulovНу ладно ребята! Скажу что я хочу!

Задача состоит в том, что записывать ошибку в журнал ошибок.

Есть таблица журнал ошибок:
SQL_CODE GDS_CODE SQL_STATE DATETIME "USER"


у нас тут принято DDL таблиц выкладывать, а не шапки таблицы.
[/quot]

AlimkulovА EXECUTE BLOCK формируется динамически по таблицам и DDL оператором.

чем, чем?

И при возникновение ошибки написал так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
execute block (NAME varchar(10) = :NAME)
as
begin
  insert into NEW_TABLE (NAME)
  values (:NAME);

  when any do
  begin
    in autonomous transaction do
      insert into ERROR_LOG (SQL_CODE, GDS_CODE, SQL_STATE, DATETIME, "USER")
      values (sqlcode, gdscode, sqlstate, current_timestamp, current_user);
    exception;
  end
end


[/quot]

должно работать выложишь DDL таблиц ERROR_LOG и NEW_TABLE попробуем что не так
...
Рейтинг: 0 / 0
suspend в execute block
    #39026812
Alimkulov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,



Симонов Денисчем, чем?

BLOCK Динамически формируется в клиентское приложение.

Симонов Денисдолжно работать выложишь DDL таблиц ERROR_LOG и NEW_TABLE попробуем что не так

Таблица ERROR_LOG:
Код: sql
1.
2.
3.
4.
5.
6.
7.
CREATE TABLE ERROR_LOG (
    SQL_CODE   INTEGER,
    GDS_CODE   INTEGER,
    SQL_STATE  INTEGER,
    DATETIME   TIMESTAMP,
    "USER"     VARCHAR(100)
);


Таблица NEW_TABLE :
Код: sql
1.
2.
3.
CREATE TABLE NEW_TABLE (
    NAME  VARCHAR(10)
);
...
Рейтинг: 0 / 0
suspend в execute block
    #39026816
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alimkulov,

переменная SQLSTATE имеет тип VARCHAR(5), а не INTEGER
...
Рейтинг: 0 / 0
suspend в execute block
    #39026817
Alimkulov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисвсего то надо в лишний begin...end обвернуть
Нет, не работает, т.е. не возвращает!
...
Рейтинг: 0 / 0
suspend в execute block
    #39026819
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alimkulov,

проверил в IBE всё там возвращается. У тебя с клиентом что-то не то. Копайся в настройках
...
Рейтинг: 0 / 0
suspend в execute block
    #39026820
Alimkulov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис переменная SQLSTATE имеет тип VARCHAR(5), а не INTEGER

CREATE TABLE ERROR_LOG (
SQL_CODE INTEGER,
GDS_CODE INTEGER,
SQL_STATE VARCHAR(5),
DATETIME TIMESTAMP,
"USER" VARCHAR(100)
);
...
Рейтинг: 0 / 0
suspend в execute block
    #39026822
Alimkulov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,
Не подскажите, где и какую настройку надо посмотреть?
...
Рейтинг: 0 / 0
suspend в execute block
    #39026823
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alimkulov,

да чёрт его знает что у тебя в качестве компонентов доступа используется
...
Рейтинг: 0 / 0
suspend в execute block
    #39026827
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot Alimkulov]Симонов Денис переменная SQLSTATE имеет тип VARCHAR(5), а не INTEGER


Код: sql
1.
2.
    DATETIME   TIMESTAMP,
    "USER"     VARCHAR(100)



Лучше так не делать.
...
Рейтинг: 0 / 0
suspend в execute block
    #39026829
Alimkulov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,
Сейчас работаю с EBExpert.
Сервер : локальный
Файл клиентской библиотеки : gds32.dll
...
Рейтинг: 0 / 0
suspend в execute block
    #39026831
Alimkulov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkMaster,
Таблица ERROR_LOG была для эксперимента.
...
Рейтинг: 0 / 0
suspend в execute block
    #39026836
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alimkulov,

тогда почему у меня в IBE всё работает?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
EXECUTE BLOCK (
    NAME VARCHAR(15) = :NAME)
RETURNS (
    GCODE  INT,
    ERRMSG VARCHAR(250))
AS
BEGIN
  GCODE = 0;
  ERRMSG = '';
  BEGIN
    INSERT INTO NEW_TABLE (NAME)
    VALUES (:NAME);

    WHEN ANY DO
    BEGIN
      GCODE = GDSCODE;
      ERRMSG = 'Error';
    END
  END
  SUSPEND;
END



попытка 1 вставляем валидное значение 12345

GCODE ERRMSG
0

попытка 2 вставляем невалидное значение 1234567890123

GCODE ERRMSG
335544321 Error
...
Рейтинг: 0 / 0
suspend в execute block
    #39026844
Alimkulov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,
В начале вопроса написал же, странная ошибка!
...
Рейтинг: 0 / 0
suspend в execute block
    #39026852
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alimkulov,

гм... а какая БД в свойствах соединения указана. И какая версия клиента?
...
Рейтинг: 0 / 0
suspend в execute block
    #39026859
Alimkulov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,
...
Рейтинг: 0 / 0
suspend в execute block
    #39026860
Alimkulov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

Модератор: Вложение удалено.
...
Рейтинг: 0 / 0
suspend в execute block
    #39026887
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пожалуйста, подрезайте скриншоты перед публикацией.
...
Рейтинг: 0 / 0
suspend в execute block
    #39026890
Alimkulov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan_Pisarevsky,
Да, да конечно! Извините!
...
Рейтинг: 0 / 0
25 сообщений из 30, страница 1 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / suspend в execute block
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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