BDL基础数据类型
字符类型
1、 CHAR 固定长度字符类型
2、 VARCHAR 可变长度字符类型
3、 STRING 动态可变长度字符类型
日期时间类型
4、 DATE 简单日期类型
5、 DATETIME 高精度日期时间类型
6、 INTERVAL 高精度时间类型
数字类型
7、 TINYINT 1字节有符号整型
8、 SMALLINT 2字节有符号整型
9、 INTERGER 4字节有符号整型
10、BIGINT 8字节有符号整型
11、SMALLFLOAT 4字节浮点类型
12、FLOAT 8字节浮点类型
13、DECIMAL 高精度数字类型
14、MONEY 高精度货币格式数字类型
二进制大数据类型
15、BYTE 大数据二进制数据类型
16、TEXT 大数据文本类型
逻辑类型
17、BOOLEAN 布尔类型TRUE/FALSE
LIKE参照数据库字段类型
18、LIKE 表示参照数据库对应字段的类型
(ex:DEFINE oeb01 LIKE oeb_file.oeb01 #表示oeb01变量类型和oeb_file表中的oeb01字段同类型)
——————————————————————————————————————————————
1、 CHAR 固定长度字符类型
语法 CHAR[(size)] 或 CHARACTER[(size)]
①CHAR与CHARACTER是同义词
②size指定几个字节长度,最大65534;如果不指定size则默认为1
③注意同一个字符在不同的字符编码下占的字符长度是不一样的
④CHAR赋值后如果长度不足size,则以空字符补到固定的字符size长度,但是任何字符比较都是去掉空字符后缀后才比较的(即”abc”=”abc “)
——————————————————————————————————————————————
2、 VARCHAR 可变长度字符类型
语法 CHAR[(size)] 或 CHARACTER[(size)]
①CHAR与CHARACTER是同义词
②size指定几个字节长度,最大65534;如果不指定size则默认为1
③注意同一个字符在不同的字符编码下占的字符长度是不一样的
④CHAR赋值后面size不够,则以空字符补到固定的字符size长度,但是任何字符比较都是去掉空字符后缀后才比较的(“abc”=”abc “)
#CHAR & VARCHAR 应用demo:
MAIN
DEFINE l_char CHAR #不指定长度时,默认为1个长度
DEFINE l_char20 CHAR(20)
DEFINE l_varchar VARCHAR #不指定长度时,默认为1个长度
DEFINE l_varchar20 VARCHAR(20)
DEFINE l_char10_A CHAR(10)
DEFINE l_char10_A_ CHAR(10)
#CHAR & VARCHAR 超过指定的size长度
LET l_char = 'ABCDEFG'
LET l_varchar = 'ABCDEFG'
DISPLAY '[l_char = ',l_char,']' #值超出size指定的长度时,值被截断
DISPLAY '[l_varchar = ',l_varchar,']'
IF l_char IS NULL THEN DISPLAY 'l_char IS NULL' ELSE DISPLAY 'l_char NOT NULL' END IF
IF l_varchar IS NULL THEN DISPLAY 'l_varchar IS NULL' ELSE DISPLAY 'l_varchar NOT NULL' END IF
IF l_char = l_varchar THEN
DISPLAY 'l_char = l_varchar : equals'
ELSE
DISPLAY 'l_char = l_varchar : not equals'
END IF
#CHAR赋值后面size不够,则以空字符补到固定的字符size长度,但是任何字符比较都是去掉空字符后缀后才比较的("abc"="abc ")
LET l_char10_A = 'A'
LET l_char10_A_ = 'A '
DISPLAY '[',l_char10_A ,']'
DISPLAY '[',l_char10_A_,']'
IF l_char10_A = l_char10_A_ THEN
DISPLAY 'l_char10_A = l_char10_A_ : equals'
ELSE
DISPLAY 'l_char10_A = l_char10_A_ : not equals'
END IF
#CHAR & VARCHAR 不赋值,直接使用时为NULL
DISPLAY '[l_char20 = ',l_char20,']'
DISPLAY '[l_varchar20 = ',l_varchar20,']'
IF l_char20 IS NULL THEN DISPLAY 'l_char20 IS NULL' ELSE DISPLAY 'l_char20 NOT NULL' END IF
IF l_varchar20 IS NULL THEN DISPLAY 'l_varchar20 IS NULL' ELSE DISPLAY 'l_varchar20 NOT NULL' END IF
END MAIN
输出结果:
[l_char = A]
[l_varchar = A]
l_char NOT NULL
l_varchar NOT NULL
l_char = l_varchar : equals
[A ]
[A ]
l_char10_A = l_char10_A_ : equals
[l_char20 = ]
[l_varchar20 = ]
l_char20 IS NULL
l_varchar20 IS NULL
#请注意,输出占位符和值的关系
#比如char(20):即使值为NULL时,display显示时也要占20个字符的空间
# varchar(20):因为是可变长度字符,值为NULL时,display显示时占1个字符的空间
——————————————————————————————————————————————
3、 STRING 字符串
语法 STRING
STRING的方法
append( str STRING ) RETURNING STRING 在原字符串后面添加str,然后返回一个新的字符串
equals( src STRING ) RETURNING INTEGER 比较原字符串和src,内容是否相等;【字符串首尾空白都必须一样多】
如果原字符串or src有1个字符串为NULL,则返回NULL
equalsIgnoreCase( src STRING ) RETURNING INTEGER 功能同上,但是忽略字符的大小写
getCharAt( pos INTEGER ) RETURNING STRING 返回在原字符串中,指定位置pos的字符;【注:位置从1开始计数】
如果指定的位置pos超出了原字符串的长度则返回NULL
getIndexOf( str STRING, spos INTEGER ) RETURNING INTEGER 返回在原字符串中,从指定位置spos开始,首次出现str字符串的索引位置;【注:位置从1开始计数】
如果未检索到,则返回0;如果原字符串是NULL,则返回-1
getLength( ) RETURNING INTEGER 返回原字符串的长度;【注:首尾空白字符也计数】
subString( spos INTEGER, epos INTEGER ) RETURNING STRING 返回在原字符串中,从指定位置spos开始到指定位置epos结束的子串
如果原字符串是NULL,或者指定的位置超出原字符串的长度则都返回NULL
toLowerCase( ) RETURNING STRING 将原字符串全部小写, 如果原字符串是NULL,则返回NULL
toUpperCase( ) RETURNING STRING 将原字符串全部大写, 如果原字符串是NULL,则返回NULL
trim( ) RETURNING STRING 去掉原字符串首尾空格,如果原字符串是NULL,则返回NULL
trimLeft( ) RETURNING STRING 去掉原字符串首 空格,如果原字符串是NULL,则返回NULL
trimRight( ) RETURNING STRING 去掉原字符串 尾空格,如果原字符串是NULL,则返回NULL
#STRING应用demo:
MAIN
DEFINE l_string STRING
DEFINE l_blank STRING
DEFINE l_blankTrim STRING
DEFINE l_blankCLIPPED STRING
DEFINE l_varcharCLIPPED VARCHAR(20)
DEFINE l_varcharTrim VARCHAR(20)
DEFINE l_stringBlank STRING
DEFINE l_stringKnalb STRING
#CHAR & VARCHAR & STRING 字符比较时,末尾有空白字符时一律忽略
LET l_stringBlank = 'ABCDEFG '
LET l_stringKnalb = 'ABCDEFG'
IF l_stringBlank == l_stringKnalb THEN
DISPLAY 'l_stringBlank = l_stringKnalb : equals' #√
ELSE
DISPLAY 'l_stringBlank = l_stringKnalb : not equals'
END IF
#STRING 空白字符串,trim() 或 CLIPPED 去掉空白字符后,不是NULL 而 是空串
##VS##
#CHAR VARCHAR 空白字符串, CLIPPED 去掉空白字符后, 是NULL 而不是空串
LET l_blank = ' '
LET l_blankTrim = l_blank.trim() #trim() :只针对string字符串才有的方法。 trim() 去掉 前面及末尾的空格
LET l_blankCLIPPED = l_blank CLIPPED # trimLeft() 仅去掉 前面的空格
LET l_varcharTrim = l_blank.trim() # trimRight()仅去掉 末尾的空格
LET l_varcharCLIPPED = l_blank CLIPPED #CLIPPED:对STRING、CHAR、VARCHAR都可以操作, 仅去掉 末尾的空格
IF l_blankTrim IS NULL THEN DISPLAY 'l_blankTrim IS NULL' ELSE DISPLAY 'l_blankTrim NOT NULL' END IF
IF l_blankCLIPPED IS NULL THEN DISPLAY 'l_blankCLIPPED IS NULL' ELSE DISPLAY 'l_blankCLIPPED NOT NULL' END IF
IF l_varcharTrim IS NULL THEN DISPLAY 'l_varcharTrim IS NULL' ELSE DISPLAY 'l_varcharTrim NOT NULL' END IF
IF l_varcharCLIPPED IS NULL THEN DISPLAY 'l_varcharCLIPPED IS NULL' ELSE DISPLAY 'l_varcharCLIPPED NOT NULL' END IF
#STRING的各种方法应用示例:
LET l_string = ' ABCDEFG ' #注:前面5个空格,后面3个空格,总长度为15个字符
#append():尾部添加
DISPLAY '[ ABCDEFG ] append [HIJKLMN] [:',l_string.append('HIJKLMN'),']'
#equals()、equalsIgnoreCase():判断相等
DISPLAY '[ ABCDEFG ] equals [BCD] :',l_string.equals('BCD') #×
DISPLAY '[ ABCDEFG ] equals [ABCDEFG] :',l_string.equals('ABCDEFG') #×
DISPLAY '[ ABCDEFG ] equals [ ABCDEFG ] :',l_string.equals(' ABCDEFG ') #× ,区别于=比较,=号字符后面的空白字符忽略
DISPLAY '[ ABCDEFG ] equals [ ABCDEFG ]:',l_string.equals(' ABCDEFG ') #√
DISPLAY '[ ABCDEFG ] equalsIgnoreCase [aBcD] :',l_string.equalsIgnoreCase('aBcD') #×
DISPLAY '[ ABCDEFG ] equalsIgnoreCase [ ABcDEFg ]:',l_string.equalsIgnoreCase(' ABcDEFg ') #√
#getLength():取字串长度
DISPLAY '[ ABCDEFG ] length:',l_string.getLength()
#getCharAt():索引指定位置字符
DISPLAY '[ ABCDEFG ] CharAt( 8):[',l_string.getCharAt(8),']'
DISPLAY '[ ABCDEFG ] CharAt(16):[',l_string.getCharAt(16),']' #索引位置超出原字符串长度时返回null
#getIndexOf():搜索子串的位置
DISPLAY '[ ABCDEFG ] IndexOf(ABC):',l_string.getIndexOf('ABC',5)
DISPLAY '[ ABCDEFG ] IndexOf(AC) :',l_string.getIndexOf('AC',1)
DISPLAY '[ ABCDEFG ] IndexOf(AC) :',l_string.getIndexOf('ABC',16) #索引位置超出原字符串长度时返回null
#toLowerCase()、DOWNSHIFT():全部转小写、toUpperCase()、UPSHIFT():全部转大写
DISPLAY '[ ABCDEFG ] toLowerCase :[',l_string.toLowerCase(),']'
DISPLAY '[ ABCDEFG ] DOWNSHIFT :[',DOWNSHIFT(l_string),']' #DOWNSHIFT()、UPSHIFT() 对string、char、varchar都可以操作
DISPLAY '[ ABCDEFG ] toUpperCase :[',l_string.toUpperCase(),']'
DISPLAY '[ ABCDEFG ] UPSHIFT :[',UPSHIFT(l_string),']'
#trim():去掉首尾空格、trimLeft():仅去掉首空格、trimRight():仅去掉末尾的空格
DISPLAY '[ ABCDEFG ] trim() :[',l_string.trim(),']'
DISPLAY '[ ABCDEFG ] trimLeft() :[',l_string.trimLeft(),']'
DISPLAY '[ ABCDEFG ] trimRight():[',l_string.trimRight(),']'
#subString:截取子字符串
DISPLAY '[ ABCDEFG ] subString():[',l_string.subString(7,10),']'
DISPLAY '[ ABCDEFG ] subString():[',l_string.subString(7,16),']' #索引位置超出原字符串长度时返回null
LET l_varchar = l_string
#DISPLAY '[ ABCDEFG ] [截取,字符]:[',l_string[7,10],']' #这里是错误的语法,[]截取字符串只适合CHAR & VARCHAR操作
DISPLAY '[ ABCDEFG ] [截取,字符]:[',l_varchar[7,10],']'
END MAIN
输出结果:
l_stringBlank = l_stringKnalb : equals
l_blankTrim NOT NULL
l_blankCLIPPED NOT NULL
l_varcharTrim IS NULL
l_varcharCLIPPED IS NULL
[ ABCDEFG ] append [HIJKLMN] [: ABCDEFG HIJKLMN]
[ ABCDEFG ] equals [BCD] : 0
[ ABCDEFG ] equals [ABCDEFG] : 0
[ ABCDEFG ] equals [ ABCDEFG ] : 0
[ ABCDEFG ] equals [ ABCDEFG ]: 1
[ ABCDEFG ] equalsIgnoreCase [aBcD] : 0
[ ABCDEFG ] equalsIgnoreCase [ ABcDEFg ]: 1
[ ABCDEFG ] length: 15
[ ABCDEFG ] CharAt( 8):[C]
[ ABCDEFG ] CharAt(16):[]
[ ABCDEFG ] IndexOf(ABC): 6
[ ABCDEFG ] IndexOf(AC) : 0
[ ABCDEFG ] IndexOf(AC) : 0
[ ABCDEFG ] toLowerCase :[ abcdefg ]
[ ABCDEFG ] DOWNSHIFT :[ abcdefg ]
[ ABCDEFG ] toUpperCase :[ ABCDEFG ]
[ ABCDEFG ] UPSHIFT :[ ABCDEFG ]
[ ABCDEFG ] trim() :[ABCDEFG]
[ ABCDEFG ] trimLeft() :[ABCDEFG ]
[ ABCDEFG ] trimRight():[ ABCDEFG]
[ ABCDEFG ] subString():[BCDE]
[ ABCDEFG ] subString():[]
[ ABCDEFG ] [截取,字符]:[BCDE]
——————————————————————————————————————————————
4、 DATE 日期
语法 DATE
①基于4byte的整数范围0001-01-1(-693594)到9999-12-31(2958464)
②有效日期范围为1899/12/31到9999/12/31,默认值为1899/12/31
——————————————————————————————————————————————
5、 DATETIME 日期时间
语法 DATETIME qua11 TO qua12
qua11可取值 YEAR、MONTH、DAY、HOUR、MINUTE、SECOND、FRACTION
qua12可取值 YEAR、MONTH、DAY、HOUR、MINUTE、SECOND、FRACTION、FRACTION(1)、FRACTION(2)、FRACTION(3)、FRACTION(4)、FRACTION(5)
——————————————————————————————————————————————
6、 INTERVAL 日期时间
#DATE & DATETIME 应用demo:
MAIN
DEFINE l_date DATE
DEFINE l_dateBegin DATE
DEFINE l_dateEnd DATE
DEFINE l_datetime1 DATETIME YEAR TO MINUTE #精确到分钟
DEFINE l_datetime2 DATETIME YEAR TO MINUTE
DEFINE l_datetimeBegin DATETIME YEAR TO SECOND #精确到秒
DEFINE l_datetimeEnd DATETIME YEAR TO SECOND
#日期赋值
LET l_date = TODAY #当前日
LET l_dateEnd = CURRENT #当前日期、时间;这里只取CURRENT的日期部分
LET l_dateBegin = '2013-10-31' #√,用字符串赋值
LET l_dateBegin = '2013/10/31' #√,
LET l_dateBegin = '13/10/31' #√,这样也是可以的,但是比较模糊,表示为能匹配到**13最近的年份;这里表示2013,而不是1913
#LET l_dateBegin = '2131031' #×,此表达方式不能正常转换为日期
#日期运算
DISPLAY 'l_date:',l_date
DISPLAY 'l_dateEnd:',l_dateEnd
DISPLAY 'l_dateBegin:',l_dateBegin
DISPLAY 'BeginDate ~ EndDate 天数:',l_dateEnd - l_dateBegin #两日期相减,直接得到两日期相距的天数
DISPLAY '两天后:',l_date + 2 #+-天数,直接得到+-天数后的日期
#日期时间赋值
LET l_datetime1 = TODAY #TODAY是日期,仅能取到日,后面的时间都是00:00:00
LET l_datetime2 = CURRENT YEAR TO MINUTE #CURRENT 到MINUTE 分钟
LET l_datetimeEnd = CURRENT YEAR TO SECOND #CURRENT 到SECOND 秒
LET l_datetimeBegin = '2015-03-10 14:30:30'
#日期时间运算
DISPLAY 'l_datetime1:',l_datetime1
DISPLAY 'l_datetime2:',l_datetime2
DISPLAY 'l_datetimeEnd:',l_datetimeEnd
DISPLAY 'l_datetimeBegin:',l_datetimeBegin
DISPLAY 'BeginDateTime ~ EndDateTime 天数 时分秒数:',l_datetimeEnd - l_datetimeBegin #两日期相减,直接得到两日期相距的天数及时分秒数
#DISPLAY '2天10小时10分10秒后:',l_datetimeBegin + '2 10:10:10' #×,测试日期时间类型不支持该语法
END MAIN
输出结果:
l_date:15/03/10
l_dateEnd:15/03/10
l_dateBegin:13/10/31
BeginDate ~ EndDate 天数: 495
两天后:15/03/12
l_datetime1:2015-03-10 00:00
l_datetime2:2015-03-10 15:05
l_datetimeEnd:2015-03-10 15:05:05
l_datetimeBegin:2015-03-10 14:30:30
BeginDateTime ~ EndDateTime 天数 时分秒数: 0 00:34:35
转载请注明:赫非域 » BDL-FGL_BASE 数据类型(2)