编译自定义类型

显式地重新编译已失效的自定义类型,从而消除了隐式运行时重新编译的需要,并防止了相关的运行时编译错误和性能开销。

语法:

alter_type ::=

说明:

重新编译自定义类型,无论它是否为有效的类型。

注解

如果数据库成功地重新编译了自定义类型,则该自定义类型是有效的。否则,该自定义类型是无效的,并且数据库将返回错误。

示例:

--编译成功用例
DROP TYPE ntt;
CREATE OR REPLACE TYPE ntt IS TABLE OF INT;
/

ALTER TYPE ntt COMPILE;

DROP TYPE ntt;

--编译失败用例
DROP TABLE a;
DROP TYPE tp CASCADE;
DROP PROCEDURE sub_f1 CASCADE;

CREATE TABLE a(a int);
INSERT INTO a values(1);
CREATE OR REPLACE PROCEDURE  sub_f1 (b int) as
a int;
BEGIN
 select a into a from a;
END;
/                                                           

CREATE OR REPLACE TYPE tp IS OBJECT(att1 INT, att2 INT,
    MEMBER FUNCTION func(a INT) RETURN INT,
    MEMBER PROCEDURE proc(self tp, a INT),
    STATIC FUNCTION func RETURN INT,
    STATIC PROCEDURE proc,
    CONSTRUCTOR FUNCTION tp RETURN SELF AS RESULT);
/

CREATE OR REPLACE TYPE BODY tp IS
    MEMBER FUNCTION func(a INT) RETURN INT IS
    BEGIN
        sub_f1(1);
        RETURN self.att1 + att2 + a;
    END;
    MEMBER PROCEDURE proc(self tp, a INT) IS
    BEGIN
        DBMS_OUTPUT.PUT_LINE(self.att1 || ' ' || att2 || ' ' || a);
    END;
    STATIC FUNCTION func RETURN int IS
    BEGIN
        RETURN 1;
    END;
    STATIC PROCEDURE proc IS
    BEGIN
        DBMS_OUTPUT.PUT_LINE('static proc is called');
    END;
    CONSTRUCTOR FUNCTION tp RETURN SELF AS RESULT IS
    BEGIN
        self.att1 := 10;
        att2 := 10;
        RETURN;
    END;
END;
/

--正常编译
ALTER TYPE tp COMPILE;

DROP TABLE a;

--删除依赖的表,编译失败
ALTER TYPE tp COMPILE;
ERROR, Relation "A" does not exist


DROP TYPE tp CASCADE;
DROP PROCEDURE sub_f1 CASCADE;