Oracle中"create or replace type"和"type type_name is..."语法有什么区别?

5

我是一个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个回答

7
除了前面的答案外,声明的范围还有显著的差异。
当您在PL/SQL中声明类型(例如您示例中的记录类型)时,它只能从PL/SQL中使用。如果它在过程或函数中本地声明,则只能在该子程序中使用;如果它在包体中声明,则只能在该包中使用;如果它在包头中声明,则可以被具有对该包的执行访问权限的任何PL/SQL代码使用。无论如何,它都不能在SQL语句中引用,即使是嵌入在PL/SQL代码中的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)

请点击此处查看有关 CREATE TYPE 语句的文档以及有关对象类型各种用途的进一步文档引用。


3
记录类型是一种可以像记录一样使用的类型。它具有一组类型化的字段,但仅限于此。 对象类型则有所不同。它也有一组字段,但还可以包含可执行方法,在对象实例的上下文中执行(是的,您也可以拥有静态方法)。它类似于Java中的对象。 与我见过的其他面向对象系统相比,有一些(但肯定不是全部)差异:
  • 没有接口
  • 没有私有方法
在您的示例中,TYPE_NAME1和new_type_name似乎非常相似,因为对于对象类型(TYPE_NAME1),您没有利用任何特定于对象类型的内容。 有关更多信息,请参见Oracle关于对象类型的页面

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接