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
格式如下:plsql_type_body_source
格式如下:plsql_type_body_decl_list_semicolon
格式如下:plsql_type_body_decl_list
格式如下:plsql_type_body_decl
格式如下:subprog_decl_in_type
格式如下:proc_or_func_def_in_type
格式如下:constructor_def_in_type
格式如下:map_order_function_spec
格式如下:
语义
语法 | 关键字或语法节点 | 说明 |
---|---|---|
create_type_body_stmt | OR 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 函数除隐式 | |
ORDER MEMBER | 指定一个 ORDER 成员函数,该函数将对象的实例作为显式参数和隐式 SELF 参数,并返回负整数、零或正整数,分别表示隐式 SELF 参数小于、等于或大于显式参数。 如果 ORDER 方法的任何一个参数为 null,则ORDER 方法返回 null,并且不会调用该方法。 在 ORDER BY 子句中比较具有相同 ADT 定义的实例时,数据库将调用 对象规范只能包含一个ORDER 方法,该方法必须是具有返回类型 NUMBER 的函数。 | |
proc_or_func_def_in_type | proc_or_func_def_in_type | 存储过程或函数定义。 |
constructor_def_in_type | constructor_def_in_type | 用户定义的构造函数声明。构造函数的 RETURN 子句必须为 |
示例
obclient>CREATE TYPE demo_typ2 AS OBJECT (
a1 NUMBER,
MEMBER FUNCTION get_square RETURN NUMBER
);
/
Query OK, 0 rows affected (0.16 sec)
obclient>CREATE OR REPLACE TYPE BODY demo_typ2 IS
MEMBER FUNCTION get_square RETURN NUMBER IS
BEGIN
RETURN a1;
END;
END;
/
Query OK, 0 rows affected (0.10 sec)