暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

人大金仓数据库KingbaseES PLSQL中的数据类型--SQL类型

数据猿 2023-12-06
1842


关键字:

KingbaseES、字符数据类型、字符类型、日期/时间类型、人大金仓、KingbaseES

在KingbaseES数据库中,我们操作的每一个值都具有它的数据类型,因此当我们需要声明一个PL/SQL变量(或常量)时,应该指明它的数据类型。PL/SQL中一共提供了两类不同的数据类型,包括标量数据类型和复合数据类型。标量数据类型是一种最基础的数据类型,与复合数据类型可以存储一组值或多个字段不同,它只能存储一个数据。本文将对PL/SQL标量数据类型中的SQL类型进行详细介绍。

什么是SQL数据类型

PL/SQL是SQL在KingbaseES数据库上的过程扩展语言,它继承了SQL语言的数据类型并在此基础上进行了扩展,为管理和操作数据提供了更大的灵活性。SQL数据类型主要包含一些KingbaseES的内置类型,如:字符数据类型、数值类型、日期/时间类型等。在实际编程中,我们根据所需存储数据的性质和用途为其选择最合适的存储类型。

字符数据类型

字符数据类型用于存储字符数据,PL/SQL支持存储固定长度和可变长度的字符数据。下表对KingbaseES SQL中的字符数据类型进行了总结。

功能描述

存储尺寸

类型名字

存储字符串类型数据

固定长度

CHARACTER(CHAR) | NCHAR

可变长度

VARCHAR | VARCHAR2

NVARCHAR | NVARCHAR2

存储文本类型数据

无限变长

TEXT

下面列出了一些常用字符数据类型的声明格式:

1)CHAR类型的声明格式:variable_name CHAR[(n [char | byte])];

其中,n用于限定字符串的长度(默认值为1字符)。由于该类型限定了字符串的长度,因此当变量、常量或参数等不足定义长度时,会自动在最右边用空格补齐。

2)VARCHAR2类型的声明格式:variable_name varchar2[(n [char | byte])];

其中,n用于限定字符串的最大长度,当n缺省时,则代表字符串可以为任何长度。与CHAR类型不同,该类型不需要在字符串右边用空格补齐。其在PL/SQL中还有一个预定义子类型SRING,用法与VARCHAR2基本一致。

3)TEXT类型的声明格式:variable_name TEXT;

使用TEXT类型声明的字符串,其最大长度可以为1G,因此可用于存储较长的文本串。

接下来,让我们通过一个例子来了解这些类型的具体用法:

\set SQLTERM /

DECLARE

i CHAR(10) := '1'; --定义一个长度为10的定长字符串

j VARCHAR2(10) := 'kingbase'; --定义一个最大长度为10的变长字符串

k TEXT := 'kingbase_kingbase_kingbase_kingbase_kingbase';

BEGIN

RAISE NOTICE 'char(10) : %;', i;

RAISE NOTICE 'varchar2(10): %;', j;

RAISE NOTICE 'text : %;', k;

END;

/

打印结果如下:

可以看到,当变量i的长度小于10时,不足部分会自动在最右边用空格补齐

数值类型

在KingbaseES SQL中,数值类型可用于存储整数、小数、浮点数和NAN。下表列出了KingbaseES SQL中的数值类型

描述

类型名字

存储尺寸

存储范围

整数类型

TINYINT

1字节

[-128 , 127]

SMALLINT

2字节

[-32768 , 32767]

INT(integer)

4字节

[-2147483648 , 2147483647]

BIGINT

8 字节

[-9223372036854775808 ,

9223372036854775807]

精确数值数据类型

NUMBER | NUMERIC | DECIMAL

可变

存储绝对值在 [10-130 , 10126]间 的正、负定点数(包括0)

浮点类型

REAL

4字节

范围在-1E+37 到 +1E+37 之间。REAL的精度至少是 6 位小数,DOUBLE PRECISION的精度至少是 15 位小数

DOUBLE

8字节

FLOAT(p)

8字节

当 p 取1-24 时,与 REAL相同。

当 p 取25-53 时,与 DOUBLE PRECISION 相同。

BINARY_FLOAT

4字节

存储单精度的 32 位浮点数

BINARY_DOUBLE

8字节

存储单精度的 64 位浮点数

在这些数值类型中,NUMBER的使用最为广泛,它支持存储各种多种数值类型的数据(包括整数、定点小数和浮点数)。以下为NUMBER类型的声明格式:

variable_name NUMBER (precision, scale)

其中,precision 表示精度,即整个数中有效位的总数,也就是小数点两边的位数,取值范围为 1~1000。scale 表示标度,是小数部分的数字位数,取值范围为 0~1000。例如NUMBER(8,2)表示声明的数据共有8个有效位,其中小数占两个有效位,该范围内的最大值为999999.99。

除了上述的数值类型,PL/SQL还提供了PLS_INTEGER类型和BINARY_INTEGER类型,这两个类型是相同的,它们存储范围与INTEGER类型一致。

此外,KingbaseES PL/SQL还提供了一些预定义子类型,常用的主要有以下几种:

• SQL 数据类型 BINARY_FLOAT 的子类型:SIMPLE_FLOAT;

• SQL 数据类型 BINARY_DOUBLE 的子类型:SIMPLE_DOUBLE;

