使用脚本生成Firebird数据库的问题

时间:2017-09-06 12:34:44

标签: sql database firebird firebird-3.0

我有一个脚本来为Firebird生成数据库结构并使用ISQL

由于日期类型TIMESTAMP,我使用的某些语句存在问题,例如使用外部函数:

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

当我创建数据库的结构时,我生成一个脚本,我在外部函数的声明中得到错误,但只有在我使用TIMESTAMP的那些时才告诉我这个错误:

Stament failed, sqlstate = 39000
 invalid request BLR offset 13 
-function F_CUTTIME is not defined

我进入了TIMESTAMP所在的函数,其余的函数生成了我。

如何创建我的脚本以便我不会在使用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)
);

在外部函数的声明中给出错误 就像在域中创建表一样 在日期中给我错误。

不明白这个问题。

1 个答案:

答案 0 :(得分:1)

关于函数F_CUTTIME - 如果是从InterBase 5中获取的,我的意思是,它是为InterBase 5编译的,那么它必须为任何新的InterBase或Firebird重新编译。如果它无法重新编译,那么唯一的方法是移动到Dialect 3,并使用基本的Firebird函数和CAST来处理单独的DATE和TIME变量。