在oracle中删除类型内的成员方法

时间:2017-10-17 08:02:52

标签: oracle

我创建了一个包含成员函数的类型。而且我还为该成员函数创建了体型。我需要一种方法来放弃身体和成员的功能。落下身体被执行了。但是不能放弃会员功能。那么任何人都可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

您无法删除它,因为Type用于任何对象定义中的某个位置。见下面的演示:

- 创建类型

CREATE OR REPLACE TYPE EXMPL_Type AS OBJECT
(
   Team VARCHAR2 (30),
   TeamScore NUMBER (1),
   MAP MEMBER FUNCTION team_rating
      RETURN NUMBER
);
/

- 创建的类型正文

CREATE OR REPLACE TYPE BODY EXMPL_Type
AS
   MAP MEMBER FUNCTION team_rating
      RETURN NUMBER
   IS
      avg_score   NUMBER;
   BEGIN
      SELECT AVG (TeamScore)
        INTO avg_score
        FROM Team_Table ;

      RETURN avg_score;
   END;
END;
/

- 创建一个类型为

的表
CREATE TABLE ABC OF EXMPL_TYPE;

- Dropping Type body。它被放弃了

DROP TYPE BODY EXMPL_Type;

- 收到错误

DROP TYPE EXMPL_Type;

错误:

SQL>     DROP TYPE EXMPL_Type;
    DROP TYPE EXMPL_Type
*
ERROR at line 1:
ORA-02303: cannot drop or replace a type with type or table dependents

所以你需要先删除dependent个对象。就我而言,它是我创建的table。因此我放弃了它;

SQL>  DROP TABLE ABC;

Table dropped.

SQL>  DROP TYPE EXMPL_Type;

Type dropped.

您可以在DBA_DEPENDENCIES表中找到依赖对象:见下文:

SELECT REFERENCED_NAME, REFERENCED_TYPE
  FROM DBA_DEPENDENCIES
 WHERE name = 'EXMPL_TYPE';

答案 1 :(得分:0)

您需要编辑类型规范和正文以删除成员函数(或删除正文),然后重新编译规范(如果仍需要,则重新编译正文)。

SQL Fiddle

Oracle 11g R2架构设置

CREATE TYPE test_type IS OBJECT(
  value NUMBER,
  MEMBER FUNCTION getValue RETURN NUMBER
)
/

CREATE TYPE BODY test_type IS 
  MEMBER FUNCTION getValue RETURN NUMBER
  IS BEGIN RETURN self.value; END;
END;
/

DROP TYPE BODY test_type
/

CREATE OR REPLACE TYPE test_type IS OBJECT(
  value NUMBER
)
/

查询1

SELECT object_name, status
FROM   user_objects

<强> Results

| OBJECT_NAME | STATUS |
|-------------|--------|
|   TEST_TYPE |  VALID |

如果类型具有依赖类型,则需要在重新编译类型之前删除它们,然后重新创建它们。