2017-10-17 54 views
3

我創建了一個包含成員函數的類型。而且我也爲該成員函數創建了主體類型。我需要一種方法來刪除正文和成員函數。落下屍體被執行。但不能刪除成員函數。那麼任何人都可以幫忙嗎?在oracle中刪除類型裏的成員方法

回答

1

你不能放棄它,因爲Type被用在你的任何Object定義中的某個地方。請參見下面的演示:

--create類型

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

--Created式車身

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身型。它得到了下降

DROP TYPE BODY EXMPL_Type; 

--getting錯誤

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'; 
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 | 

如果類型具有依賴類型,那麼在重新編譯該類型之前需要先刪除它們,然後重新創建它們。