0

我需要使用 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-own 过程,它只给我们 0000 毫秒。我试图将我的程序称为 firebird 程序。此外,我在我的程序中使用和不使用“暂停”进行了测试,但这没有区别。

我还没有找到解决这个问题的方法,所以有人可以在这里帮助我吗?

4

3 回答 3

1

根据文档,由于指定精度的 Firebird 2.0CURRENT_TIME应该可以工作。DEFAULT会不会是在从句中使用的时候有bug ?我现在无法访问 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 进行测试,并且默认值(即字段定义 like )按预期工作 -从插入语句中省略列时,LASTCHANGEON CHAR(13) DEFAULT Current_Time(3) NOT NULL我得到了类似列的值。16:44:05.7840所以如果它确实在 Firebird 3.0 中不起作用(我没有安装它所以无法测试)它是回归,请在tracker中提交错误报告。

于 2017-02-01T12:41:08.773 回答
1

我已经针对 Firebird 3 对其进行了测试,但未能重现该问题。您可能需要仔细检查插入值的方式(例如检查您自己没有分配那个时间)。您也可以尝试删除默认设置并重新设置。

columndefault子句只允许文字值和上下文变量,如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。但是,由于我无法重现该问题,因此我不希望这能解决您的问题。

于 2017-02-01T19:53:53.117 回答
0

好的,谢谢大家。我们找到了问题.. 由我的领导在 2005 年编写的 firebird 库使用CURRENT_TIME而不是CURRENT_TIME(3)>_>构建每个插入或更新语句

很抱歉那个愚蠢的自制问题..

于 2017-02-02T16:50:10.357 回答