oracle“创建或替换类型”和“类型type_name是...”语法之间的区别是什么

时间:2009-11-04 02:57:26

标签: sql oracle plsql types

我是一个pl / sql新手。现在我有一个关于oracle 类型 的问题。我看到有两种类型的 类型

CREATE OR REPLACE TYPE "TYPE_NAME1" AS OBJECT
(
    temp_trans_id           number(10),
    trans_id                number(10),
    resion_id               number(10)
)

type new_type_name is record(
    column1 number,
    column2 varchar2(50)
);
variable_name new_type_name;

有什么区别?非常感谢。

2 个答案:

答案 0 :(得分:7)

除了上一个答案之外,声明的范围也存在重大差异。

当您在PL / SQL中声明类型时,例如示例中的记录类型,它只能在PL / SQL中使用。如果它是在程序或函数的本地声明,那么它只能在该子程序中使用;如果它在包体中声明,它只能在该包中使用;如果它在包头中声明,则任何对包具有执行访问权限的PL / SQL代码都可以使用它。它绝不能在SQL语句中引用,甚至是嵌入在PL / SQL代码中的

当您创建对象类型或其他架构级别类型定义(如嵌套表)时,它在SQL和PL / SQL中都可用。作为一个非常简单的示例,您可以将表定义基于对象定义:

SQL> CREATE OR REPLACE TYPE "TYPE_NAME1" AS OBJECT
  2  (
  3      temp_trans_id           number(10),
  4      trans_id                number(10),
  5      resion_id               number(10)
  6  )
  7  /

Type created.

SQL> create table type_name1_tab of type_name1;

Table created.

SQL> desc type_name1_tab
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 TEMP_TRANS_ID                                      NUMBER(10)
 TRANS_ID                                           NUMBER(10)
 RESION_ID                                          NUMBER(10)

See here获取有关CREATE TYPE语句的文档,以及有关对象类型的各种用法的进一步文档的参考。

答案 1 :(得分:3)

记录类型是一种可以像记录一样使用的类型。它有一组类型字段,但就是这样。 对象类型是相当不同的。它还有一组字段,但它也可以包含可在对象实例的上下文中执行的可执行方法(是的,您也可以使用静态方法)。它类似于Java中的Object。 与我见过的其他面向对象系统的一些(但肯定不是全部)差异:

  • 没有接口
  • 没有私人方法

在您的示例中,TYPE_NAME1new_type_name似乎非常相似,因为对于对象类型(TYPE_NAME1),您没有利用对象类型的任何特定内容。 有关详细信息,请参阅the Oracle page on Object Types