金仓数据库KingbaseES PLSQL与SQL存在差异的几种基础数据类型的介绍
关键字:
KingbaseES、PLSQL、基础数据类型、BOOLEAN、人大金仓
基础字符串数据类型
每个 PL/SQL 常量、变量、参数和函数返回值都有一个数据类型,它决定了它的存储格式以及它的有效值和操作。PL/SQL 数据类型包括 SQL 数据类型。
新增的 BINARY_FLOAT 和 BINARY_DOUBLE 的 PL/SQL 子类型与 SQL 不同,PL/SQL 允许声明CHAR 和 VARCHAR2 变量。
(1)BINARY_FLOAT 和 BINARY_DOUBLE 的其他 PL/SQL 子类型
SIMPLE_FLOAT是SQL 数据类型 BINARY_FLOAT 的子类型
SIMPLE_DOUBLE是SQL 数据类型 BINARY_DOUBLE 的子类型
每个子类型都具有与其基本类型相同的范围,并且具有 NOT NULL 约束。如果已知变量永远不会有 NULL 值,请将其声明为 SIMPLE_FLOAT 或 SIMPLE_DOUBLE,而不是 BINARY_FLOAT 或 BINARY_DOUBLE。 在没有检查空值的情况下,子类型提供了比它们的基本类型更好的性能。
(2)CHAR 和 VARCHAR2 变量
CHAR 和 VARCHAR2 变量的相同点:
- 在使用CHAR 和 VARCHAR2 变量时可以通过char关键字设置当前变量的长度,在使用时如果分配或者插入的值过长,就会发生如下报错:
- 两者都可以为多字节字符声明变量,但是最大长度为32767字节。确保它始终可以容纳任何多字节字符集中的 n 个字符,最好以字符形式声明其长度 CHAR(n CHAR) 或 VARCHAR2(n CHAR),其中 n 不超过 FLOOR (32767/4) = 8191。
CHAR 和 VARCHAR2 数据类型的区别:
- 预定义的子类型:
CHAR 数据类型在 PL/SQL 和 SQL 中都有一个预定义的子类型—CHARACTER。
VARCHAR2 数据类型在 PL/SQL 和 SQL 中都有一个预定义的子类型 VARCHAR,但在 PL/SQL 中还有一个预定义的子类型 STRING。
- 空白填充的工作原理不同:
如果接收者的数据类型是CHAR,PL/SQL 将值填充到最大长度。有关原始值中尾随空格的信息会丢失。
如果接收者的数据类型是VARCHAR2,PL/SQL 既不填充值也不去除尾随空格。字符值被原封不动地分配,不会丢失任何信息。
例子:
布尔数据类型
- BOOLEAN的声明语法:
变量名 boolean;
- 不能使用 DBMS_OUTPUT.PUT 或 DBMS_OUTPUT.PUTLINE 子程序打印布尔值。要打印 BOOLEAN 值,需要使用 IF 或 CASE 语句将其转换为字符值。
例子:
PLS_INTEGER和BINARY_INTEGER数据类型
PL/SQL 数据类型 PLS_INTEGER 和 BINARY_INTEGER 是相同的。这两种数据类型存储 -2,147,483,648 到 2,147,483,647 范围内的带符号整数,以 32 位表示。
- PLS_INTEGER 类型的数据溢出
具有溢出 PLS_INTEGER 范围的两个 PLS_INTEGER 值的计算会引发溢出异常。对于 PLS_INTEGER 范围之外的计算,使用 INTEGER,这是 NUMBER 数据类型的预定义子类型。
溢出示例:
- 预定义的 PLS_INTEGER 子类型
数据类型(PLS_INTEGER的子类型) | 说明 |
---|---|
NATURAL | PLS_INTEGER非负值 |
NATURALN | PLS_INTEGER带NOT NULL约束的非负值 |
POSITIVE | 值为正值PLS_INTEGER |
POSITIVEN | PLS_INTEGER带NOT NULL约束的正值 |
SIGNTYPE | PLS_INTEGER值 -1、0 或 1(用于编程三态逻辑) |
SIMPLE_INTEGER | PLS_INTEGER有NOT NULL约束的值 |
- PLS_INTEGER的子类型可以隐式转换为一下数据类型:
- CHAR
- VARCHAR2
- NUMBER
示例:
示例中将类型为NATURAL的x直接赋值给类型为char的y没有报错,因为实现了隐式转换。
用户定义的 PL/SQL 子类型
- 无约束子类型
无约束的子类型与其基类型具有相同的值集,也可以理解为是基类型的另一个称呼。因此两者之间可以进行相互转换,切不发生数据类型转换。
定义无约束子类型的语法:
SUBTYPE subtype_name IS base_type;
SUBTYPE为关键字,
subtype_name为自定义类型的名称,
base_type为基类型名称。
- 约束子类型
受约束的子类型是基类型值的子集
约束子类型的定义语法:
SUBTYPE subtype_name IS base_type
{ precision [, scale ] | RANGE low_value .. high_value } [ NOT NULL ];
与不受约束的子类型相比受约束的子类型在声明时做了一定的限制如精度、范围和是否为空等。
受约束的子类型可以隐式的转换为基类型
示例:
约束了自定义类型的位数和精度。
参考资料
提供该题目相关内容在产品手册中可以系统学习的位置,例如: