金仓数据库PLSQL基本数据类型
关键字:
KingbseES 、PLSQL、基本数据类型、人大金仓
标量类型
PLSQL中常用的标量类型如下表所示:
数据类型 | 示例 |
数字类型 | smallint、integer、bigint、decimal、numeric、real、double precision、smallserial、serial、bigserial |
字符类型 | character varying(n), varchar(n)、character(n), char(n)、text |
日期/时间类型 | timestamp [(p) ] [without time zone ]、timestamp [(p) ] with time zone、date、time [ (p)] [ without time zone ]、time [ (p)] with time zone、interval [fields ] [(p) ] |
货币类型 | money |
二进制类型 | bytea |
布尔类型 | boolean |
数组类型 | 数组数据类型可以通过在数组元素的数据类型名称后面加上方括号([])来命名 |
几何类型 | point、line、lseg、box、path、polygon、circle |
网络地址类型 | cidr、inet、macaddr |
位串类型 | bit(n)、bit varying(n) |
文本搜索类型 | Tsvector、tsquery |
JSON类型 | json 、jsonb |
范围类型 | Int4range、 int8range、numrange、tsrange、 tstzrange、 daterange |
Pglsn type | pg_lsn |
伪类型 | Any、anyelement、anyarray、anynonarray、anyenum、anyrange、cstring、internal、language_handler、fdw_handler、index_am_handler、tsm_handler、record、trigger、event_trigger、pg_ddl_command、void、opaque |
用户自定义类型
CREATE TYPE在当前数据库中注册一种新的数据类型,共有五种形式的CREATE TYPE:组合类型、枚举类型、范围类型、基础类型或者shell 类型,具体如下表所示:
数据类型 | 语法 | 示例 |
组合类型 | CREATE TYPE name AS | CREATE TYPE var_type1 AS (id int,name varchar(30)); |
枚举类型 | CREATE TYPE name AS ENUM | CREATE TYPE enum1 AS ENUM ('sad', 'ok', 'happy'); |
RANGE类型 | CREATE TYPE name AS RANGE | CREATE TYPE floatrange AS RANGE ( subtype = float8, subtype_diff = float8mi ); |
基础类型 | CREATE TYPE name | CREATE TYPE complex ( internallength = 16, input = complex_in, output = complex_out ); |
空类型 | CREATE TYPE name | CREATE TYPE complex; |
%TYPE
%TYPE的使用方式有:
●使用列属性或变量名加上%TYPE来标识字段类型。
●用来表示一个和已有表字段具有相同类型的类型。
●除继承字段类型外,不能继承字段的其他属性。
示例:
\set SQLTERM ; create table tt1(id int,name varchar(50)); insert into tt1 values(1,'kingbase'); \set SQLTERM / DECLARE a1 tt1.id%type; a2 tt1.name%type; BEGIN SELECT id,name INTO a1,a2 FROM tt1; RAISE NOTICE ‘%’,a1; RAISE NOTICE ‘%’,a2; END; / |
4.%ROWTYPE
%ROWTYPE类型用法如下:
●一个复合类型,叫做行变量
●用来表示和一个现有的表或者视图的行类型相同的类型
●一个%rowtype类型变量,可存放SELECT检索结果集的一条记录
示例:
CREATE TABLE t1(id int,name varchar(50)); insert into t1 values(1,'kingbase'); \set SQLTERM / DECLARE a1 t1%rowtype; BEGIN SELECT id,name INTO a1 FROM t1; RAISE NOTICE '%',a1.id; RAISE NOTICE '%',a1.name; END; / |
5.集合类型
集合类型是一种复合类型,包括以下三种:关联数组、嵌套表、可变数组。
- 关联数组
(1)关联数组具有唯一键值的集合类型,具有以下特性:
●包含零活多个具有相同类型的元素
●用户可按键值检索
●键值可以是整型等数值类型,也可是字符串等非数值类型
●键值连续且有序
●关联数组只能用于PL/SQL环境
(2)关联数组的语法:
TYPE assoc_type_name IS TABLE OF element_type [ NOT NULL ] INDEX BY index_type; index_type ::= INT | VARCHAR | VARCHAR2 | TEXT |
(3)关联数组示例:
\set SQLTERM / DECLARE TYPE my_assoc_array_type1 IS TABLE OF varchar(20) INDEX BY varchar(20); var1 my_assoc_array_type1; i varchar(20); BEGIN var1('c1') :='kingbase'; var1('c2') :='tianjin'; i :=var1.first; WHILE i is not null LOOP DBNS_OUTPUT.PUT_LINE(var1(i)); i :=var1.next(i); END LOOP; END; / |
- 嵌套表
(1)嵌套表是基于键值对的集合类型,具有以下特性:
●与关联数组相比,它的键值只能为整型,即从1开始的连续值
●必须使用和其同名的构造函数进行初始化
(2)嵌套表的语法:
TYPE nest_table_type_name IS TABLE OF element_type [ NOT NULL ]; |
(3)嵌套表示例:
DECLARE TYPE my_nest_table_type1 IS TABLE OF VARCHAR(50); var1 my_nest_table_type1 :=my_nest_table_type1(); i varchar(20); BEGIN var1 :=my_nest_table_type1('kingbase','tianjin','beijing'); FOR i IN 1..var1.count LOOP DBMS_OUTPUT.PUT_LINE(var1(i)); END LOOP; END; / |
3.可变数组
(1)可变数组为INT且从1开始,具有以下特性:
●可变数组在定义时需指定最大元素个数,且在应用中不能超过该限制
●可变数组的下标必须连续
●删除元素时,可变数组不能使用delete(n)和delete(m,n)方法,但可以使用delete()方法,删除所有元素。
(2)可变数组语法:
TYPE varray_type_name IS VARRAY(size_limit) OF element_type [ NOT NULL ]; |
(3)可变数组示例:
\set SQLTERM / DECLARE TYPE my_varray_type1 IS VARRAY(10) OF VARCHAR(50); var1 my_varray_type1 := my_varray_type1(); i varchar(20); BEGIN var1.extend(3); var1(1) :=‘kingbase’; var1(2) :=‘beijing’; var1(3) :=‘tianjin’; FOR i IN 1..var1.count LOOP DBMS_OUTPUT.PUT_LINE(var1(i)); END LOOP; END; / |
6.RECORD类型
(1)记录类型由单行多列的标量构成的复合结构,将一个或多个标量封装成一个对象。
(2)记录类型的语法:
TYPE record_type IS RECORD (filed1 type1[not null][:=expr1] [, RECORD(filed1 type1[not null][:=expr1]] ); |
(3)记录类型示例:
\set SQLTERM / DECLARE TYPE my_record_type1 IS RECORD(a1 int default 10,a2 varchar(20) default 'kingbase'); var1 my_record_type1; BEGIN DBMS_OUTPUT.PUT_LINE(var1.a1); DBMS_OUTPUT.PUT_LINE(var1.a2); var1.a1 :=20; DBMS_OUTPUT.PUT_LINE(var1.a1); END; / |