CREATE TYPE BODY 用于定义或实现由 CREATE TYPE 所创建的类型规范中的成员方法。

对于没有在 call_spec 的类型规范中指定的方法,必须在类型主体中指定相应的方法主体。

前提条件

在 ADT 的 CREATE TYPE 中,每个成员声明必须在 CREATE TYPE 或 CREATE TYPE BODY 定义中具有相应的构造。

要在 Schema 中创建或替换类型主体,您必须具有 CREATE TYPE 或 CREATE ANY TYPE 的系统权限。要在其他用户的 Schema 中创建类型,您必须具有 CREATE ANY TYPE 的系统权限。要替换另一个用户的 Schema 中的类型,您必须具有 DROP ANY TYPE 的系统权限。

语法

说明

本章节只包含部分重点语法节点的格式。

  • create_type_body_stmt 格式如下:

    create_type_body_stmt

  • plsql_type_body_source 格式如下:

    plsql_type_body_source

  • plsql_type_body_decl_list_semicolon 格式如下:

    3plsql_type_body_decl_list_semicolon

  • plsql_type_body_decl_list 格式如下:

    4plsql_type_body_decl_list

  • plsql_type_body_decl 格式如下:

    5plsql_type_body_decl

  • subprog_decl_in_type 格式如下:

    6subprog_decl_in_type

  • proc_or_func_def_in_type 格式如下:

    8proc_or_func_def_in_type

  • constructor_def_in_type 格式如下:

    9constructor_def_in_type

  • map_order_function_spec 格式如下:

    7map_order_function_spec

语义

语法

关键字或语法节点

说明

create_type_body_stmt

OR REPLACE

重新创建该类型主体(如果存在),然后重新编译。

在重新定义类型主体之前被授予权限的用户仍然可以访问该类型主体,而无需重新获得权限。

您可以使用此子句将成员子程序定义添加到 ALTER TYPE … REPLACE 定义的规范中。

plsql_type_body_source

pl_schema_name

包含类型主体的 Schema 名称。默认值为您的 Schema。

TYPE

ADT 的名称。

subprog_decl_in_type

subprog_decl_in_type

与类型规范关联的功能或存储过程的类型。

您必须在类型规范中为每个存储过程或函数定义一个对应的方法名称和可选参数列表。对于函数,还必须指定一个返回类型。

map_order_function_spec

map_order_function_spec

您可以定义一种 MAP 方法或 ORDER 方法,而无需考虑定义了多少 MEMBER 或 STATIC 方法。

如果定义了 MAP 或 ORDER 方法,则可以在 SQL 中比较对象实例。如果未定义任何方法,则只能比较对象实例是否相等。只有每个类型的对应属性对都相同时,相同类型定义的实例才相等。

MAP MEMBER

定义或实现 MAP 成员函数,该函数返回给定实例在所有实例中的相对位置。MAP 方法被隐式调用,并通过将对象实例映射到预定义标量类型的值来指定其顺序。PL 使用该顺序来评估布尔表达式并执行比较。

如果 MAP 方法的参数为 null,则 MAP 方法返回 null,并且不会调用该方法。

类型主体只能包含一个MAP 方法,该方法必须是一个函数。MAP 函数除隐式SELF参数外不能具有其他参数。

ORDER MEMBER

指定一个 ORDER 成员函数,该函数将对象的实例作为显式参数和隐式 SELF 参数,并返回负整数、零或正整数,分别表示隐式 SELF 参数小于、等于或大于显式参数。

如果 ORDER 方法的任何一个参数为 null,则ORDER 方法返回 null,并且不会调用该方法。

在 ORDER BY 子句中比较具有相同 ADT 定义的实例时,数据库将调用 ORDER MEMBER sqlj_func_decl

对象规范只能包含一个ORDER 方法,该方法必须是具有返回类型 NUMBER 的函数。

proc_or_func_def_in_type

proc_or_func_def_in_type

存储过程或函数定义。

constructor_def_in_type

constructor_def_in_type

用户定义的构造函数声明。构造函数的 RETURN 子句必须为 RETURN SELF AS RESULT。此设置表明构造函数返回的值的最接近类型是传递给构造函数的 SELF参数。

示例

  1. obclient>CREATE TYPE demo_typ2 AS OBJECT (
  2. a1 NUMBER,
  3. MEMBER FUNCTION get_square RETURN NUMBER
  4. );
  5. /
  6. Query OK, 0 rows affected (0.16 sec)
  7. obclient>CREATE OR REPLACE TYPE BODY demo_typ2 IS
  8. MEMBER FUNCTION get_square RETURN NUMBER IS
  9. BEGIN
  10. RETURN a1;
  11. END;
  12. END;
  13. /
  14. Query OK, 0 rows affected (0.10 sec)