Как использовать возвращаемое значение из хранимой процедуры в качестве значения по умолчанию в столбце?

Мне нужно использовать возвращаемое значение из хранимой процедуры в firebird 3.0 в качестве значения по умолчанию в нескольких столбцах.

Моя процедура:

CREATE OR ALTER PROCEDURE CURRENTTIME 
returns (
    stime char(12))
as
begin
    sTime = (SELECT trim(Substring(CURRENT_TIMESTAMP FROM 12 FOR 12)) from RDB$
end

Итак, мы должны заполнить текущее время в некоторых конкретных столбцах с именами «NewOn» и «LastChangeOn». Я нашел процедуру по умолчанию от самой firebird под названием Current_Time, но миллисекунды всегда равны «0000», например. «12:30:10.0000». Плохо, что нам нужны миллисекунды в нашей базе данных. Моя собственная процедура дает нам миллисекунды, но мы не можем использовать ее в нашей таблице.

Пример таблицы:

CREATE TABLE USER (
    FIRSTNAME         CHAR(30),
    LASTNAME          CHAR(50),
    IDENT             CHAR(40) NOT NULL,
    NEWAT             DATE DEFAULT Current_Date NOT NULL,
    NEWON             CHAR(13) DEFAULT Current_Time(3) NOT NULL,
    NEWFROM           CHAR(25),
    LASTCHANGEAT      DATE DEFAULT Current_Date NOT NULL,
    LASTCHANGEON      CHAR(13) DEFAULT Current_Time(3) NOT NULL,
    LASTCHANGEFROM    CHAR(25)
);

Когда таблица создается таким образом, она вызывает собственную процедуру firebird, которая дает нам только 0000 миллисекунд. Я попытался назвать свою процедуру как процедуру firebird. Также я тестировал его с «приостановкой» и без нее в своей процедуре, но это не имеет значения.

Я еще не нашел решения этой проблемы, так что может ли кто-нибудь помочь мне здесь?


person Aoki.Miku    schedule 01.02.2017    source источник
comment
Это невозможно. Но мне интересно, почему LASTCHANGEON не является столбцом метки времени, если вам нужна дата и время   -  person a_horse_with_no_name    schedule 01.02.2017
comment
@a_horse_with_no_name из-за структуры наших программ нам нужно, чтобы дата и время были отделены друг от друга, и я не могу что-то изменить в этом :x   -  person Aoki.Miku    schedule 01.02.2017
comment
Вы можете создать столбец с правильным типом метки времени и два вычисляемых столбца, которые извлекают информацию о дате и времени в столбцы varchar.   -  person a_horse_with_no_name    schedule 01.02.2017
comment
@a_horse_with_no_name Думаю, это может помочь, спасибо   -  person Aoki.Miku    schedule 01.02.2017
comment
Из любопытства: почему вы экономите время в столбце символов, а не в столбце времени?   -  person Mark Rotteveel    schedule 01.02.2017
comment
Я проверил это с Firebird 3, и все работает нормально, если столбец не указан во вставке, то значение по умолчанию содержит миллисекунды. Возможно, вы захотите показать код, используемый для вставки значений, потому что это звучит так, как будто вы на самом деле вставляете значение самостоятельно, а не полагаетесь на значение по умолчанию.   -  person Mark Rotteveel    schedule 01.02.2017


Ответы (3)


Я протестировал его на Firebird 3, но не смог воспроизвести проблему. Возможно, вы захотите тщательно проверить, как вы вставляете значения (например, убедитесь, что вы сами не назначаете это время). Вы также можете попробовать сбросить значение по умолчанию и установить его снова.

Предложение столбца default допускает только литеральные значения и переменные контекста, такие как current_time. Если вы хотите назначить собственное значение по умолчанию, вам необходимо создать триггер:

create trigger user_BIU 
   before insert or update on "USER"
as
begin
  if (new.newon is null) then
  begin
     new.newon = trim(Substring(CURRENT_TIMESTAMP FROM 12 FOR 12));
  end
end

Это имеет несколько иной эффект, чем значение по умолчанию, так как это присвоит значение, даже если явно установлено значение null. Однако, поскольку я не смог воспроизвести проблему, я не ожидаю, что это решит вашу проблему.

person Mark Rotteveel    schedule 01.02.2017

Согласно документации, начиная с Firebird 2.0 указание точности для CURRENT_TIME должно работать. Может ли быть ошибка при использовании в предложении DEFAULT? У меня сейчас нет доступа к Firebird, чтобы протестировать его... в любом случае, когда вам нужно установить значения по умолчанию, которые слишком сложны для обычного предложения DEFAULT, вы можете использовать триггер, т.е.

CREATE TRIGGER USER_Defaults
ACTIVE BEFORE INSERT OR UPDATE
AS
BEGIN
  new.LASTCHANGEON = CAST(CURRENT_TIME(3) AS CHAR(13));
END

ИЗМЕНИТЬ

Теперь у меня была возможность протестировать Firebird 2.5.1, и значение по умолчанию (т. е. определение поля, такое как LASTCHANGEON CHAR(13) DEFAULT Current_Time(3) NOT NULL) работает, как и ожидалось - я получил значение, подобное 16:44:05.7840 для столбца, когда опускаю его из оператора вставки. Поэтому, если это действительно не работает в Firebird 3.0 (у меня он не установлен, поэтому я не могу проверить), это регресс, отправьте отчет об ошибке в трекер.

person ain    schedule 01.02.2017
comment
Да, я прочитал документацию об этом и попробовал это (в моем вопросе вы можете видеть, что я использовал эту точность с (3) за Current_Time), но это не помогло. Проблема в том, что мы используем эти столбцы в каждой таблице, поэтому у нас есть добавить еще один триггер на стол :( Но ладно, спасибо за ответ, я предложу и обсужу это решение с моим руководителем - person Aoki.Miku; 01.02.2017

Хорошо, спасибо всем вам. Мы нашли проблему. Библиотека firebird, написанная моим руководителем в 2005 году, создает каждый оператор вставки или обновления с CURRENT_TIME вместо CURRENT_TIME(3) >_>

Так что извините за эту глупую самодельную проблему ..

person Aoki.Miku    schedule 02.02.2017