编译自定义类型¶
显式地重新编译已失效的自定义类型,从而消除了隐式运行时重新编译的需要,并防止了相关的运行时编译错误和性能开销。
语法:
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;