数据类型
选择正确的数据类型有助于输入,存储和显示数据.
数据类型 | 描述 |
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值时,
忽略末尾的空格。
转载请注明:赫非域 » BDL-FGL_BASE 数据类型(1)