DM8存储过程数据类型总结
一. 程序的数据类型与操作符
- 常用数据类型
1.1数值型数据类型
定点:numeric,decimal,两者功能相似
NUMERIC 数据类型用于存储零、正负定点数。其中:精度是一个无符号整数,定义了总的数字数,精度范围是 1~38,标度定义了小数点右边的数字位数,定义时如省略精度,则缺省是 16。如省略标度,则缺省为 0。一个数的标度不应大于其精度。
例如:NUMERIC(4,1)定义了小数点前面 3 位和小数点后面 1 位,共 4 位的数字,范围在-999.9 到 999.9。所有 NUMERIC 数据类型,如果其值超过精度,达梦数据库返回一个出错信息,如果超过标度,则多余的位截断。
浮点:float,double
FLOAT 是带二进制精度的浮点数,精度最大不超过 53,如省略精度,则二进制精度为 53,十进制精度为 15。取值范围为-1.7E+308~1.7E+308。
Double同 FLOAT 相似,精度最大不超过 53。
整型:int,bigint,tinyint,smallint
Int用于存储有符号整数,精度为 10,标度为 0。取值范围为:-2147483648(-231)~+2147483647(231-1)。
Bigint用于存储有符号整数,精度为 19,标度为 0。取值范围为:-9223372036854775808(-263)~+9223372036854775807(263-1)。
Tinyint用于存储有符号整数,精度为 3,标度为 0。取值范围为:-128~+127。
Smallint用于存储有符号整数,精度为 5,标度为 0。取值范围为:-32768(-2^15)~ +32767(2^15-1)。
1.2字符型数据类型
定长字符:char
定长字符串,最大长度由数据库页面大小决定,长度不足时,自动填充空格。
变长字符:varchar
可变长字符串,最大长度由数据库页面大小决定。
1.3多媒体数据类型
文本类型:text,longvarchar
变长字符串类型,其字符串的长度最大为 100G-1,可用于存储长的文本串。
图像类型:image,longvarbinary
可用于存储多媒体信息中的图像类型。图像由不定长的象素点阵组成,长度最大为 100G-1 字节。该类型除了存储图像数据之外,还可用于存储任何其它二进制数据。
大对象:blob,clob
BLOB 类型用于指明变长的二进制大对象,长度最大为 100G-1 字节。
CLOB 类型用于指明变长的字符串,长度最大为 100G-1 字节。
1.4日期时间数据类型
一般日期类型:date,time,datetime
DATE 类型包括年、月、日信息,定义了’-4712-01-01’和’9999-12-31’之间任何一个有效的格里高利日期。
TIME 类型包括时、分、秒信息,定义了一个在’00:00:00.000000’和’23:59:59.999999’之间的有效时间。TIME 类型的小数秒精度规定了秒字段中小数点后面的位数,取值范围为 0~6,如果未定义,缺省精度为 0。
DATETIME 类型包括年、月、日、时、分、秒信息,定义了一个在’-4712-01-0100:00:00.000000’和’9999-12-31 23:59:59.999999’之间的有效格里高利日期时间。小数秒精度规定了秒字段中小数点后面的位数,取值范围为 0~6,如果未定义,缺省精度为 6。
时区数据类型: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 值,其定义是在 TIMESTAMP 类型的后面加上时区信息。时区部分的实质是 INTERVAL HOUR TO MINUTE 类型,取值范围:-12:59 与 +14:00 之间。例如:’2009-10-11 19:03:05.0000 -02:10’。
TIMESTAMP WITH LOCAL TIME ZONE描述一个本地时区的 TIMESTAMP 值,能够将标准时区类型 TIMESTAMP WITH TIME ZONE 类型转化为本地时区类型,如果插入的值没有指定时区,则默认为本地时区。
时间间隔数据类型:DM 支持两类十三种时间间隔类型:两类是年-月间隔类和日-时间隔类,它们通过时间间隔限定符区分,前者结合了日期字段年和月,后者结合了时间字段日、时、分、秒。由时间间隔数据类型所描述的值总是有符号的。
1.5绑定数据类型
在许多时候,DMSQL 程序变量被用来处理存储在数据库表中的数据。这种情况下,变量应该拥有与表列相同的类型。例如表 T(ID
INT, NAME VARCHAR(30))中字段 NAME 类型为 VARCHAR(30)。对应地在 DMSQL 程序中,我们可以声明一个变量:
DECLARE
V_NAME VARCHAR(30);
但是如果 T 中的 NAME 字段定义发生了变化,比如变为 VARCHAR(100)。那么存储过程中的变量 V_NAME 也要相应修改为:
DECLARE
V_NAME VARCHAR(100);
如果用户应用中有很多的变量以及 DMSQL 程序代码,这种处理可能是十分耗时和容易出错的。
为了解决上述问题,DMSQL 程序提供了 %TYPE 类型。%TYPE 可以将变量同表列的类型进行绑定。例如:
DECLARE
V_NAME T.NAME%TYPE;
通过使用 %TYPE,V_NAME 将拥有 T 表的 NAME 列所拥有的类型。如果表 T 的 NAME 列类型定义发生变化,V_NAME 的类型也随之自动发生变化,而不需要用户手动修改。 - 程序的定义调用
2.1存储过程
DBA 或具有 CREATE PROCEDURE 权限的用户可以使用上述语法新创建一个存储过程。OR REPLACE 选项的作用是当同名的存储过程存在时,首先将其删除,再创建新的存储过程。IF NOT EXISTS 选项的作用是当同名的存储过程存在时,忽略本次存储过程创建操作。当同时指定 OR REPLACE 和 IF NOT EXISTS 选项时,按照 OR REPLACE 选项的策略执行。
2.2存储函数
存储函数与存储过程在结构和功能上十分相似,主要的差异在于:
• 存储过程没有返回值,调用者只能通过访问 OUT 或 IN
OUT 参数来获得执行结果,而存储函数有返回值,它把执行结果直接返回给调用者;
• 存储过程中可以没有返回语句,而存储函数必须通过返回语句结束;
• 不能在存储过程的返回语句中带表达式,而存储函数必须带表达式;
• 存储过程不能出现在一个表达式中,而存储函数可以出现在表达式中。
2.3参数
存储模块及模块中定义的子模块都可以带参数,用来给模块传送数据及向外界返回数据。在存储过程或存储函数中定义一个参数时,必须说明名称、参数模式和数据类型。三种可能的参数模式是:IN(缺省模式)、OUT 和 IN OUT,意义分别为:
• IN:输入参数,用来将数据传送给模块;
• OUT:输出参数,用来从模块返回数据到进行调用的模块;
• IN OUT:既作为输入参数,也作为输出参数。