关键字:
subtype、人大金仓、KingbaseES、
PLSQL子类型
在PLSQL中可以使用subtype关键字来定义自定义的子类型,它是可以是系统支持的数据类型、用户自定义的数据类型或子类型。
无约束子类型
无约束子类型是一种定义在基本数据类型上的自定义数据类型,没有任何额外的限制或约束。并且相同基本类型的无约束子类型可以相互交换,也可以与基本类型交换。不发生数据类型转换。其定义语法为:
SUBTYPE subtype_name IS base_type
在下面的示例中,无约束子类型 num_subtype 和 natural_subtype 显示了其数据类型的预期用途。
\set SQLTERM /
DECLARE
SUBTYPE num_subtype IS NUMBER;
num1 num_subtype(6,2);
SUBTYPE natural_subtype IS NATURAL;
nat1 natural_subtype := 1;
PROCEDURE add_num (
num1 IN OUT num_subtype,
num2 IN num_subtype
) IS
BEGIN
num1 := num1 + num2;
nat1 := nat1 + 1;
END;
BEGIN
NULL;
END;
/
约束子类型
在PLSQL中,月数字类型是一种在基本数据类型上定义约束条件的自定义数据类型。通过为子类型添加约束条件,以限制数据的范围、长度、精度等。其定义语法为:
SUBTYPE subtype_name IS base_type { precision [, scale ] | RANGE low_value .. high_value } [ NOT NULL ]
受约束的子类型可以隐式转换为其基类型,但只有当值不违反子类型的约束时,才能将基类型隐式转换为受约束的子类型。仅当源值不违反目标子类型的约束时,才能将受约束的子类型隐式转换为具有相同基类型的另一个受约束的子类型。例1:用户定义的约束子类型被检测超出数值范围
\set SQLTERM /
DECLARE
SUBTYPE num_subtype IS NUMBER(8,2);
num1 num_subtype;
num2 num_subtype;
BEGIN
num1 := 1000.00;
num2 := 2000000.00;
END;
/
例2. 具有相同基本类型的约束子类型之间的隐式转换
在此示例中,三个受约束的子类型具有相同的基本类型。前两个子类型可以隐式转换为第三个子类型,但不能相 互转换。
\set SQLTERM /
DECLARE
SUBTYPE typ1 IS PLS_INTEGER RANGE 0..9;
SUBTYPE typ2 IS PLS_INTEGER RANGE 10..99;
SUBTYPE typ3 IS PLS_INTEGER RANGE 0..99;
val1 typ1 := 4;
val2 typ2 := 35;
val3 typ3;
BEGIN
val3 := val1; --true
val1 := val2; --error
val2 := val1; --error
END;
/
Subtype的使用
- 声明变量或参数时可以使用subtype
在程序中声明变量或参数时,可以使用之前定义的subtype。
- 赋值给subtype变量
赋值给subtype变量的过程与赋值给普通变量类似,可以直接适用肤质语句或从其他变量进行赋值。
\set SQLTERM /
CREATE OR REPLACE PROCEDURE pr1
AS
SUBTYPE My_Subtype1 IS number(5,3) NOT NULL ;
a1 My_Subtype1 :=10.345;
BEGIN
DBMS_OUTPUT.PUT_LINE(a1);
END;
/
\set SQLTERM ;
CALL pr1();
--drop procedure
DROP PROCEDURE pr1;
- 使用subtype作为函数的返回值
\set SQLTERM /
CREATE OR REPLACE FUNCTION func1 RETURN INT
AS
SUBTYPE My_Subtype1 IS number(5,3);
a1 My_Subtype1 :=2.3456;
a2 My_Subtype1;
FUNCTION test_func1(p1 My_Subtype1) RETURN My_Subtype1
AS
BEGIN
RETURN p1;
END;
BEGIN
a2 :=test_func1(a1);
DBMS_OUTPUT.PUT_LINE(a2);
RETURN 1;
END;
/
\set SQLTERM ;
SELECT func1();
--drop FUNCTION
DROP FUNCTION func1;
参考资料
《KingbaseES_PLSQL过程语言参考手册》




