Stored procedures 如何将存储过程的返回值用作列中的默认值?

Stored procedures 如何将存储过程的返回值用作列中的默认值?,stored-procedures,firebird,default-value,firebird-3.0,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 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程序一样调用我的程序。此外,在我的程序中,我测试了它是否有“挂起”,但没有区别

我还没有找到这个问题的解决方案,所以这里有人能帮我吗?

根据,因为Firebird 2.0为
当前时间指定精度应该可以工作。是否在
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
)按预期工作-当从insert语句中省略该列时,我得到了类似
16:44:05.7840
的值。因此,如果它在Firebird 3.0中确实不起作用(我没有安装它,因此无法测试),它是回归,请根据提交一份错误报告,因为Firebird 2.0指定当前时间的精度应该起作用。是否在
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
)按预期工作-当从insert语句中省略该列时,我得到了类似
16:44:05.7840
的值。因此,如果它在Firebird 3.0中确实不起作用(我没有安装它,因此无法测试),它是回归,请在中提交错误报告。

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

default
-子句只允许文本值和上下文变量,如
current\u time
。如果要指定自己的默认值,则需要创建:

创建触发器用户\u BIU
在“用户”上插入或更新之前
作为
开始
如果(new.newon为null),则
开始
new.newon=trim(子字符串(当前时间戳从12到12));
结束
结束

这与默认值的效果稍有不同,因为即使显式设置为
null
,也会指定一个值。但是,由于我无法重现问题,我不希望这能解决您的问题。

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

default
-子句只允许文本值和上下文变量,如
current\u time
。如果要指定自己的默认值,则需要创建:

创建触发器用户\u BIU
在“用户”上插入或更新之前
作为
开始
如果(new.newon为null),则
开始
new.newon=trim(子字符串(当前时间戳从12到12));
结束
结束

这与默认值的效果稍有不同,因为即使显式设置为
null
,也会指定一个值。然而,由于我无法重现这个问题,我不希望这能解决您的问题。

好的,谢谢大家。我们发现了问题。。 firebird库由我的领导在2005年编写,它使用
CURRENT\u TIME
而不是
CURRENT\u TIME(3)
>构建每个插入或更新语句


真为那个愚蠢的自作自受的问题感到抱歉

好的,谢谢大家。我们发现了问题。。 firebird库由我的领导在2005年编写,它使用
CURRENT\u TIME
而不是
CURRENT\u TIME(3)
>构建每个插入或更新语句


真为那个愚蠢的自作自受的问题感到抱歉

那是不可能的。但我想知道,如果您想要日期和时间,为什么
LASTCHANGEON
不是时间戳列time@a_horse_with_no_name由于我们的课程结构,我们确实需要将日期和时间彼此分开,我不需要对此进行任何更改:xYou可以创建一个具有适当时间戳类型的列和两个计算列,将日期和时间信息提取到varchar列中。@a_horse_,没有名称,我想这可能会有所帮助,出于好奇谢谢你:为什么你要在char列而不是time列中节省时间?那是不可能的。但我想知道,如果您想要日期和时间,为什么
LASTCHANGEON
不是时间戳列time@a_horse_with_no_name由于我们的课程结构,我们确实需要将日期和时间彼此分开,我不需要对此做任何更改:xYou可以创建一个具有适当时间戳类型的列和两个计算列,将日期和时间信息提取到varchar列中。@a_horse_,带有_no_n