我需要使用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程序。我也在我的程序中使用和不使用“暂停”测试它,但它没有任何区别。
我还没有找到解决这个问题的方法,所以有人可以帮助我吗?
答案 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)
> _>构建每个插入或更新语句。
很抱歉这个愚蠢的自制问题..