一、达梦数据库数据类型
DMSQL 程序支持所有的
DM SQL
数据类型,包括:精确数值数据类型、近似数值数据
类型、字符数据类型、多媒体数据类型、一般日期时间数据类型、时间间隔数据类型。 此外,为了进一步提高 DMSQL
程序的程序设计属性,
DMSQL
程序还扩展支持了%TYPE
%ROWTYPE
、记录类型、数组类型、集合类型和类类型,用户还可以定义自己的 子类型。
二、 常规数据类型
数值数据类型:
NUMERIC
类型
语法如下:
NUMERIC[(
精度
[,
标度
])]
功能:
NUMERIC 数据类型用于存储零、正负定点数。其中:精度是一个无符号整数,定义了
总的数字数,精度范围是
1~38
;标度定义了小数点右边的数字位数。定义时如果省略精度,
则缺省为
16
;如果省略标度,则缺省为
0
。一个数值的标度不应大于其精度。
例如:NUMERIC(4,1)
定义了小数点前面
3
位和小数点后面
1
位,共
4
位的数字,范围
在
-999.9
到
999.9
。所有
NUMERIC
数据类型,如果其值超过精度,达梦数据库返回一个
出错信息,如果超过标度,则多余的位截断。
如果不指定精度和标度,缺省精度为
38
。
注意,
NUMBER 类型,DECIMAL/DEC 类型 与
NUMERIC
类型相同。
BIT
类型
语法如下:
BIT
功能:
BIT 类型用于存储整数数据
1
、
0
或
NULL
,可以用来支持
ODBC
和
JDBC
的布尔数据
类型。
DM
的
BIT
类型与
SQL SERVER2000
的
BIT
数据类型相似。
注意,PLS_INTEGER
类型
BIGINT
类型
语法如下:
BIGINT
功能:
用于存储有符号整数,精度为 19
, 标 度 为
0
。 取 值 范 围 为 :
-
9223372036854775808(-2^63)~+9223372036854775807(2^63-1)
。
TINYINT
类型
语法如下:
TINYINT
功能:
用于存储有符号整数,精度为 3,标度为
0
。取值范围为:
-128~+127
。
BYTE
类型
语法如下:
BYTE
功能:
与 TINYINT
类型相似,精度为
3
,标度为
0
。
SMALLINT
类型
语法如下:
SMALLINT
功能:
用 于 存 储 有 符 号 整 数 , 精 度 为 5
, 标 度 为
0
。 取 值 范 围 为 :
-32768(-2
15
)~
+32767(2
15
-1)
BINARY
类型
语法如下:
BINARY[(长度
)]
功能:
BINARY 数据类型指定定长二进制数据。缺省长度为
1
个字节,最大长度由数据库页面
大小决定
BINARY
常量以
0x
开始,后跟数据的十六进制表示,例如:
0x2A3B4058
。
FLOAT
类型
语法如下:
FLOAT[(精度
)]
功能:
FLOAT 是带二进制精度的浮点数,精度最大不超过
53
,如省略精度,则二进制精度为
53
,十进制精度为
15
。取值范围为
-1.7E+308~1.7E+308
。
DOUBLE
类型
语法如下:
DOUBLE[(精度
)]
功能:
同 FLOAT
类型相似,精度最大不超过
53
。
字符数据类型:
CHAR/CHARACTER
类型
语法如下:
CHAR[(长度
)]
CHARACTER[(长度
)]
功能:
定长字符串,最大长度由数据库页面大小决定,长度不足时,自动填充空格。
VARCHAR
类型
语法如下:
VARCHAR[(长度
)]
功能:
可变长字符串,最大长度由数据库页面大小决定
功能:CHAR
数据类型指定定长字符串。在基表中,定义
CHAR
类型的列时,可以指
定一个不超过
32767
的正整数作为字节长度,例如:
CHAR(100)
。如果未指定长度,缺省
为
1
。
CHAR 类型列的最大存储长度由数据库页面大小决定。但是,在表达式计算中,该类型的长度上限不受页面大小限制,为 32767
。
功能:VARCHAR
数据类型指定变长字符串,用法类似
CHAR
数据类型,可以指定一
个不超过
32767
的正整数作为字节或字符长度,例如:
VARCHAR (100)
指定
100
字节长
度;
VARCHAR(100 CHAR)
指定
100
字符长度。如果未指定长度,缺省为
8188
字节。
在基表中,当没有指定 USING LONG ROW
存储选项时,插入
VARCHAR
数据类型的
实际最大存储长度由数据库页面大小决定
;如果指定了
USING LONG ROW 存储选项,则插入
VARCHAR
数据类型的长度不受数据库页面大小限制。
VARCHAR 类型在表达式计算中的长度上限不受页面大小限制,为
32767
。
CHAR 同
VARCHAR
的区别在于前者长度不足时,系统自动填充空格,而后者只占用
实际的字节空间。另外,实际插入表中的列长度要受到记录长度的约束,每条记录总长度不
能大于页面大小的一半。
一般日期时间数据类型:
DATE
类型
语法如下:
DATE
功能:
DATE 类型包括年、月、日信息,定义了
'-4712-01-01'
和
'9999-12-31'
之间任何一个有
效的格里高利日期。
TIME
类型
语法如下:
TIME[(小数秒精度
)]
功能:
TIME 类型包括时、分、秒信息,定义了一个在 '00:00:00.000000' 和 '23:59:59.999999'之间的有效时间。 TIME 类型的小数秒精度规定了秒字段中小数点后面的 位数,取值范围为 0~6 ,如果未定义,缺省精度为 0。
TIMESTAMP/DATETIME
类型
语法如下:
TIMESTAMP[(小数秒精度
)]
DATETIME[(小数秒精度
)]
功能:
TIMESTAMP/DATETIME 类型包括年、月、日、时、分、秒信息,定义了一个在
'-4712-
01-01 00:00:00.000000'
和
'9999-12-31 23:59:59.999999'
之间的有效格里高利日期时间。
小数秒精度规定了秒字段中小数点后面的位数,取值范围为 0~6,如果未定义,缺省精度为 6 。
时区数据类型:
TIME WITH TIME ZONE
类型
语法如下:
TIME[
(
小数秒精度
)
]
WITH TIME ZONE
功能:
描述一个带时区的 TIME
值,其定义是在
TIME
类型的后面加上时区信息。时区部分的
实质是
INTERVAL HOUR TO MINUTE
类型,取值范围:
-12:59
与
+14:00
之间。例如:
TIME '09:10:21 +8:00'
。
TIMESTAMP WITH TIME ZONE
类型
语法如下:
TIMESTAMP[
(
小数秒精度
)
]
WITH TIME ZONE
功能:
描述一个带时区的 TIMESTAMP
值,其定义是在
TIMESTAMP
类型的后面加上时区信息。
时区部分的实质是
INTERVAL HOUR TO MINUTE
类型,取值范围:
-12:59
与
+14:00
之间。
例如:
’2009-10-11 19:03:05.0000 -02:10’
。
BOOL/BOOLEAN
数据类型
语法如下:
BOOL
BOOLEAN
功能:
布尔数据类型:TRUE
和
FALSE
。
DMSQL
程序的布尔类型和
INT
类型可以相互转化。如
果变量或方法返回的类型是布尔类型,则返回值为
0
或
1
。
TRUE
和非
0
值的返回值为
1
,
FALSE
和
0
值返回为
0
。
三、一些实操的sql
定义了一些类型,包括 NUMERIC,BIGINT
,FLOAT
类型 将这些类型的对象分别赋值,然后输出在终端当中
DECLARE
numericValue NUMERIC(10, 2); //小数类型,小数点前最多8位,小数点后最多两位
bigintValue BIGINT;
floatValue FLOAT;
BEGIN
SET numericValue = 12345678.45;
SET bigintValue = 1000000000;
SET floatValue = 3.14;
print(numericValue); //print函数输出值
print(bigintValue);
print(bigintValue);
END;
这段sql代码是用来定义个人信息,并根据年龄判断相关信息的:
DECLARE部分定义了4个变量:
name:名 VARCHAR(50) age:年龄 INT gender:性别 CHAR(1) message:相关信息 VARCHAR(100)
BEGIN开始执行主体语句: 设置name, age, gender变量的值
IF-ELSE语句块判断age>=18后设置message变量的值:
若age>=18,message设置为'Adult' 否则message设置为'Minor'
print语句输出变量的值,最终输出个人信息和相关结果: 名字,年龄,性别,根据年龄判断的信息("Adult"或"Minor")
DECLARE
name VARCHAR(50);
age INT;
gender CHAR(1);
message VARCHAR(100);
BEGIN
SET name = 'John Smith';
SET age = 30;
SET gender = 'M';
IF age >= 18
BEGIN
SET message = 'Adult';
END
ELSE
BEGIN
SET message = 'Minor';
END;
print('名字:'||name);
print('年龄:'||age);
print('性别:'||gender);
print('相关信息:'||message);
END;
结果如图:
以下这段PL/SQL代码用来判断当前时间是否晚于GMT+8时区的指定时间:
DECLARE 引入两个变量:
v_gmt8,类型为TIMESTAMP WITH TIME ZONE,用于存储GMT+8时区的指定时间 is_gmt8_or_greater,类型为BOOL,用于存储当前时间是否晚于v_gmt8的判断结果 第一行SELECT语句将'2020-01-01 08:00:00 +8:00'(GMT+8时区)赋值给v_gmt8
第二行SELECT语句使用CASE WHEN判断 v_gmt8是否小于CURRENT_TIMESTAMP,结果赋值给is_gmt8_or_greater
判断is_gmt8_or_greater的值,如果为TRUE:
执行BEGIN内的print语句,输出v_gmt8+"是更小于当前时间"的结果 如果为FALSE:
执行else块内的print语句,输出v_gmt8+"是更大于当前时间"的结果
DECLARE
v_gmt8 TIMESTAMP WITH TIME ZONE;
is_gmt8_or_greater BOOL;
BEGIN
SELECT TIMESTAMP '2020-01-01 08:00:00 +8:00' INTO v_gmt8;
SELECT
CASE
WHEN v_gmt8 < CURRENT_TIMESTAMP THEN true
ELSE false
END INTO is_gmt8_or_greater
FROM DUAL;
if is_gmt8_or_greater
BEGIN
print(v_gmt8 || ' is smaller than current timestamp:'||CURRENT_TIMESTAMP );
END
else
begin
print(v_gmt8 || ' is bigger than current timestamp:' ||CURRENT_TIMESTAMP);
end;
END;
/
结果如图所示: