Genero BDL 数据类型(1)

 

数据类型

选择正确的数据类型有助于输入,存储和显示数据.

数据类型

描述

BIGINT

 8字节有符号整形

BOOLEAN

 布尔类型

BYTE

 二进制大数据(图片)

CHAR[(n)]

 固定长度的字符串

DATE

 简单日历日期类型

DATETIME q1 TO q2

 高精确日期和小时数据

DECIMAL[(P[,s])]

 高精度十进制小数

FLOAT[(P)]

 8字节十进制浮点

INTEGER

 4字节有符号整数

INTERVAL q1 TO q2

 高精度时间间隔

MONEY[(p[,s])]

 高精度十进制货币格式

SMALLFLOAT

 4字节十进制浮点

SMALLINT

 2字节有符号整形

STRING

 动态长度字符串

TINYINT

 1字节有符号整数

TEXT

 大型文本数据(纯文本)

VARCHAR[(n[,r])]

 可变长度字符串

 

BIGINT

BIGINT数据类型用来存储非常大的整形数字。

语法 BIGINT

用法

BIGINT变量存储基于8字节(64位)的有符号数据类型

数据的值范围从-9,223,372,036,854,775,807 到 +9,223,372,036,854,775,807.

BIGINT变量可以用整形数字初始化

 

MAIN
DEFINE i BIGINT
LET i = 9223372036854775600
DISPLAY i
END MAIN

当分配一个整形数字超过BIGINT的范围时,将会产生溢出错误 -1284。

BIGINT 变量在函数,模块,和全局变量中被初始化为0。

BYTE

BYTE类型存储任何二进制数据,比如图像或者声音。

语法 BYTE

用法:

一个BYTE 或者 TEXT 变量用来处理存储与文件或者内存的大型对象(LOB)。这种数据类型是复杂类型,不能像

 INTEGER 或 CHAR 基本类型一样使用。它被用来处理大量数据,和简单类型的语法不同。与简单数据类型不

同的是,在使用BYTE 和TEXT变量前,必须用LOCATE 指令支指出实际的存储位置。

BYTE和TEXT变量可以处理的最大数据理论上为2的31次方字节大小。但是实际大小受限于处理数据实际可用的

内存或者磁盘资源。

BYTE和TEXT变量在使用前必须用LOCATE指令初始化。LOCATE指令基本上定义了大数据对象必须存储的地方

(在命名文件中,在临时文件中,或在内存中)。这个指令将实际允许抓取LOB到内存或者文件,或者从内存

或文件中把LOB插入数据库。当存储在临时文件时(IN FILE),临时文件目录可以通过环境变量 DBTEMP定义。

DEFINE t TEXT
LET t = "aaaa" – 无效,没有分配
LOCATE t IN MEMORY
LET t = "aaaa" –有效,现在位于内存中

利用BYTE 和 TEXT 类型,可以插入、更新、抓取数据库中的大对象。本地数据库类型的使用依赖数据库服务器

类型。 在定义了大对象句柄存储(LOCATE)后,加载、分配它的值和在SQL语句中直接使用它,或者从数据库

大对象栏获取数据,和简单类型一样。

DEFINE t1, t2 TEXT
...
CREATE TABLE mytable ( id INT, data TEXT )
...
LOCATE t1 IN MEMORY
CALL t1.readFile("lob.4gl")
INSERT INTO mytable VALUES ( 1, t1 )
LOCATE t2 IN FILE
SELECT data INTO t2 FROM mytable WHERE id=1
...

BYTE和TEXT类型实现了 readFile() 和 writeFile() 方法据从文件读整个大对象数据和写整个大对象数据到文件。

这些方法可以和其他软件组件简单配合使用:

