我修改了表的两列,现在有无效的依赖关系,我需要检查所有这些依赖关系并动态重新编译
原来是
CREATE TABLE AHO_CUENTA_AHORRO
(
ID_CUENTA NUMBER(8) NOT NULL,
ID_SOCIO NUMBER(12) NOT NULL,
ESTADO VARCHAR2(1) NOT NULL,
TASA_INTERES NUMBER(3,1) NOT NULL,
FECHA_APERTURA DATE NOT NULL,
FECHA_CANCEL DATE,
SALDO_BLOQUEADO NUMBER(12) NOT NULL,
SALDO_DISPONIBLE NUMBER(12) NOT NULL,
CONSTRAINT PK_ID_AHORRO PRIMARY KEY (ID_CUENTA)
);
ALTER TABLE AHO_CUENTA_AHORRO
ADD CONSTRAINT SOCIO_CUENTA_AHORRO_FK
FOREIGN KEY (ID_SOCIO)
REFERENCES SOC_SOCIO (ID_SOCIO);
ALTER TABLE AHO_MOVIMIENTOS_CUENTA
ADD CONSTRAINT CUENTA_AHORRO_MOVIMIENTOS
FOREIGN KEY (ID_CUENTA)
REFERENCES AHO_CUENTA_AHORRO (ID_CUENTA);
Run Code Online (Sandbox Code Playgroud)
现在我添加了这个
ALTER TABLE AHO_CUENTA_AHORRO
ADD (
SALDO_REAL NUMBER(12) DEFAULT 0 NOT NULL,
ID_TARIFARIO NUMBER(15) DEFAULT 1 NOT NULL,
CONSTRAINT FK_TARIFA FOREIGN KEY (ID_TARIFARIO) REFERENCES TARIFARIO(ID))
Run Code Online (Sandbox Code Playgroud)
要标识无效对象,可以运行以下查询:
SELECT * FROM all_objects WHERE status = 'INVALID';
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用以下DDL手动对它们进行手动编译:
ALTER <object_type> <object_name> COMPILE;
Run Code Online (Sandbox Code Playgroud)
例如:
ALTER VIEW some_invalid_view COMPILE;
Run Code Online (Sandbox Code Playgroud)
如果您只有几个无效的对象而没有很多依赖性,则此方法可能会很好地工作。
另一种方法是调用下面的过程,该过程按依赖关系顺序编译指定架构中的无效对象。
DBMS_UTILITY.compile_schema(schema => '<your_schema>', compile_all => false);
Run Code Online (Sandbox Code Playgroud)
该compile_all => false
编译只是无效的对象。
https://docs.oracle.com/database/121/ARPLS/d_util.htm#ARPLS73226