Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / suspend в execute block / 25 сообщений из 30, страница 1 из 2
11.08.2015, 08:39
    #39026750
Alimkulov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
suspend в execute block
Привет Всем!
Странная ошибка!

Код: 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
11.08.2015, 08:42
    #39026753
Alimkulov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
suspend в execute block
Забыл!

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

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

Есть таблица журнал ошибок:
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
11.08.2015, 09:47
    #39026801
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
suspend в execute block
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
11.08.2015, 09:53
    #39026805
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
suspend в execute block
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
11.08.2015, 10:04
    #39026812
Alimkulov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
suspend в execute block
Симонов Денис,



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

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
11.08.2015, 10:13
    #39026816
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
suspend в execute block
Alimkulov,

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

проверил в IBE всё там возвращается. У тебя с клиентом что-то не то. Копайся в настройках
...
Рейтинг: 0 / 0
11.08.2015, 10:18
    #39026820
Alimkulov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
suspend в execute block
Симонов Денис переменная 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
11.08.2015, 10:20
    #39026822
Alimkulov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
suspend в execute block
Симонов Денис,
Не подскажите, где и какую настройку надо посмотреть?
...
Рейтинг: 0 / 0
11.08.2015, 10:20
    #39026823
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
suspend в execute block
Alimkulov,

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


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



Лучше так не делать.
...
Рейтинг: 0 / 0
11.08.2015, 10:27
    #39026829
Alimkulov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
suspend в execute block
Симонов Денис,
Сейчас работаю с EBExpert.
Сервер : локальный
Файл клиентской библиотеки : gds32.dll
...
Рейтинг: 0 / 0
11.08.2015, 10:30
    #39026831
Alimkulov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
suspend в execute block
DarkMaster,
Таблица ERROR_LOG была для эксперимента.
...
Рейтинг: 0 / 0
11.08.2015, 10:33
    #39026836
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
suspend в execute block
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
11.08.2015, 10:49
    #39026844
Alimkulov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
suspend в execute block
Симонов Денис,
В начале вопроса написал же, странная ошибка!
...
Рейтинг: 0 / 0
11.08.2015, 10:57
    #39026852
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
suspend в execute block
Alimkulov,

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

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


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