DEFINE t TEXT
LOCATE t IN MEMORY
CALL t.readFile("orig.txt")
CALL t.writeFile("copy.txt"

当初始化BYTE 或 TEXT 变量为NULL(初始化变量为NULL),假如变量分配为一个文件,这个文件会被裁剪(文

件大小将为0)。假如变量分配在内存,内存数据也会被裁剪。随后变量的使用(比如:FETCH INTO 或 LET 分配)

依然是可以的:

DEFINE b BYTE
LOCATE b IN FILE "picture.png"
INITIALIZE b TO NULL
-- 文件"picture.png" 现在为空。

分配给BYTE或TEXT变量的资源可以用FREE指令释放。一个FREE指令可以移除分配给LOB变量的(命名或临时)

文件。当分配在内存中时,FREE指令可释放内存。在释放了LOB变量的资源后,可以用LOCATE指令重新分配:

DEFINE b BYTE
LOCATE b IN FILE
CALL t.readFile("picture.png") -- ok
FREE b
CALL t.readFile("picture.png") – 无效,没有被分配
LOCATE b IN MEMORY
CALL t.readFile("picture.png") – ok

   重要:

       TEXT和BYTE是参考类型。这意味着分配两个变量(LET,传递一个变量作为函数参数,函数返回一个值)不会

复制值(仅复制句柄)。结果,修改从另外一个TEXT/BYTE变量赋值的TEXT/BYTE变量其实修改的是同一个LOB

数据。更有,分配给变量的存储(文件或内存)变为不能引用或者丢失:

DEFINE b1, b2 BYTE – 一样的文本,同样的行为
LOCATE b1 IN FILE "mydata" – 直接引用文件
LOCATE b2 IN MEMORY – 用内存代替文件
CALL b2.readFile("mydata") –读文件内容到内存
# FREE b2 – 在 LET之前释放内存
LET b2 = b1 – b2和b1一样引用文件
INITIALIZE b1 TO NULL – 裁剪引用的文件
DISPLAY IIF( b2 IS NULL, "b2 is null", "b2 is not null")
-- 显示b2 is null

在下面(无效)代码示例中,我们试着存储img BYTE 变量值到临时变量(tmp)中。典型的编程模式是在修改前

存储旧值。实际使用LET tmp=img 赋值不会像简单数据类型(STRING,VARCHAR,DECIMAL)一样复制LOB数据,

只是数据引用(比如句柄)会被复制:

-- 提示: 这是个无效的代码示例
DEFINE img, tmp BYTE
LOCATE img IN MEMORY
CALL img.readFile("picture1.png")
LOCATE tmp IN MEMORY
LET tmp = img – 和存储目前的数据不同,现在两个变量引用同一份数据

CALLimg.readFile("picture2.png")
LET img = tmp – 没有重新存储旧数据:仍是同一份数据

如果需要复制大对象,使用writeFile()/readFile()方法。

 

BOOLEAN

BOOLEAN 数据类型存储逻辑值,TRUE或FALSE。

语法 BOOLEAN

用法

布尔数据类型有两个可能的值:TRUE(整数1)和FALSE(整数0)。

这个数据类型的变量可以用来保存布尔表达式的结果:

DEFINE result BOOLEAN
LET result = ( length("abcdef") > 0 )

布尔变量典型的用法就是保存布尔表达式的结果:

FUNCTION checkOrderStatus( cid)
DEFINE oid INT, b BOOLEAN
LET b = ( isValid(oid) AND isStored(oid) )
IF NOT b THEN
ERROR "The order is not ready."
END IF
END FUNCTION

注意数据库供应商实现的SQL布尔类型和BDL BOOLEAN类型并不完全一致。比如,IBM Informix SQL 布尔类型

接受’t’ 和 ‘f’值,而BDL布尔类型仅可以接受0/FALSE 和1/TRUE 整形值。 你可以在SQL语句中使用布尔类型变量:

IBM Informix 或其他数据库驱动将会负责转换。同样注意TRUE/FALSE常量只是BDL语言常量:数据库SQL语法

可能不支持这些关键字,比如INSERT INTO mytable(key,bcol) VALUES (455,TRUE)。

 

CHAR(size)

CHAR数据类型是固定长度的字符串数据类型。

语法CHAR[ACTER] [ (size)]

1、size定义字符串的最大字节或者字符单位(依赖于语法字符长度)长度。

2、一个字符类型的最大长度是65534

3、如果size没有特别定义,它的默认长度是1.

用法

字符类型典型的用法是保存固定长度的字符串比如短编码(XB124),电话号码(650-23-2345),汽车号码。

CHAR和 CHARACTER 是相同的语法。

CHAR变量在函数,模块和全局变量中可以被初始化为NULL。

文本常量可以赋给字符串变量:

MAIN
DEFINE c CHAR(10)
LET c = "abcdef"
END MAIN

当赋值是非NULL值时,字符变量总是用空格填充:

MAIN
DEFINE c CHAR(10)
LET c = "abcdef"
DISPLAY "[", c ,"]" – 输出 [abcdef     ]
END MAIN

在比较算式中,字符串末尾的空格是没有意义的:

MAIN
DEFINE c CHAR(5)
LET c = "abc"
IF c == "abc" THEN -- 值为TRUE
DISPLAY "equals"
END IF
END MAIN

数字和日期-时间值可以直接赋给字符串变量:

MAIN
DEFINE c CHAR(50), da DATE, dec DECIMAL(10,2)
LET da = TODAY
LET dec = 345.12
LET c = da, " : ", dec
END MAIN

当把字符类型的变量插入到数据库字符类型的字段时,字段值会被用空格填充到字段长度。同样的,当从数据库字

段栏位获取值到字符变量时,程序变量会用空格填充到变量长度。

MAIN
DEFINE c CHAR(10)
DATABASE test1
CREATE TABLE table1 ( k INT, x CHAR(10) )
LET c = "abc"
INSERT INTO table1 VALUES ( 1, c )
SELECT x INTO c FROM table1 WHERE k = 1
DISPLAY "[", c ,"]" -- displays [abc        ]
END MAIN

在SQL语句中,CHAR值的比较运算在一个数据库和其他数据库是不同的。然而,大部分数据库引擎在比较CHAR值时,

忽略末尾的空格。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值