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

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

原创 数据猿 2023-12-26
327


关键字:

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的使用

  1. 声明变量或参数时可以使用subtype

在程序中声明变量或参数时,可以使用之前定义的subtype。

  1. 赋值给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;

  1. 使用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过程语言参考手册》

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

评论