Yth.
Saya mempunyai implementasi ORACLE DATABASE sbb:
1. SCHEMA=>HIS_DATA=>TRIGGERS=>DATA_AFTER_IDU status VALID
2. SCHEMA=>HIS_DATA=>TRIGGERS=>DATA_BEFORE_IDU status INVALID
3. SCHEMA=>HIS_DATA=>TRIGGERS=>JOB_DATA_BEFORE_I status INVALID
4. SCHEMA=>HIS_DATA=>PACKAGE BODIES=>TIME_SERIES_MASK status INVALID
5. SCHEMA=>HIS=>SEQUENCES=>DATA_SEQUENCE dependent on 
HIS.IMPORT_UNIT_UNIT_BEFORE_I, HIS.JOB_TS_BEFORE_I, HIS.JOB_TS_BEFORE_IDU, 
HIS.PARAMETER_AFTER_I and HIS.STATION_AFTER_I

Muncul ORA-04098 Trigger HIS.JOB_DATA_BEFORE_I
Saya sdh mencoba ALTER TRIGGER [OBJECT] COMPILE, muncul error
JOB_DATA_BEFORE_I, show errors: DATA_SEQUENCE.NEXTVAL must be DECLARED
DATA_BEFORE_IDU, show errors: DATA_SEQUENCE.NEXTVAL, 
TIME_SERIES_MASK.INSERTTSBASIC, TIME_SERIES_MASK.CALCULATEDERIVEDTS, 
TIME_SERIES_MASK.ADAPTAVAILABLEINTERVAL must be DECLARED
Mohon bantuan PARA PAKAR ORACLE utk menjadikan INVALID menjadi VALID dan kami 
sertakan file scriptnya , terima Kasih

Hormat saya,
SYAM


      
____________________________________________________________________________________
Get easy, one-click access to your favorites. 
Make Yahoo! your homepage.
http://www.yahoo.com/r/hs 
  ----------

tabel JOB_DATA_BEFORE_I

BEGIN
DECLARE NextPk NUMBER(15);
BEGIN
        IF INSERTING THEN
                IF :NEW.JOB_DATA_PK IS NULL THEN
                        SELECT DATA_SEQUENCE.NEXTVAL
                        INTO  NextPk
                        FROM SYS.DUAL;
                        :NEW.JOB_DATA_PK := NextPk;
                END IF;
        END IF;
END;
END JOB_DATA_BEFORE_I;

Tabel DATA_BEFORE_IDU

DECLARE

        boolDerivedInsert                               BOOLEAN := FALSE;
        boolDerivedDelete                               BOOLEAN := FALSE;
        boolTSOldAdaptAvailable         BOOLEAN := FALSE;
        boolTSNewAdaptAvailable         BOOLEAN := FALSE;
        boolIncAvailableCount           BOOLEAN := FALSE;
        boolDecAvailableCount           BOOLEAN := FALSE;
        NextPk NUMBER(15);
        lngTSOldBasicNumber             NUMBER;
        lngTSNewBasicNumber             NUMBER;

BEGIN

        DBMS_OUTPUT.PUT_LINE('BEFORE TRIGGER');

        IF (INSERTING) THEN

                DBMS_OUTPUT.PUT_LINE('  In INSERTING ' || :NEW.TIME_SERIES_PK);

                IF (:NEW.DATA_PK IS NULL) THEN
                        SELECT DATA_SEQUENCE.NEXTVAL
                        INTO  NextPk
                        FROM SYS.DUAL;
                        :NEW.DATA_PK := NextPk;
                END IF;

                boolIncAvailableCount := (:NEW.VERSION = 1);
                boolDerivedInsert := (:NEW.VALID_STATUS_PK = -1) AND 
