PLSQL Object Dependence

来源:互联网 发布:软件功能规格说明书 编辑:程序博客网 时间:2024/06/18 05:28


CREATE VIEW V_EMP AS SELECT * FROM EMPLOYEES; ビューが作成されました。

/**********************************************/-- V_EMPビューに依存するファンクションFUNC1/**********************************************/CREATE OR REPLACE FUNCTION  FUNC1 RETURN NUMBERIS    NUM  NUMBER;BEGIN    SELECT SUM(SALARY) INTO NUM FROM V_EMP;    RETURN NUM;END;/ ファンクションが作成されました。

/***************************************************/-- ファンクションFUNC1に依存するプロシージャPROC1/***************************************************/CREATE OR REPLACE PROCEDURE PROC1ISBEGIN   DBMS_OUTPUT.PUT_LINE(FUNC1);END;/ プロシージャが作成されました。

SELECT OBJECT_NAME, OBJECT_TYPE, STATUS FROM USER_OBJECTSWHERE  OBJECT_NAME IN ('EMPLOYEES','V_EMP','FUNC1','PROC1')/ OBJECT_NAM OBJECT_TYPE         STATUS---------- ------------------- -------EMP        TABLE               VALIDV_EMP      VIEW                VALIDFUNC1      FUNCTION            VALIDPROC1      PROCEDURE           VALID


RENAME EMPLOYEES TO EMPLOYEES2; 表名が変更されました。


  1  SELECT OBJECT_NAME, OBJECT_TYPE, STATUS FROM USER_OBJECTS  2* WHERE  OBJECT_NAME IN ('EMPLOYEES2','V_EMP','FUNC1','PROC1')SQL> / OBJECT_NAM OBJECT_TYPE         STATUS---------- ------------------- -------EMPLOYEES2       TABLE               VALIDV_EMP      VIEW                INVALIDFUNC1      FUNCTION            INVALIDPROC1      PROCEDURE           INVALID


EXEC PROC1 行1でエラーが発生しました。:ORA-06550: 行1、列7:PLS-00905: オブジェクト'HR.PROC1'が無効です。ORA-06550: 行1、列7:PL/SQL: Statement ignored


SQL> RENAME EMPLOYEES2 TO EMPLOYEES; 表名が変更されました。


SELECT OBJECT_NAME, OBJECT_TYPE, STATUS FROM USER_OBJECTSWHERE  OBJECT_NAME IN ('EMPLOYEES','V_EMP','FUNC1','PROC1')/ OBJECT_NAM OBJECT_TYPE         STATUS---------- ------------------- -------EMPLOYEES        TABLE               VALIDV_EMP      VIEW                INVALIDFUNC1      FUNCTION            INVALIDPROC1      PROCEDURE           INVALID


では再コンパイルをするまで、PROC1プロシージャは実行できないのかというと、そうではありません。INVALID状態のプログラムを実行すると自動的に再コンパイルが行われるからです。その場合、依存性の川上の方から順番に再コンパイルされます。すなわち、まずV_EMPビューが再コンパイルされてVALIDになる。次に、FUNC1ファンクションが再コンパイルされてVALIDになる。そしてPROC1プロシージャが再コンパイルされてVALIDになり実行されるわけです。


SET SERVEROUTPUT ON    --画面出力を可能にしてEXEC PROC1             -- PROC1プロシージャをコール

SELECT OBJECT_NAME, OBJECT_TYPE, STATUS FROM USER_OBJECTSWHERE  OBJECT_NAME IN ('EMPLOYEES','V_EMP','FUNC1','PROC1')/ OBJECT_NAM OBJECT_TYPE         STATUS---------- ------------------- -------EMPLOYEES        TABLE               VALIDV_EMP      VIEW                VALIDFUNC1      FUNCTION            VALIDPROC1      PROCEDURE           VALID


0 0
原创粉丝点击