Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用脚本生成Firebird数据库时出现的问题_Sql_Database_Firebird_Firebird 3.0 - Fatal编程技术网

Sql 使用脚本生成Firebird数据库时出现的问题

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

我有一个脚本来为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 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
数据类型,所以您不必重新发明它!阅读:“必须重新编译”-为什么?伊布·马洛克?但是这里的伪代码只影响CSTRING
type vars,不是吗?那么,为时间戳释放它是可疑的,对吧。但是1。若作者使用64位Firebird,则32位udf肯定无法使用2。ib_util.dll是可移植的,可以保存情况,但我们不知道F_CUTTIME是如何编译的-它是否真的使用了ib_malloc。
F_CUTTIME是如何编译的-它是真的使用了ib_malloc,还是没有
-我认为这一点都不重要:这个函数中没有使用CSTRING