Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / IBExpert Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
 Re: IBEBlock: ошибки, вопросы, предложения - сюда  [new]
IBExpert
Member

Откуда: От верблюда
Сообщений: 3331
_Vasilisk_
CURRENT_TIMESTAMP, по идее, тоже TIMESTAMP


Чего-то ты не договариваешь... Вот тестовый пример:
EXECUTE IBEBLOCK
AS
BEGIN
  execute statement 'CREATE TABLE TEST_TIMESTAMP (TS  TIMESTAMP)';
  commit;

  insert into test_timestamp (ts) values (current_timestamp);
  commit;

  FOR
    SELECT
      ts as ts1,
      CURRENT_TIMESTAMP AS ts2
    FROM
      test_timestamp
    AS CURSOR
      cur
  DO
  begin
    var_t1 = cur.ts1;
    var_t2 = cur.ts2;
  end;
END;


В отладчике вижу, что все ОК: значения обеих переменных одинаково сформатированы и отображаются - как таймштамп, а не как строка.
9 окт 20, 17:57    [22211635]     Ответить | Цитировать Сообщить модератору
 Re: IBEBlock: ошибки, вопросы, предложения - сюда  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12343
IBExpert
В отладчике вижу, что все ОК:
В отладчике да.

Вот тебе мой пример

+ Подготовка
SET SQL DIALECT 3;

CREATE TABLE LOGS (
    ID           BIGINT GENERATED BY DEFAULT AS IDENTITY,
    "TIMESTAMP"  TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL,
    "MESSAGE"    BLOB SUB_TYPE 1 SEGMENT SIZE 128
);

ALTER TABLE LOGS ADD CONSTRAINT PK_LOGS PRIMARY KEY (ID);

SET TERM ^ ;

CREATE OR ALTER PROCEDURE sp_d_log (
  in_msg TYPE OF COLUMN logs."MESSAGE")
AS
BEGIN
  IN AUTONOMOUS TRANSACTION DO
    INSERT INTO logs (
      "MESSAGE"
    ) VALUES (
      :in_msg
    );
END^

SET TERM ; ^
+ Скрипт
EXECUTE IBEBLOCK
AS
BEGIN
  FOR
    SELECT
      CURRENT_TIMESTAMP AS datetime
    FROM
      rdb$database t
    AS CURSOR
      cur
  DO
    EXECUTE PROCEDURE sp_d_log(cur.datetime);

  EXECUTE PROCEDURE sp_d_log(CURRENT_TIMESTAMP);
END;
Результат
IDTIMESTAMPMESSAGE
15412.10.2020 12:57:19.20412-OCT-2020 12:57:19.0000
15512.10.2020 12:57:19.2042020-10-12 12:57:19.2040


К сообщению приложен файл. Размер - 7Kb
12 окт 20, 13:12    [22212659]     Ответить | Цитировать Сообщить модератору
 Re: IBEBlock: ошибки, вопросы, предложения - сюда  [new]
Dimbuch®
Member

Откуда: Москва
Сообщений: 109
В процедуре надо указать тип
CREATE OR ALTER PROCEDURE sp_d_log (
  in_msg TYPE OF COLUMN logs."MESSAGE")
AS
BEGIN
  IN AUTONOMOUS TRANSACTION DO
    INSERT INTO logs (
      "MESSAGE"
    ) VALUES (
      CAST(:in_msg AS TIMESTAMP)
    );
END
12 окт 20, 14:09    [22212729]     Ответить | Цитировать Сообщить модератору
 Re: IBEBlock: ошибки, вопросы, предложения - сюда  [new]
IBExpert
Member

Откуда: От верблюда
Сообщений: 3331
_Vasilisk_

Вот тебе мой пример


Хех, так это совсем другое дело, и в нем все правильно:

1. EXECUTE PROCEDURE sp_d_log(cur.datetime) сначала препарируется как EXECUTE PROCEDURE sp_d_log(:Param), затем параметру через AsString присваивается значение cur.datetime. Здесь и происходит конвертация из таймштампа в строку.

2. EXECUTE PROCEDURE sp_d_log(CURRENT_TIMESTAMP) отправляется на сервер как есть, конвертация выполняется сервером.
12 окт 20, 17:02    [22212878]     Ответить | Цитировать Сообщить модератору
 Re: IBEBlock: ошибки, вопросы, предложения - сюда  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12343