(:NEW.ACTUAL = -1);

                TIME_SERIES_MASK.InsertTSBasic(:NEW.TIME_SERIES_PK);
                boolTSNewAdaptAvailable:= TRUE;

        ELSIF (DELETING) THEN

                DBMS_OUTPUT.PUT_LINE('In DELETING');

                IF (:OLD.ACTUAL = -1) THEN
                        RAISE_APPLICATION_ERROR(-20000,'You cannot delete an 
actual data point');
                END IF;

                -- IF you have 3 versions of a data point, you must do this:
                -- VERSION 3 --> ACTUAL = 0
                -- REMOVE V3
                -- REMOVE V2
                -- REMOVE V1 --> decrease the number of data points

                IF (:OLD.VERSION = 1) Then
                        TIME_SERIES_MASK.InsertTSBasic(:OLD.TIME_SERIES_PK);
                        boolDecAvailableCount := TRUE;
                        boolTSOldAdaptAvailable:= TRUE;
                END IF;

        ELSIF (UPDATING) THEN

                DBMS_OUTPUT.PUT_LINE('  In UPDATING');

                IF (:OLD.VERSION <> :NEW.VERSION) THEN
                        RAISE_APPLICATION_ERROR(-20001,'You cannot modify the 
version of a data point');
                END IF;

                IF (:OLD.TIME_SERIES_PK = :NEW.TIME_SERIES_PK) THEN

                        TIME_SERIES_MASK.InsertTSBasic(:NEW.TIME_SERIES_PK);
                        boolTSOldAdaptAvailable:= TRUE;

                        IF (:OLD.TIME <> :NEW.TIME) OR (:OLD.VALUE <> 
:NEW.VALUE) OR
                                (:OLD.VALID_STATUS_PK <> :NEW.VALID_STATUS_PK) 
OR (:OLD.ACTUAL <> :NEW.ACTUAL) THEN

                                boolDerivedDelete := (:OLD.VALID_STATUS_PK = 
-1) AND (:OLD.ACTUAL = - 1);
                                boolDerivedInsert := (:NEW.VALID_STATUS_PK = 
-1) OR (:NEW.ACTUAL = -1);

                        END IF;

                ELSE

                        TIME_SERIES_MASK.InsertTSBasic(:NEW.TIME_SERIES_PK);
                        TIME_SERIES_MASK.InsertTSBasic(:OLD.TIME_SERIES_PK);

                        boolTSOldAdaptAvailable:= TRUE;
                        boolTSNewAdaptAvailable:= TRUE;

                        boolDerivedDelete := (:OLD.VALID_STATUS_PK = -1) AND 
(:OLD.ACTUAL = - 1);
                        boolDerivedInsert := (:NEW.VALID_STATUS_PK = -1) OR 
(:NEW.ACTUAL = -1);

                        -- If there is more than one version from a data point 
and you change the
                        -- Time_Series_PK, then the number of data points for 
the old time series must
                        -- not be decreased. Only if there is only one Version.
                        -- Problem: The one version could be for example number 
4, if the recent three
                        --      Versions were deleted. Select Count(*) must be 
executed.

                        IF (:OLD.VERSION = 1) THEN
                                boolDecAvailableCount :=TRUE;
                        END IF;

                        -- Problem: In the new Time Series, there could already 
exist a data point with
                        -- this time --> the Version would have to be found 
with SELECT MAX(VERION)
--                      IF :NEW.ACTUAL = -1 THEN
--                              dbl_INC_AVAILABLE_COUNT := 1;
--                      END IF;
                END IF;

        END IF;

        IF (boolDerivedInsert) THEN
                
TIME_SERIES_MASK.CalculateDerivedTS(:NEW.TIME_SERIES_PK,'INSERT',:NEW.VALUE,:NEW.TIME);
        END IF;
        IF (boolTSNewAdaptAvailable) THEN
                
TIME_SERIES_MASK.AdaptAvailableInterval(:NEW.TIME_SERIES_PK,boolIncAvailableCount,boolDecAvailableCount,:NEW.TIME);
        END IF;

--      IF (boolDerivedDelete) THEN
--              
TIME_SERIES_MASK.CalculateDerivedTS(:OLD.TIME_SERIES_PK,'DELETE',:OLD.VALUE,:OLD.TIME);
--      END IF;
        IF (boolTSOldAdaptAvailable) THEN
                
TIME_SERIES_MASK.AdaptAvailableInterval(:OLD.TIME_SERIES_PK,boolIncAvailableCount,boolDecAvailableCount,:OLD.TIME);
        END IF;

END;

tabel DATA_AFTER_IDU
DECLARE
        i                                               NUMBER;
        boolUpdate                              BOOLEAN;
        TSBasic                                 DATA_TRIGGER.Type_TSBasic;
        TSDerived                               DATA_TRIGGER.Type_TSDerived;
        TSInterval                              DATA_TRIGGER.Type_TSInterval;
        TSBasic_NUM                             BINARY_INTEGER := 0;
        dbl_DATA_AVAILABLE      NUMBER:=0;
BEGIN

        --DBMS_OUTPUT.PUT_LINE(' ');
        DBMS_OUTPUT.PUT_LINE('AFTER TRIGGER');
        DBMS_OUTPUT.PUT_LINE('  Anzahl TSBasic ' ||     
DATA_TRIGGER.TSBasic_NUM);
        DBMS_OUTPUT.PUT_LINE('  Anzahl TSDerived ' ||   
DATA_TRIGGER.TSDerived_NUM);
        DBMS_OUTPUT.PUT_LINE('  Anzahl TSInterval ' ||  
DATA_TRIGGER.TSInterval_NUM);

        FOR i IN 1..DATA_TRIGGER.TSInterval_NUM LOOP

                TSInterval:=DATA_TRIGGER.TSInterval(i);

                --  DBMS_OUTPUT.PUT_LINE('TS: ' || 
DATA_TRIGGER.TSInterval(lng_LOOPINDEX).TIME_SERIES_PK);
                DBMS_OUTPUT.PUT_LINE('DATA_RESULT_PK: ' || 
TSInterval.DATA_RESULT_PK );

                IF  (TSInterval.OPERATION_PK = 1081987) THEN

                        --   DBMS_OUTPUT.PUT_LINE('MINIMUM neu eruieren');

                        UPDATE  DATA_RESULT
                        SET   VALUE =( SELECT /*+ INDEX(data 
data_ts_time_actual_vs_i) */ MIN(VALUE)
                                                                FROM DATA
                                                                WHERE 
DATA.TIME_SERIES_PK = TSInterval.TIME_SERIES_PK_BASIC
                                                                AND TIME >= 
TSInterval.TIME_FROM
                                                                AND TIME < 
TSInterval.TIME_TO
                                                                AND ACTUAL = -1
                                                                AND 
VALID_STATUS_PK = -1)
                        WHERE  DATA_RESULT_PK = TSInterval.DATA_RESULT_PK;

                ELSIF (TSInterval.OPERATION_PK = 1081988) THEN

                        --   DBMS_OUTPUT.PUT_LINE('Maximum neu eruieren');
                        --   
DBMS_OUTPUT.PUT_LINE(DATA_TRIGGER.V_UpdateTS(i).TIME_FROM);
                        --   
DBMS_OUTPUT.PUT_LINE(DATA_TRIGGER.V_UpdateTS(i).TIME_TO);

                        UPDATE  DATA_RESULT
                        SET   VALUE =(  SELECT /*+ INDEX(data 
data_ts_time_actual_vs_i) */ MAX(VALUE)
                                                        FROM DATA
                                                        WHERE 
DATA.TIME_SERIES_PK = TSInterval.TIME_SERIES_PK_BASIC
                                                        AND TIME >= 
TSInterval.TIME_FROM
                                                        AND TIME < 
TSInterval.TIME_TO
                                                        AND ACTUAL = -1
                                                        AND VALID_STATUS_PK = 
-1)
                        WHERE  DATA_RESULT_PK = TSInterval.DATA_RESULT_PK;

                ELSIF (TSInterval.OPERATION_PK =        1081985) THEN

                        UPDATE  DATA_RESULT
                        SET   VALUE =( SELECT /*+ INDEX(data 
data_ts_time_actual_vs_i) */ SUM(VALUE)
                                                                FROM DATA
                                                                WHERE 
DATA.TIME_SERIES_PK = TSInterval.TIME_SERIES_PK_BASIC
                                                                AND TIME >= 
TSInterval.TIME_FROM
                                                                AND TIME < 
TSInterval.TIME_TO
                                                                AND ACTUAL = -1
                                                                AND 
VALID_STATUS_PK = -1)
                        WHERE  DATA_RESULT_PK = TSInterval.DATA_RESULT_PK;

                ELSIF (TSInterval.OPERATION_PK =  1081992) THEN

                        UPDATE  DATA_RESULT
                        SET   VALUE =( SELECT /*+ INDEX(data 
data_ts_time_actual_vs_i) */ COUNT(*)
                                                FROM DATA
                                                                WHERE 
DATA.TIME_SERIES_PK = TSInterval.TIME_SERIES_PK_BASIC
                                                                AND TIME >= 
TSInterval.TIME_FROM
                                                                AND TIME < 
TSInterval.TIME_TO
                                                                AND ACTUAL = -1
                                                                AND 
VALID_STATUS_PK = -1)
                        WHERE  DATA_RESULT_PK = TSInterval.DATA_RESULT_PK;

                END IF;
        END LOOP;


        FOR i IN 1..DATA_TRIGGER.TSDerived_NUM LOOP
                TSDerived:=DATA_TRIGGER.TSDerived(i);
                IF (TSDerived.CHANGED = -1) THEN
                        DBMS_OUTPUT.PUT_LINE('     Adapt Change Interval ' ||   
i || ' - ' || TSDerived.TIME_SERIES_PK);
                        UPDATE TIME_SERIES
                        SET     DATE_CHANGED_MIN = TSDerived.DATE_CHANGED_MIN,
                                        DATE_CHANGED_MAX = 
TSDerived.DATE_CHANGED_MAX,
                                        DATE_CHANGED_COUNT = DATE_CHANGED_COUNT 
+ 1,
                                        DATE_CHANGED_LAST = SYSDATE,
                                        CHANGED = -1
                        WHERE TIME_SERIES_PK = TSDerived.TIME_SERIES_PK;
                END IF;
        END LOOP;


        FOR i IN 1..DATA_TRIGGER.TSBasic_NUM LOOP
                TSBasic:=DATA_TRIGGER.TSBasic(i);
                TSBasic_NUM:=DATA_TRIGGER.TSBasic_NUM;

                --DBMS_OUTPUT.PUT_LINE('     TSBasic ' ||       i || ' - ' || 
TSBasic.TIME_SERIES_PK);
                --DBMS_OUTPUT.PUT_LINE('       COUNT : '   || 
TSBasic.DATE_AVAILABLE_COUNT);
                --DBMS_OUTPUT.PUT_LINE('       FROM : '   || 
TSBasic.DATE_AVAILABLE_FROM);
                --DBMS_OUTPUT.PUT_LINE('       TO : '   || 
TSBasic.DATE_AVAILABLE_TO);

                IF (TSBasic.CHANGED) THEN
                        --DBMS_OUTPUT.PUT_LINE('  Count ' || 
TSBasic.TIME_SERIES_PK || ' ' || TSBasic.DATE_AVAILABLE_COUNT );

                IF (TSBasic.DATE_AVAILABLE_COUNT <> 0) OR 
(TSBasic.DATE_AVAILABLE_FROM IS NOT NULL) THEN
                        dbl_DATA_AVAILABLE:=0;
                        IF (TSBasic.DATE_AVAILABLE_COUNT > 0) THEN
                                dbl_DATA_AVAILABLE:=-1;
                        END IF;

                        UPDATE TIME_SERIES
                        SET     DATE_AVAILABLE_COUNT = 
TSBasic.DATE_AVAILABLE_COUNT,
                                        DATA_AVAILABLE = dbl_DATA_AVAILABLE,
                                        DATE_AVAILABLE_FROM = 
TSBasic.DATE_AVAILABLE_FROM,
                                        DATE_AVAILABLE_TO = 
TSBasic.DATE_AVAILABLE_TO,
                                        DATE_CHANGED_LAST = SYSDATE
                        WHERE TIME_SERIES_PK = TSBasic.TIME_SERIES_PK;
                END IF;

                IF (TSBasic.DATA_POINT_DELETED = TRUE) THEN
                        --DBMS_OUTPUT.PUT_LINE('       DP DELETED');
                                UPDATE TIME_SERIES
                                SET     DATE_AVAILABLE_FROM = ( SELECT /*+ 
INDEX(data data_ts_time_actual_vs_i) */ MIN(TIME)
                                                                                
                                FROM DATA
                                                                                
                                WHERE TIME_SERIES_PK = 
TIME_SERIES.TIME_SERIES_PK),
                                                DATE_AVAILABLE_TO =  (  SELECT 
/*+ INDEX(data data_ts_time_actual_vs_i) */ MAX(TIME)
                                                                                
                                FROM DATA
                                                                                
                                WHERE TIME_SERIES_PK = 
TIME_SERIES.TIME_SERIES_PK)
                                WHERE TIME_SERIES_PK = TSBasic.TIME_SERIES_PK;
                END IF;
                END IF;
        END LOOP;

        DATA_TRIGGER.TSDerived_NUM:=0;
        DATA_TRIGGER.TSBasic_NUM:=0;
        DATA_TRIGGER.TSInterval_NUM:=0;
        DATA_TRIGGER.TSBasic_TSDerived_NUM:=0;

END;

[Non-text portions of this message have been removed]

Kirim email ke