如何使用存储过程中的 return 值作为列中的默认值?
How to use the return value from a stored procedure as a default value in a column?
我需要使用 firebird 3.0 存储过程中的 return 值作为多列中的默认值。
我的程序:
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'。糟糕的是我们需要数据库中的毫秒数。我自己的程序给了我们毫秒数,但我们不能在 table.
中使用它
table的例子:
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)
);
当 table 像这样创建时,它调用 firebird 自己的过程,只给我们 0000 毫秒。我试图像 firebird 程序一样调用我的程序。我还在我的程序中使用和不使用 "suspend" 进行了测试,但没有区别。
我还没有找到解决这个问题的方法,所以有人可以帮我吗?
根据 documentation,因为 Firebird 2.0 指定 CURRENT_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 进行测试,默认值(即 LASTCHANGEON CHAR(13) DEFAULT Current_Time(3) NOT NULL
之类的字段定义)按预期工作 - 我在省略时为列获得了 16:44:05.7840
之类的值它来自插入语句。所以如果它确实在 Firebird 3.0 中不起作用(我没有安装它所以无法测试)它是回归,请在 tracker.
中提交一个 bug-report
我已经针对 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
,它也会分配一个值。但是,由于我无法重现问题,因此我不希望这能解决您的问题。
好的,谢谢大家。我们已经找到问题了..
firebird 库是我的领导在 2005 年编写的,它使用 CURRENT_TIME
而不是 CURRENT_TIME(3)
>_>
构建每个插入或 update-statement
很抱歉这个愚蠢的自制问题..
我需要使用 firebird 3.0 存储过程中的 return 值作为多列中的默认值。
我的程序:
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'。糟糕的是我们需要数据库中的毫秒数。我自己的程序给了我们毫秒数,但我们不能在 table.
中使用它table的例子:
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)
);
当 table 像这样创建时,它调用 firebird 自己的过程,只给我们 0000 毫秒。我试图像 firebird 程序一样调用我的程序。我还在我的程序中使用和不使用 "suspend" 进行了测试,但没有区别。
我还没有找到解决这个问题的方法,所以有人可以帮我吗?
根据 documentation,因为 Firebird 2.0 指定 CURRENT_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 进行测试,默认值(即 LASTCHANGEON CHAR(13) DEFAULT Current_Time(3) NOT NULL
之类的字段定义)按预期工作 - 我在省略时为列获得了 16:44:05.7840
之类的值它来自插入语句。所以如果它确实在 Firebird 3.0 中不起作用(我没有安装它所以无法测试)它是回归,请在 tracker.
我已经针对 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
,它也会分配一个值。但是,由于我无法重现问题,因此我不希望这能解决您的问题。
好的,谢谢大家。我们已经找到问题了..
firebird 库是我的领导在 2005 年编写的,它使用 CURRENT_TIME
而不是 CURRENT_TIME(3)
>_>
很抱歉这个愚蠢的自制问题..