IBExpert
2. EXECUTE PROCEDURE sp_d_log(CURRENT_TIMESTAMP) отправляется на сервер как есть, конвертация выполняется сервером.
Хорошо. А откуда тогда такое поведение?
_Vasilisk_
CREATE TABLE TEST (
    ID         INTEGER NOT NULL,
    DATETIME   TIMESTAMP
);
_Vasilisk_
EXECUTE IBEBLOCK
AS
BEGIN
  FOR
    SELECT
      t.id,
      t.datetime
    FROM
      test t
    AS CURSOR
      cur
  DO
    EXECUTE PROCEDURE sp_d_log(cur.datetime);
END;

В лог пишется "2020-10-08 17:07:12.1620"


P.S. Завтра соберу полный пример

Сообщение было отредактировано: 12 окт 20, 21:16
12 окт 20, 21:19    [22212997]     Ответить | Цитировать Сообщить модератору
 Re: IBEBlock: ошибки, вопросы, предложения - сюда  [new]
IBExpert
Member

Откуда: От верблюда
Сообщений: 3331
_Vasilisk_
Хорошо. А откуда тогда такое поведение?


Я ж только что объяснил, п.1. Это равносильно выполнению запроса в SQL редакторе:
EXECUTE PROCEDURE sp_d_log(cast(:param as timestamp))

В лог попадет клиентский вариант конвертации таймштампа в строку, а не серверный.

Сообщение было отредактировано: 13 окт 20, 04:16
13 окт 20, 04:15    [22213123]     Ответить | Цитировать Сообщить модератору
 Re: IBEBlock: ошибки, вопросы, предложения - сюда  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12343
А нельзя ли сделать так, чтобы
ibec_Cast(TRUE, __typeString);
ibec_Cast(FALSE, __typeString);
возвращало TRUE и FALSE, а не -1 и 0?
28 окт 20, 10:29    [22221964]     Ответить | Цитировать Сообщить модератору
 Re: IBEBlock: ошибки, вопросы, предложения - сюда  [new]
IBExpert
Member

Откуда: От верблюда
Сообщений: 3331
_Vasilisk_
А нельзя ли сделать так, чтобы
ibec_Cast(TRUE, __typeString);
ibec_Cast(FALSE, __typeString);
возвращало TRUE и FALSE, а не -1 и 0?


А если у кого-то это уже используется в коде, то и фиг с ним, да?
29 окт 20, 08:29    [22222748]     Ответить | Цитировать Сообщить модератору
 Re: IBEBlock: ошибки, вопросы, предложения - сюда  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12343
Для функции ibec_CreateConnection ConnectionType __ctMySQL поддерживается? Если да, то в каком формате нужно задавать параметры подключения?
29 окт 20, 14:14    [22222916]     Ответить | Цитировать Сообщить модератору
 Re: IBEBlock: ошибки, вопросы, предложения - сюда  [new]
IBExpert
Member

Откуда: От верблюда
Сообщений: 3331
_Vasilisk_
Для функции ibec_CreateConnection ConnectionType __ctMySQL поддерживается?


Никогда не поддерживался. И в принципе MySQL давно не поддерживается.
29 окт 20, 14:31    [22222938]     Ответить | Цитировать Сообщить модератору
 Re: IBEBlock: ошибки, вопросы, предложения - сюда  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12343
Почему для этого кода
EXECUTE IBEBLOCK
AS
BEGIN
  IF (
    FALSE AND
    ibec_MessageDlg('Test', __mtWarning, __mbOK) = __mrYes
  ) THEN
    ibec_ShowMessage('Nothing');
END; 
появляется сообщение Test? Или сокращенные булевские вычисления не реализованы?
3 ноя 20, 20:42    [22225983]     Ответить | Цитировать Сообщить модератору
 Re: IBEBlock: ошибки, вопросы, предложения - сюда  [new]
IBExpert
Member

Откуда: От верблюда
Сообщений: 3331
_Vasilisk_
Или сокращенные булевские вычисления не реализованы?


Именно так. Оптимизированы только некоторые функции типа ibec_coalesce.
4 ноя 20, 04:51    [22226097]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
Все форумы / IBExpert Ответить