powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / suspend в execute block
30 сообщений из 30, показаны все 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
suspend в execute block
    #39026893
Alimkulov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
suspend в execute block
    #39026898
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alimkulov,

а если попробовать не через локальный протокол, а через TCP/IP?
...
Рейтинг: 0 / 0
suspend в execute block
    #39026916
Alimkulov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,
Без входных параметров работает:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
execute block
returns (gcode int, errmsg varchar(250))
as
declare variable name varchar(100);
begin
  name = 'dsfgfghfghghhfghfghfghgfhgfh';

  gcode = 0;
  errmsg = '';
  begin
    insert into NEW_TABLE (NAME)
    values (:name);

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



gcode = 335544321
errmsg = 'Error'
...
Рейтинг: 0 / 0
suspend в execute block
    #39026921
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alimkulov,

версия IBE?
...
Рейтинг: 0 / 0
suspend в execute block
    #39026938
Alimkulov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все заработал!

Проблема была в том, что написал так
Код: sql
1.
execute block (name varchar(10) = :name)



и передал значение 'dsfgfghfghghhfghfghfghgfhgfh'. Тогда у сервера при обработке входных параметров возникла исключение
'Arithmetic exception, numeric overflow, or string truncation' сам блок не выполнялся.

Блин я сам виноват!

Спасибо Вам большое! Если бы не Вы я сидел бы 2 дня!
Огромное спасибо Симонову Денису!

Теперь моя идея по обработке ошибок отлично работает!
...
Рейтинг: 0 / 0
30 сообщений из 30, показаны все 2 страниц
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / suspend в execute block
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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