Alex Konkin Asked:2022-03-12 16:12:55 +0000 UTC2022-03-12 16:12:55 +0000 UTC 2022-03-12 16:12:55 +0000 UTC 数据类型和子类型有什么区别? 772 没找到明确的解释,用数据类型声明变量和用子类型声明有什么区别? 例如,如果我声明一个具有类型varchar2的变量或具有从创建的子类型的变量,有什么区别varchar2? oracle 2 个回答 Voted Best Answer 0xdb 2022-03-12T19:40:00Z2022-03-12T19:40:00Z 从基本数据类型(又可能是子类型)声明的数据子类型是基本数据类型的一种同义词,换句话说,是基本数据类型的另一个名称。 性能或资源消耗不会有任何差异。从子类型隐式转换为其基本数据类型时有一些微妙之处,反之亦然,请参阅下面链接中的文档。 该文档并没有很好地解释它: 子类型可以: 提供与 ANSI/ISO 数据类型的兼容性 显示该类型数据项的预期用途 检测超出范围的值 在我看来,列表的平均值更合适,以显示子类型将用于什么目的。例如,如果一个符号变量不需要被限制,就不要到处写varchar2 (32767),或者更糟糕的是,根据原则:“一切似乎都适合” - varchar2 (100)。或者,开发人员是否应该在声明游标变量时真正考虑前缀的含义sys_——它是对所有人都是全局的,还是仅对具有系统权限的人而言。 不用说,您想创建同义词或提供别名 ( alias )。 一个例子来说明上述情况: declare subtype longVarchar is varchar2 (32767); subtype tennerRange is pls_integer range 1..10; subtype refcursor is sys_refcursor; ls longvarchar := rpad ('ABC', 32767, 'X'); tr tennerrange := 1; rc refcursor; begin open rc for select length (ls) len, tr tenner from dual; dbms_sql.return_result (rc); end; / PL/SQL procedure successfully completed. LEN TENNER -------- -------- 32767 1 jashka34 2022-03-14T15:03:50Z2022-03-14T15:03:50Z 当您创建大型程序并且不确定某些数据类型以后(在开发期间)不会更改时,子类型很有用。 你会说吗varchar2(10)。在 50 个包中创建 100 个变量。然后决定你现在需要什么varchar2(20)。更改 50 个包中的所有 100 个变量既繁琐又不方便。 因此,声明一个类型subtype mytype varchar(10),并在任何地方使用它。如果您需要更改为varchar2(20),那么您只需更改一处。 这里的问题是:为什么这里使用关键字subtype,而不是type?因为不能写type mytype varchar(10),所以会报错,因为 type用于描述新的用户定义类型。
从基本数据类型(又可能是子类型)声明的数据子类型是基本数据类型的一种同义词,换句话说,是基本数据类型的另一个名称。
性能或资源消耗不会有任何差异。从子类型隐式转换为其基本数据类型时有一些微妙之处,反之亦然,请参阅下面链接中的文档。
该文档并没有很好地解释它:
在我看来,列表的平均值更合适,以显示子类型将用于什么目的。例如,如果一个符号变量不需要被限制,就不要到处写
varchar2 (32767),或者更糟糕的是,根据原则:“一切似乎都适合” -varchar2 (100)。或者,开发人员是否应该在声明游标变量时真正考虑前缀的含义sys_——它是对所有人都是全局的,还是仅对具有系统权限的人而言。不用说,您想创建同义词或提供别名 ( alias )。
一个例子来说明上述情况:
当您创建大型程序并且不确定某些数据类型以后(在开发期间)不会更改时,子类型很有用。
你会说吗
varchar2(10)。在 50 个包中创建 100 个变量。然后决定你现在需要什么varchar2(20)。更改 50 个包中的所有 100 个变量既繁琐又不方便。因此,声明一个类型
subtype mytype varchar(10),并在任何地方使用它。如果您需要更改为varchar2(20),那么您只需更改一处。这里的问题是:为什么这里使用关键字
subtype,而不是type?因为不能写type mytype varchar(10),所以会报错,因为type用于描述新的用户定义类型。