如何使用存储过程的返回值作为列中的默认值?

时间:2017-02-01 11:51:33

标签: stored-procedures firebird default-value firebird-3.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自己的过程,它只给我们0000毫秒。我试着把我的程序称为firebird程序。我也在我的程序中使用和不使用“暂停”测试它,但它没有任何区别。

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

3 个答案:

答案 0 :(得分:1)

根据documentation,因为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 insert语句。因此,如果它确实在Firebird 3.0中不起作用(我没有安装它,因此无法测试)它是回归的,请在tracker中提交错误报告。

答案 1 :(得分:1)

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

default - 子句仅允许文字值和上下文变量,如current_time。如果要分配自己的默认值,则需要创建trigger

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,也会分配一个值。但是由于我无法重现这个问题,我不希望这会解决你的问题。

答案 2 :(得分:0)

好的,谢谢你们所有人。我们发现了问题.. 我的领导者在2005年编写的firebird库使用CURRENT_TIME而不是CURRENT_TIME(3)> _>构建每个插入或更新语句。

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