Sql 使用脚本生成Firebird数据库时出现的问题
我有一个脚本来为Firebird生成数据库结构并使用ISQL 由于日期Sql 使用脚本生成Firebird数据库时出现的问题,sql,database,firebird,firebird-3.0,Sql,Database,Firebird,Firebird 3.0,我有一个脚本来为Firebird生成数据库结构并使用ISQL 由于日期时间戳的类型,我使用的一些语句存在问题,例如外部函数: DECLARE EXTERNAL FUNCTION F_CUTTIME TIMESTAMP RETURNS TIMESTAMP FREE_IT ENTRY_POINT 'fn_cuttime' MODULE_NAME 'SISUDFIB'; 或者,例如,创建域时: CREATE DOMAIN D_DATE AS TIMESTAMP CHECK ((VALUE IS NU
时间戳的类型,我使用的一些语句存在问题,例如外部函数:
DECLARE EXTERNAL FUNCTION F_CUTTIME
TIMESTAMP
RETURNS TIMESTAMP FREE_IT
ENTRY_POINT 'fn_cuttime' MODULE_NAME 'SISUDFIB';
或者,例如,创建域时:
CREATE DOMAIN D_DATE AS TIMESTAMP
CHECK ((VALUE IS NULL) OR (VALUE = F_CUTTIME (VALUE)));
它给了我错误,从我看到的是类型时间戳
当我创建数据库的结构时,我生成了一个脚本,在外部函数的声明中出现了错误,但只有在使用TIMESTAMP的声明中,我才知道这个错误:
Stament failed, sqlstate = 39000
invalid request BLR offset 13
-function F_CUTTIME is not defined
我得到了时间戳所在的函数,其余的函数都能很好地生成我
如何创建我的脚本,使我不会在使用ISQL的Firebird中出错
我举一个例子:
SET SQL DIALECT 1;
CREATE DATABASE 'C: \ SISCONIBSCT.fdb' PAGE_SIZE 8192
USER 'SISCONIB' PASSWORD 'telecoman'
DEFAULT CHARACTER SET WIN1252;
/ * External Function declarations * /
DECLARE EXTERNAL FUNCTION F_CUTTIME
TIMESTAMP
RETURNS TIMESTAMP FREE_IT
ENTRY_POINT 'fn_cuttime' MODULE_NAME 'SISUDFIB';
/ * Domain definitions * /
CREATE DOMAIN D_BOOLEAN AS CHAR (1)
DEFAULT 'T'
CHECK (VALUE IN ('F', 'T')) NOT NULL;
CREATE DOMAIN D_DATE AS TIMESTAMP
CHECK ((VALUE IS NULL) OR (VALUE = F_CUTTIME (VALUE)));
CREATE DOMAIN D_DATETIME AS TIMESTAMP;
CREATE DOMAIN D_TIME AS TIMESTAMP
CHECK ((VALUE IS NULL) OR (F_CUTTIME (VALUE) = F_TIMEBASE ()));
CREATE TABLE SISFASE
(
CODSCT SMALLINT NOT NULL,
CODEST CHAR (2) NOT NULL,
CODPRO SMALLINT NOT NULL,
CODFAS SMALLINT NOT NULL,
DESCREAS VARCHAR (30) COLLATE PXW_SPAN,
PERESP D_TIME,
CODPLA CHAR (1) NOT NULL,
CODETG SMALLINT NOT NULL,
PRIMARY KEY (CODSCT, CODEST, CODPRO, CODFAS)
);
在外部函数的声明中同时给出错误
在域中,在创建表时,始终
给我日期上的错误
不理解这个问题。关于函数F_CUTTIME-如果它是从InterBase 5中获取的,我的意思是,它是为InterBase 5编译的,那么它必须为任何新的InterBase或Firebird重新编译。如果无法重新编译,则唯一的方法是转到方言3,并使用基本Firebird函数和CAST处理单独的日期和时间变量。请指定您收到的完整错误消息,不要让我们猜测。您说您不仅在域方面有问题,而且在函数方面也有问题,那么函数声明语句运行时是否有错误?//可能在模式发生重大更改后,例如在创建所有UDF后,您应该提交commit
。我不认为iSQL在编写脚本时会自动提交DDL语句。请用您在声明外部函数
上得到的错误编辑您的问题,并发布此fn_cuttime
的标题(或完整代码),因为它似乎不是一个公开可用的库。您在创建域时遇到的错误可能是一个后续错误。另外,为什么要在FIREBIRD已经提供内置日期数据类型的情况下,在时间戳之外创建另一个D_DATE
域<代码>设置SQL方言1代码>什么???这就是20世纪90年代的遗留语言Interbase 5.x。它甚至早于Firebird的第一个测试版!为什么不使用普通方言3???方言3中已经有了DATE
数据类型,所以您不必重新发明它!阅读:“必须重新编译”-为什么?伊布·马洛克?但是这里的伪代码只影响CSTRINGtype vars,不是吗?那么,为时间戳释放它是可疑的,对吧。但是1。若作者使用64位Firebird,则32位udf肯定无法使用2。ib_util.dll是可移植的,可以保存情况,但我们不知道F_CUTTIME是如何编译的-它是否真的使用了ib_malloc。F_CUTTIME是如何编译的-它是真的使用了ib_malloc,还是没有
-我认为这一点都不重要:这个函数中没有使用CSTRING