“类型”和“子类型”关键字有啥区别?

Posted

技术标签:

【中文标题】“类型”和“子类型”关键字有啥区别?【英文标题】:What is the difference between "type" and "subtype" keywords?“类型”和“子类型”关键字有什么区别? 【发布时间】:2018-04-23 09:53:32 【问题描述】:

在一些 PL/SQL 示例代码中,我注意到 typesubtype 关键字的用法,每次都声明一个自定义类型(例如,类似于 C 中的 typedef 关键字)。

在我看来,它们的用法可以互换:它们有什么区别?

【问题讨论】:

%TYPE 属性允许您将常量、变量、字段或参数声明为与先前声明的变量、字段、记录、嵌套表或数据库列具有相同数据类型。另一方面,SUBTYPE 不会引入新类型;相反,它在其基本类型上放置了一个可选约束。子类型可以是受约束的或不受约束的。不受约束的子类型的示例有:FLOAT 代表 NUMBER,CHARACTER 代表 CHAR。 【参考方案1】:

如果您尝试使用更具体的精度/比例(或将其限制为NOT NULL)声明一种基本数据类型,如下所示:

DECLARE
  TYPE int IS NUMBER(38,0);
BEGIN
  NULL;
END;
/

然后它不起作用,你得到异常:

ORA-06550:第 2 行,第 15 列:PLS-00103:在预期以下情况之一时遇到符号“NUMBER”: “范围”替换为“NUMBER”以继续。

相反,您想使用 SUBTYPE 关键字:

DECLARE
  SUBTYPE int IS NUMBER(38,0);
  SUBTYPE intn IS NUMBER(38,0) NOT NULL;
BEGIN
  NULL;
END;
/

例如 - A previous question where an answer was to use a SUBTYPE to constrain the data to specific precision and scale.


还要考虑以下声明:

    TYPE intlist IS TABLE OF NUMBER(38,0);
    
    TYPE intlist IS TABLE OF NUMBER(38,0) NOT NULL;
    
    SUBTYPE integern IS NUMBER(38,0) NOT NULL;
    TYPE intlist IS TABLE OF integern;
    
    TYPE intlist IS TABLE OF NUMBER(38,0);
    SUBTYPE intlistn IS intlist NOT NULL;
    

对于(1),列表可以是NULL,列表的元素可以是NULL

DECLARE
  TYPE intlist IS TABLE OF NUMBER(38,0);
  list intlist := NULL;
BEGIN
  list := intlist( 1, 2, NULL, 4 );
END;
/

(2) 和 (3) 是等效的 - 列表可以是 NULL,但列表中包含的任何元素都必须是 NOT NULL

DECLARE
  TYPE intlist IS TABLE OF NUMBER(38,0) NOT NULL;

  -- This works:
  list intlist := NULL;
BEGIN
  -- This also works:
  list := intlist( 1, 2, 3, 4 );

  -- But this will raise an exception
  -- list := intlist( 1, 2, NULL, 4 );
END;
/

要强制列表不能为NULL,您需要声明SUBTYPE 并根据sn-p (4) 中的intlistn 对其实施约束。

DECLARE
  TYPE intlist IS TABLE OF NUMBER(38,0);
  SUBTYPE intlistn IS intlist NOT NULL;

  -- This works as the list is NOT NULL (even though an element of the list is)
  list intlistn := intlist( 1, 2, NULL, 4 );
BEGIN
  -- This does not works as the SUBTYPE constraint prevents it:
  -- list := NULL;
END;
/

【讨论】:

以上是关于“类型”和“子类型”关键字有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

有啥区别:在同类型的结构体中用关键字struct创建结构体指针

重写super关键字final关键字多态子类型转换抽象的初步了解

语句和关键字有啥区别?

C语言中sbit是啥意思,与bit有啥区别?

关键字符号和引用符号有啥区别?

typeof 和 is 关键字有啥区别?