• PLS_INTEGER 数据类型的预定义子类型:SIMPLE_INTEGER 。

这些子类型的存储范围都与基本类型相同,但具有NOT NULL约束。因此,如果您知道变量永远不会有NULL值,可以将其声明为这些基本类型的子类型。

下面这个例子,演示了PL/SQL中几种常用数值类型的基本用法:

\set SQLTERM /

DECLARE

v_num NUMBER(8,2) := 12345.6; --定义含8个有效位且小数占两位的number变量

v_int INT := 5.3; --定义interger变量,并赋值为小数

v_float FLOAT(8) := 50; --定义float变量,精度为8

v_double DOUBLE := 100; --定义double变量

BEGIN

RAISE NOTICE 'v_num(number) = %;', v_num;

RAISE NOTICE 'v_int(int) = %;', v_int;

RAISE NOTICE 'v_float(float) = %;', v_float;

RAISE NOTICE 'v_double(double) = %;', v_double;

END;

/

打印结果如下:

如结果所示,当NUMBER类型变量v_num不足小数位时,将自动用0在小数点右侧补齐。INT类型变量v_int将小数根据四舍五入的方式自动转换为整数。

日期/时间类型

PL/SQL在处理数据时,难免会需要日期和时间信息。为此,KingbaseES提供了多种日期和时间类型,用于存储、操作和分析时间相关的数据。下表对KingbaseES SQL中的日期/时间类型进行了总结。

描述

类型名字

有/无时区

精确度

DATE存储日期和时间

DATE

无时区

1分

TIMESTAMP存储日期和时间

(精确到小数的秒)

timestamp[(p)] [without time zone]

无时区

1微秒

timestamp[(p)] with time zone

有时区

timestamp[(p)] with local time zone

有时区

TIME存储一天的时间(精确到小数的秒)

time [(p)] [without time zone]

无时区

1微秒

time [(p)] with time zone

有时区

INTERVAL存储时间

间隔

interval

无时区

1微秒

yminterval

无时区

1月

dsinterval

无时区

1纳秒

其中,日期包括年月日,时间包括时分秒。在TIMESTAMP和TIME类型中,p 是一个可选项,表示秒精度(即秒字段中小数点后面的位数),取值范围为 0~6,如果缺省p,则表明在精度上没有明确的边界。在下面这个例子中,演示了使用INTERVAL结合TIMESTAMP来记录一段时间的间隔:

\set SQLTERM /

DECLARE

a DATE;

b TIMESTAMP(6);

c TIMESTAMP(6);

d INTERVAL;

s NUMBER;

BEGIN

a = SYSDATE;

b = clock_timestamp();

FOR i IN 1..5000000 LOOP

s = 1*1;

END LOOP;

c = clock_timestamp();

d = c-b;

RAISE NOTICE 'a: %', a;

RAISE NOTICE 'b: %', b;

RAISE NOTICE 'c: %', c;

RAISE NOTICE 'd: %', d;

end;

/

打印结果如下:

SQL中的其他内置数据类型

除了字符数据类型、数值类型、日期类型之外,KingbaseES SQL中还包含许多其它的数据类型,包括:布尔类型、大对象类型、几何类型、ROWID类型、位串类型、XML类型、JSON类型等。这些丰富的数据类型为数据的存储提供了多样化的选择,以满足不同类型数据的存储需求,例如:大对象数据类型可以存储大型非结构化数据,几何类型可以表示二维的空间物体等。下面将对一些常用的数据类型进行介绍。

1、大对象类型

大对象类型用于存储文本、图像、视频等大型非结构化数据,主要包括以下几类:

数据类型

存储对象

BLOB

存储二进制大对象,长度最大为 1G

CLOB

存储字符大对象(任何字符集数据),长度最大为 1G

NCLOB

存储字符大对象(国家字符集数据),长度最大为 1G

BFILE

存储文件的定位符,指向位于外部的二进制文件,长度最大为 1G

BYTEA

存储变长二进制串,长度最大为 1G

RAW | LONGROW

存储字符大对象,长度最大为 1G

下面的示例中,演示了两种常用的大对象类型的声明格式:

a BLOB;

b CLOB;

2、XML类型

XML 数据类型用于存储XML数据,使用函数XMLPARSE,可以从字符串中生成一个XML类型的数据:

XMLPARSE ( { DOCUMENT | CONTENT } value)

下面这个例子中展示了XMLPARSE的简单用法:

\set SQLTERM /

DECLARE

a XML;

BEGIN

a := XMLPARSE (DOCUMENT '<?xml version="1.0"?><student><name> ZangSan </name></student>');

RAISE NOTICE '%', a;

END;

/

打印结果如下:

3、位串类型

位串指的是由1和0组成的串,主要包括BIT类型和BIT VARING类型。这两个类型都有一个可选项n,用于限制长度,其基本用法如下:

\set SQLTERM /

DECLARE

a BIT VARYING(7); --指定位串的长度只能为7,过长或过段都会报错

b BIT(7); --限制位串的最大长度为7,长度超过7会报错

BEGIN

a := 101101;

b := 10001100;

END;

/

打印结果如下:

参考资料

《KingbaseES_PLSQL过程语言参考手册》

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论