2017-04-26 70 views
0

我有一些軟件包會刪除某些表中的數據。我創建了具有函數的包,用另一個表和程序用初始化邏輯進行審計。我停下了奇怪的Ora錯誤。也許你知道這裏有什麼可能是錯的。Oracle軟件包錯誤

這是規格:

CREATE OR REPLACE PACKAGE CLIENT_DELETE_PACKAGE 
IS 
    deletion_results VARCHAR2(200); 
    deletedEntries  NUMBER; 
    min_date   DATE; 
    max_date   DATE; 
    -- Enable/disable logging 
    Enable_Audit_Trail BOOLEAN := True; 
    -- Enable Safe Mode 
    Enable_Safe_Mode BOOLEAN := True; 
    PROCEDURE AUDIT_TRAIL(
     MyTYPE  IN VARCHAR2, 
     MyDATA  IN VARCHAR2, 
     MyDatasource IN VARCHAR2, 
     MyResultData IN VARCHAR2); 
    -- ECHO Check that the package is available. 
    FUNCTION ECHO(
     MyDATA IN VARCHAR2) 
    RETURN VARCHAR2; 
    -- JOB_REQUEST 
    FUNCTION DEL_WLM_ALERT(
     MyAlertKey IN NUMBER) 
    RETURN VARCHAR2; 
    PROCEDURE INIT; 
END CLIENT_DELETE_PACKAGE; 
/

而且身體:

CREATE OR REPLACE PACKAGE BODY CLIENT_DELETE_PACKAGE 
AS 
    -- Auditing 
    PROCEDURE AUDIT_TRAIL(
     MyTYPE  IN VARCHAR2, 
     MyDatasource IN VARCHAR2, 
     MyResultData IN VARCHAR2) 
    AS 
    --allow to keep the entry even if a roll-back occurs in the other procedure. 
    pragma autonomous_transaction; 
    BEGIN 
    /*ID: provided by sequence 
    EVENT_TIME: default value SysDate 
    TYPE: DELETED/LOCKED ITEM 
    DATASOURCE_NAME: datasource name 
    RESULT_DATA: data link to type 
    */ 
    IF (Enable_Audit_Trail) THEN 
     INSERT INTO CLIENT_DELETION_AUDIT 
     (id, TYPE, DATASOURCE_NAME, RESULT_DATA 
     ) 
     SELECT SEQ_AUDIT_TRAIL.NEXTVAL, MyTYPE, MyDatasource, MyResultData FROM dual; 
     COMMIT; 
    END IF; 
    END AUDIT_TRAIL; 
-- ------------------------------------------------------------------------- 
-- Echoing function 
-- ------------------------------------------------------------------------- 
    FUNCTION ECHO(
     MyDatasource IN VARCHAR2) 
    RETURN VARCHAR2 
    AS 
    BEGIN 
    /*check if the package is available */ 
    RETURN 'i am here'; 
    END ECHO; 
-- ------------------------------------------------------------------------- 
-- Delete WLM Alert Data 
-- ------------------------------------------------------------------------- 
    FUNCTION DEL_WLM_ALERT(
     MyAlertKey IN NUMBER) 
    RETURN VARCHAR2 
    AS 
    countLookUp  NUMBER; 
    countTotalEntries NUMBER; 
    deletedEntries NUMBER; 
    dataSourceToCheck VARCHAR2(200); 
    numberOfAlertLeft NUMBER; 
    alert_trx_id  NUMBER; 
    trx_group_id  NUMBER; 
    large_str_id  NUMBER; 
    BEGIN 
    countTotalEntries:=0; 
    deletedEntries :=0; 
    ---Get transaction ID for usage later--- 
    SELECT TRANSACTION_ID 
    INTO alert_trx_id 
    FROM WLM_RULE_ALERT WRA 
    JOIN WLM_ALERT_HEADER WAH 
    ON WAH.ALERT_IDENTIFIER = WRA.ALERT_IDENTIFIER 
    WHERE wah.alert_key  = MyAlertKey 
    AND rownum    =1; 
    ---Get transaction GRoup ID for usage later--- 
    SELECT TRANSACTION_GROUP_ID 
    INTO trx_group_id 
    FROM ALERTING_TRANSACTION AT 
    JOIN WLM_RULE_ALERT WRA 
    ON WRA.TRANSACTION_ID = AT.ID 
    JOIN WLM_ALERT_HEADER WAH 
    ON WAH.ALERT_IDENTIFIER = WRA.ALERT_IDENTIFIER 
    WHERE wah.alert_key  = MyAlertKey 
    AND rownum    =1; 
    ---Get LargeString ID for usage later--- 
    SELECT MIN(tg.largestring_id) 
    INTO large_str_id 
    FROM transaction_group tg 
    WHERE tg.ID = trx_group_id 
    AND rownum =1; 
    -- deleted from ALERT_MATCH_DATA -- 
    DELETE 
    FROM ALERT_MATCH_DATA AMD 
    WHERE ALERT_MATCH_ID IN 
     (SELECT AM.ID 
     FROM ALERT_MATCH AM 
     JOIN WLM_RULE_ALERT WRA 
     ON WRA.id = AM.WLM_RULE_ALERT_ID 
     JOIN WLM_ALERT_HEADER WAH 
     ON WAH.ALERT_IDENTIFIER = WRA.ALERT_IDENTIFIER 
     WHERE wah.alert_key  = MyAlertKey 
    ); 
    -- deleted from ALERT_MATCH -- 
    DELETE 
    FROM ALERT_MATCH AM 
    WHERE AM.WLM_RULE_ALERT_ID IN 
     (SELECT WRA.id 
     FROM WLM_RULE_ALERT WRA 
     JOIN WLM_ALERT_HEADER WAH 
     ON WAH.ALERT_IDENTIFIER = WRA.ALERT_IDENTIFIER 
     WHERE wah.alert_key  = MyAlertKey 
    ); 
    deletedEntries  :=deletedEntries+SQL%ROWCOUNT; 
    IF(numberOfAlertLeft =0) THEN 
     -- deleted from DATA_SOURCE_CUSTOMER -- 
     DELETE 
     FROM DATA_SOURCE_CUSTOMER DSC 
     WHERE ID  = alert_trx_id; 
     deletedEntries:=deletedEntries+SQL%ROWCOUNT; 
     -- deleted from DATA_SOURCE_SWIFT -- 
     DELETE 
     FROM DATA_SOURCE_SWIFT DSC 
     WHERE ID  = alert_trx_id; 
     deletedEntries:=deletedEntries+SQL%ROWCOUNT; 
     -- deleted from ALERTING_TRANSACTION -- 
     DELETE 
     FROM ALERTING_TRANSACTION AT 
     WHERE AT.ID    = alert_trx_id 
     OR AT.TRANSACTION_GROUP_ID = trx_group_id; 
     deletedEntries   :=deletedEntries+SQL%ROWCOUNT; 
     IF(countLookUp   = 1) THEN 
     -- deleted from TRANSACTION_GROUP -- 
     DELETE 
     FROM TRANSACTION_GROUP AT 
     WHERE AT.ID = trx_group_id; 
     deletedEntries:=deletedEntries+SQL%ROWCOUNT; 
     -- deleted from LARGESTRING_PART -- 
     DELETE 
     FROM LARGESTRING_PART 
     WHERE LARGESTRING_ID    IN large_str_id; 
     deletedEntries  :=deletedEntries+SQL%ROWCOUNT; 
     -- deleted from LARGESTRING -- 
     DELETE 
     FROM LARGESTRING 
     WHERE id  = large_str_id; 
     deletedEntries:=deletedEntries+SQL%ROWCOUNT; 
     END IF; 
    END IF; 
    countTotalEntries:=countTotalEntries+countLookUp; 
    -- deleted from WLM_RULE_ALERT -- 
    DELETE 
    FROM WLM_RULE_ALERT WRA 
    WHERE WRA.ALERT_IDENTIFIER IN 
     (SELECT WAH.ALERT_IDENTIFIER 
     FROM WLM_ALERT_HEADER WAH 
     WHERE wah.alert_key= MyAlertKey 
    ); 
    deletedEntries:=deletedEntries+SQL%ROWCOUNT; 
    -- deleted from WLM_CUSTOMER_MATCH_DETAILS -- 
    DELETE 
    FROM WLM_CUSTOMER_MATCH_DETAILS 
    WHERE ALERT_KEY= MyAlertKey; 
    deletedEntries:=deletedEntries+SQL%ROWCOUNT; 
    -- deleted from WORKFLOW_ACTION_LOG -- 
    DELETE 
    FROM WORKFLOW_ACTION_LOG 
    WHERE WORKFLOW_WORKITEM_ID IN 
     (SELECT id 
     FROM WORKFLOW_WORKITEM 
     WHERE ENTITY_KEY=TO_CHAR(MyAlertKey) 
     AND ENTITY_NAME ='WLM Alert' 
    ); 
    deletedEntries:=deletedEntries+SQL%ROWCOUNT; 
    -- deleted from WORKFLOW_WORKITEM_LINK -- 
    DELETE 
    FROM WORKFLOW_WORKITEM_LINK 
    WHERE ENTITY_KEY=MyAlertKey 
    AND ENTITY_NAME ='WLM Alert'; 
    deletedEntries :=deletedEntries+SQL%ROWCOUNT; 
    -- deleted from WORKFLOW_WORKITEM -- 
    DELETE 
    FROM WORKFLOW_WORKITEM 
    WHERE ENTITY_KEY= TO_CHAR(MyAlertKey) 
    AND entity_name ='WLM Alert'; 
    deletedEntries :=deletedEntries+SQL%ROWCOUNT; 
    -- deleted from WLM_ALERT_HEADER -- 
    DELETE 
    FROM WLM_ALERT_HEADER 
    WHERE alert_key = MyAlertKey; 
    deletedEntries :=deletedEntries+SQL%ROWCOUNT; 
    END DEL_WLM_ALERT; 
-- initialization procedure 
    PROCEDURE INIT 
    AS 
    CURSOR alert_id 
    IS 
    WITH alerts AS 
     (SELECT wah.ALERT_KEY              AS alert_key, 
     ds.NAME                 AS datasource_name, 
     NVL(el.ENTITY_ID,0)              AS alert_key_locked, 
     MIN(EVENT_DATE) OVER (PARTITION BY DATASOURCE_NAME order by EVENT_DATE) AS min_date, 
     MAX(EVENT_DATE) OVER (PARTITION BY DATASOURCE_NAME order by EVENT_DATE) AS max_date 
     FROM WLM_ALERT_HEADER wah 
     LEFT JOIN WORKFLOW_WORKITEM ww 
     ON wah.ALERT_KEY=ww.ENTITY_KEY 
     LEFT JOIN DATA_SOURCE ds 
     ON wah.AT_DATASOURCE_ID=ds.ID 
     LEFT JOIN CLIENT_DELETION_SETTINGS rds 
     ON ds.NAME =rds.DATASOURCE_NAME 
     LEFT JOIN ENTITY_LOCKS el 
     ON el.ENTITY_ID =wah.ALERT_KEY 
     WHERE EVENT_DATE < (sysdate - rds.PERIOD) 
    UNION ALL 
    SELECT wah.ALERT_KEY              AS alert_key, 
     ds.NAME                 AS datasource_name, 
     NVL(el.ENTITY_ID,0)              AS alert_key_locked, 
     MIN(EVENT_DATE) OVER (PARTITION BY DATASOURCE_NAME order by EVENT_DATE) AS min_date, 
     MAX(EVENT_DATE) OVER (PARTITION BY DATASOURCE_NAME order by EVENT_DATE) AS max_date 
    FROM WLM_ALERT_HEADER wah 
    LEFT JOIN WORKFLOW_WORKITEM ww 
    ON wah.ALERT_KEY=ww.ENTITY_KEY 
    LEFT JOIN 
     (SELECT ID, NAME 
     FROM DATA_SOURCE 
     WHERE NAME NOT IN 
     (SELECT DATASOURCE_NAME FROM CLIENT_DELETION_SETTINGS 
     ) 
    ) ds 
    ON wah.AT_DATASOURCE_ID=ds.ID 
    LEFT JOIN CLIENT_DELETION_SETTINGS rds 
    ON ds.NAME =rds.DATASOURCE_NAME 
    LEFT JOIN ENTITY_LOCKS el 
    ON el.ENTITY_ID = wah.ALERT_KEY 
    WHERE EVENT_DATE < (sysdate - 
     (SELECT period FROM CLIENT_deletion_settings WHERE datasource_name='DEFAULT' 
    )) 
    ) 
    SELECT * 
    FROM CLIENT_DELETION_SETTINGS rbs 
    LEFT JOIN alerts al 
    ON al.datasource_name=rbs.datasource_name; 

    BEGIN 
    FOR x IN alert_id 
    LOOP 
     IF (x.alert_key_locked > 0) THEN 
     AUDIT_TRAIL('LOCKED', x.datasource_name, x.alert_key); 
     COMMIT; 
     ELSE 
     -- execute deletion for each alert_id 
     deletion_results:=DEL_WLM_ALERT(x.alert_key); 
     COMMIT; 
     END IF; 
     AUDIT_TRAIL('DELETED', x.datasource_name, deletedEntries || ' | ' || MIN(min_date) || ' -- ' || MAX(max_date)); 
    END LOOP; 
END INIT; 
END CLIENT_DELETE_PACKAGE; 
/

這些都是錯誤的:

Error(11,13): PLS-00323: subprogram or cursor 'AUDIT_TRAIL' is declared in a package specification and must be defined in the package body 
Error(17,12): PLS-00323: subprogram or cursor 'ECHO' is declared in a package specification and must be defined in the package body 
Error(234,9): PL/SQL: Statement ignored 
Error(234,33): PLS-00302: component 'DATASOURCE_NAME' must be declared 
Error(241,7): PL/SQL: Statement ignoredError(241,32): PLS-00302: component 'DATASOURCE_NAME' must be declared 
Error(241,32): PLS-00302: component 'DATASOURCE_NAME' must be declared 
+0

我只是想補充一點: 子程序或遊標 'AUDIT_TRAIL' 在包裝規範聲明,而且必須定義在包體錯誤(17,12): 它聲明,也是下一個函數...這讓我瘋狂。 在此先感謝,祝你好日子:) –

回答

1

你已經宣佈在這兩個地方的程序和功能,但參數是不同的,所以PL/SQL編譯器將它們視爲不同的東西。您在規範中聲明瞭一個過程和函數,但從未定義;以及身體私密的程序和功能 - 它們是完全獨立的。

您需要更改規格匹配:

CREATE OR REPLACE PACKAGE CLIENT_DELETE_PACKAGE 
IS 
    ... 
    PROCEDURE AUDIT_TRAIL(
     MyTYPE  IN VARCHAR2, 
     -- MyDATA  IN VARCHAR2, -- this isn't in the body version 
     MyDatasource IN VARCHAR2, 
     MyResultData IN VARCHAR2); 
    -- ECHO Check that the package is available. 
    FUNCTION ECHO(
     -- MyDATA IN VARCHAR2) -- wrong name 
     MyDatasource IN VARCHAR2) 
    RETURN VARCHAR2; 
    ... 

的PLS-00302是因爲你有你的遊標查詢重複的列名。你可以看到一個簡單的例子。如果運行如下查詢:

column dummy format a6 

select * 
from dual 
cross join dual; 

DUMMY DUMMY 
------ ------ 
X  X  

客戶端可以在結果集中顯示具有相同標頭的兩列。例如,如果您嘗試基於該查詢創建視圖,則會出現「ORA-00957:重複列名」錯誤,因爲視圖DDL中的列名必須相同。

這裏發生了類似的情況,但遊標隱式地被賦予了這兩列的唯一列別名。當連接條件ON al.datasource_name=rbs.datasource_name顯示時,相同的列名將出現在要加入的表和CTE中,因此select *將獲得相同的列名兩次。由於兩者都被隱含地混淆成獨特的東西,因此在遊標記錄類型中沒有實際稱爲datasource_name的列。

您應該將光標查詢更改爲不使用毯子select *;列出您實際需要的表格和CTE列。無論如何,這通常是可取的。

+0

好答案/解釋。此外,關於不使用'選擇*'的優秀點 – unleashed

0

您的AUDIT_TRAIL規範未遵循其主體聲明。兩個「標題」必須是相同的 - 相同的參數。包含arg名稱。

對於ECHO也是一樣。

關於DATASOURCE_NAME - 它真的是表CLIENT_DELETION_AUDIT中的一列嗎?它不是沒有?

+0

非常感謝您快速回答。 我離開只是兩個錯誤: 錯誤(235,33):PLS-00302:組件 'DATASOURCE_NAME' 必須聲明爲 錯誤(242,32):PLS-00302:組件 'DATASOURCE_NAME' 必須聲明爲 這是遞減CLIENT_DELETION_AUDIT結果: 名空類型 --------------- -------- ---------- --- ID NOT NULL NUMBER EVENT_TIME DATE TYPE VARCHAR2(200) DATASOURCE_NAME VARCHAR2(200) RESULT_DATA VARCHAR2(200) –

+0

我想說問題出現在'TYPE'列名中。 TYPE是Oracle的保留字。所以它會導致SQL狀態員出現問題。您可以嘗試使用引號:插入...(...,「TYPE」,...),或將列名更改爲例如。 ITEM_TYPE – pvanek

+0

@pvanek - TYPE是[keyword](https://docs.oracle.com/database/121/SQLRF/ap_keywd002.htm),但不是[保留字](https://docs.oracle.com /database/121/SQLRF/ap_keywd001.htm)。它可能會導致問題,但這不是問題。異常在遊標循環內被拋出。 –

0

非常感謝您的回答。以前的錯誤已經消失。 我更改了一些代碼,請檢查下面的包和錯誤。 它編譯正確,但目前我有其他問題與函數DEL_WLM_ALERT。 在遊標alert_id中,不存在NULL值,我補充說:
WHERE alert_key IS NOT NULL;

請讓我知道你是否知道什麼是錯的。

  create or replace PACKAGE CLIENT_DELETE_PACKAGE 
    IS 
     deletion_results VARCHAR2(200); 
     deletedEntries  NUMBER; 
     min_date   DATE; 
     max_date   DATE; 
     min_min_date  DATE; 
     max_max_date  DATE; 
     -- Enable/disable logging 
     Enable_Audit_Trail BOOLEAN := True; 
     -- Enable Safe Mode 
     Enable_Safe_Mode BOOLEAN := True; 
     PROCEDURE AUDIT_TRAIL(
      MyTYPE  IN VARCHAR2, 
      MyDatasource IN VARCHAR2, 
      MyResultData IN VARCHAR2); 
     -- ECHO Check that the package is available. 
     FUNCTION ECHO(
      MyDatasource2 IN VARCHAR2) 
     RETURN VARCHAR2; 
     -- JOB_REQUEST 
     FUNCTION DEL_WLM_ALERT(
      MyAlertKey IN NUMBER) 
     RETURN VARCHAR2; 
     PROCEDURE INIT; 
    END CLIENT_DELETE_PACKAGE; 
    /

和身體:

  create or replace PACKAGE BODY CLIENT_DELETE_PACKAGE 
    AS 
     -- Auditing 
     PROCEDURE AUDIT_TRAIL(
      MyTYPE  IN VARCHAR2, 
      MyDatasource IN VARCHAR2, 
      MyResultData IN VARCHAR2) 
     AS 
     --allow to keep the entry even if a roll-back occurs in the other procedure. 
     pragma autonomous_transaction; 
     BEGIN 
     /*ID: provided by sequence 
     EVENT_TIME: default value SysDate 
     ITEM_TYPE: DELETED/LOCKED ITEM 
     DATASOURCE_NAME: datasource name 
     RESULT_DATA: data link to type 
     */ 
     IF (Enable_Audit_Trail) THEN 
      INSERT INTO CLIENT_DELETION_AUDIT 
      (id, ITEM_TYPE, DATASOURCE_NAME, RESULT_DATA 
      ) 
      SELECT SEQ_AUDIT_TRAIL.NEXTVAL, MyTYPE, MyDatasource, MyResultData FROM dual; 
      COMMIT; 
     END IF; 
     END AUDIT_TRAIL; 
    -- ------------------------------------------------------------------------- 
    -- Echoing function 
    -- ------------------------------------------------------------------------- 
     FUNCTION ECHO(
      MyDatasource2 IN VARCHAR2) 
     RETURN VARCHAR2 
     AS 
     BEGIN 
     /*check if the package is available */ 
     RETURN 'i am here'; 
     END ECHO; 
    -- ------------------------------------------------------------------------- 
    -- Delete WLM Alert Data 
    -- ------------------------------------------------------------------------- 
     FUNCTION DEL_WLM_ALERT(
      MyAlertKey IN NUMBER) 
     RETURN VARCHAR2 
     AS 
     countLookUp  NUMBER; 
     countTotalEntries NUMBER; 
     deletedEntries NUMBER; 
     dataSourceToCheck VARCHAR2(200); 
     numberOfAlertLeft NUMBER; 
     alert_trx_id  NUMBER; 
     trx_group_id  NUMBER; 
     large_str_id  NUMBER; 
     BEGIN 
     countTotalEntries:=0; 
     deletedEntries :=0; 
     ---Get transaction ID for usage later--- 
     SELECT TRANSACTION_ID 
     INTO alert_trx_id 
     FROM WLM_RULE_ALERT WRA 
     JOIN WLM_ALERT_HEADER WAH 
     ON WAH.ALERT_IDENTIFIER = WRA.ALERT_IDENTIFIER 
     WHERE wah.alert_key  = MyAlertKey 
     AND rownum    =1; 
     ---Get transaction GRoup ID for usage later--- 
     SELECT TRANSACTION_GROUP_ID 
     INTO trx_group_id 
     FROM ALERTING_TRANSACTION AT 
     JOIN WLM_RULE_ALERT WRA 
     ON WRA.TRANSACTION_ID = AT.ID 
     JOIN WLM_ALERT_HEADER WAH 
     ON WAH.ALERT_IDENTIFIER = WRA.ALERT_IDENTIFIER 
     WHERE wah.alert_key  = MyAlertKey 
     AND rownum    =1; 
     ---Get LargeString ID for usage later--- 
     SELECT MIN(tg.largestring_id) 
     INTO large_str_id 
     FROM transaction_group tg 
     WHERE tg.ID = trx_group_id 
     AND rownum =1; 
     -- deleted from ALERT_MATCH_DATA -- 
     DELETE 
     FROM ALERT_MATCH_DATA AMD 
     WHERE ALERT_MATCH_ID IN 
      (SELECT AM.ID 
      FROM ALERT_MATCH AM 
      JOIN WLM_RULE_ALERT WRA 
      ON WRA.id = AM.WLM_RULE_ALERT_ID 
      JOIN WLM_ALERT_HEADER WAH 
      ON WAH.ALERT_IDENTIFIER = WRA.ALERT_IDENTIFIER 
      WHERE wah.alert_key  = MyAlertKey 
      ); 
     -- deleted from ALERT_MATCH -- 
     DELETE 
     FROM ALERT_MATCH AM 
     WHERE AM.WLM_RULE_ALERT_ID IN 
      (SELECT WRA.id 
      FROM WLM_RULE_ALERT WRA 
      JOIN WLM_ALERT_HEADER WAH 
      ON WAH.ALERT_IDENTIFIER = WRA.ALERT_IDENTIFIER 
      WHERE wah.alert_key  = MyAlertKey 
      ); 
     deletedEntries  :=deletedEntries+SQL%ROWCOUNT; 
     IF(numberOfAlertLeft =0) THEN 
      -- deleted from DATA_SOURCE_CUSTOMER -- 
      DELETE 
      FROM DATA_SOURCE_CUSTOMER DSC 
      WHERE ID  = alert_trx_id; 
      deletedEntries:=deletedEntries+SQL%ROWCOUNT; 
      -- deleted from DATA_SOURCE_SWIFT -- 
      DELETE 
      FROM DATA_SOURCE_SWIFT DSC 
      WHERE ID  = alert_trx_id; 
      deletedEntries:=deletedEntries+SQL%ROWCOUNT; 
      -- deleted from ALERTING_TRANSACTION -- 
      DELETE 
      FROM ALERTING_TRANSACTION AT 
      WHERE AT.ID    = alert_trx_id 
      OR AT.TRANSACTION_GROUP_ID = trx_group_id; 
      deletedEntries   :=deletedEntries+SQL%ROWCOUNT; 
      IF(countLookUp   = 1) THEN 
      -- deleted from TRANSACTION_GROUP -- 
      DELETE 
      FROM TRANSACTION_GROUP AT 
      WHERE AT.ID = trx_group_id; 
      deletedEntries:=deletedEntries+SQL%ROWCOUNT; 
      -- deleted from LARGESTRING_PART -- 
      DELETE 
      FROM LARGESTRING_PART 
      WHERE LARGESTRING_ID    IN large_str_id; 
      deletedEntries  :=deletedEntries+SQL%ROWCOUNT; 
      -- deleted from LARGESTRING -- 
      DELETE 
      FROM LARGESTRING 
      WHERE id  = large_str_id; 
      deletedEntries:=deletedEntries+SQL%ROWCOUNT; 
      END IF; 
     END IF; 
     countTotalEntries:=countTotalEntries+countLookUp; 
     -- deleted from WLM_RULE_ALERT -- 
     DELETE 
     FROM WLM_RULE_ALERT WRA 
     WHERE WRA.ALERT_IDENTIFIER IN 
      (SELECT WAH.ALERT_IDENTIFIER 
      FROM WLM_ALERT_HEADER WAH 
      WHERE wah.alert_key= MyAlertKey 
      ); 
     deletedEntries:=deletedEntries+SQL%ROWCOUNT; 
     -- deleted from WLM_CUSTOMER_MATCH_DETAILS -- 
     DELETE 
     FROM WLM_CUSTOMER_MATCH_DETAILS 
     WHERE ALERT_KEY= MyAlertKey; 
     deletedEntries:=deletedEntries+SQL%ROWCOUNT; 
     -- deleted from WORKFLOW_ACTION_LOG -- 
     DELETE 
     FROM WORKFLOW_ACTION_LOG 
     WHERE WORKFLOW_WORKITEM_ID IN 
      (SELECT id 
      FROM WORKFLOW_WORKITEM 
      WHERE ENTITY_KEY=TO_CHAR(MyAlertKey) 
      AND ENTITY_NAME ='WLM Alert' 
      ); 
     deletedEntries:=deletedEntries+SQL%ROWCOUNT; 
     -- deleted from WORKFLOW_WORKITEM_LINK -- 
     DELETE 
     FROM WORKFLOW_WORKITEM_LINK 
     WHERE ENTITY_KEY=MyAlertKey 
     AND ENTITY_NAME ='WLM Alert'; 
     deletedEntries :=deletedEntries+SQL%ROWCOUNT; 
     -- deleted from WORKFLOW_WORKITEM -- 
     DELETE 
     FROM WORKFLOW_WORKITEM 
     WHERE ENTITY_KEY= TO_CHAR(MyAlertKey) 
     AND entity_name ='WLM Alert'; 
     deletedEntries :=deletedEntries+SQL%ROWCOUNT; 
     -- deleted from WLM_ALERT_HEADER -- 
     DELETE 
     FROM WLM_ALERT_HEADER 
     WHERE alert_key = MyAlertKey; 
     deletedEntries :=deletedEntries+SQL%ROWCOUNT; 
     END DEL_WLM_ALERT; 
    -- initialization procedure 
     PROCEDURE INIT 
     AS 
     CURSOR alert_id 
     IS 
     WITH alerts AS 
      (SELECT wah.ALERT_KEY              AS alert_key, 
      ds.NAME                 AS datasource_name_item, 
      NVL(el.ENTITY_ID,0)              AS alert_key_locked, 
      MIN(EVENT_DATE) OVER (PARTITION BY DATASOURCE_NAME order by EVENT_DATE) AS min_date, 
      MAX(EVENT_DATE) OVER (PARTITION BY DATASOURCE_NAME order by EVENT_DATE) AS max_date 
      FROM WLM_ALERT_HEADER wah 
      LEFT JOIN WORKFLOW_WORKITEM ww 
      ON wah.ALERT_KEY=ww.ENTITY_KEY 
      LEFT JOIN DATA_SOURCE ds 
      ON wah.AT_DATASOURCE_ID=ds.ID 
      LEFT JOIN CLIENT_DELETION_SETTINGS rds 
      ON ds.NAME =rds.DATASOURCE_NAME 
      LEFT JOIN ENTITY_LOCKS el 
      ON el.ENTITY_ID =wah.ALERT_KEY 
      WHERE EVENT_DATE < (sysdate - rds.PERIOD) 
     UNION ALL 
     SELECT wah.ALERT_KEY              AS alert_key, 
      ds.NAME                 AS datasource_name_item, 
      NVL(el.ENTITY_ID,0)              AS alert_key_locked, 
      MIN(EVENT_DATE) OVER (PARTITION BY DATASOURCE_NAME order by EVENT_DATE) AS min_date, 
      MAX(EVENT_DATE) OVER (PARTITION BY DATASOURCE_NAME order by EVENT_DATE) AS max_date 
     FROM WLM_ALERT_HEADER wah 
     LEFT JOIN WORKFLOW_WORKITEM ww 
     ON wah.ALERT_KEY=ww.ENTITY_KEY 
     LEFT JOIN 
      (SELECT ID, NAME 
      FROM DATA_SOURCE 
      WHERE NAME NOT IN 
      (SELECT DATASOURCE_NAME FROM CLIENT_DELETION_SETTINGS 
      ) 
      ) ds 
     ON wah.AT_DATASOURCE_ID=ds.ID 
     LEFT JOIN CLIENT_DELETION_SETTINGS rds 
     ON ds.NAME =rds.DATASOURCE_NAME 
     LEFT JOIN ENTITY_LOCKS el 
     ON el.ENTITY_ID = wah.ALERT_KEY 
     WHERE EVENT_DATE < (sysdate - 
      (SELECT period FROM CLIENT_deletion_settings WHERE datasource_name='DEFAULT' 
      )) 
      ) 
     SELECT * 
     FROM CLIENT_DELETION_SETTINGS rbs 
     LEFT JOIN alerts al 
     ON al.datasource_name_item=rbs.datasource_name 
     WHERE alert_key IS NOT NULL; 

     BEGIN 
     FOR x IN alert_id 
     LOOP 
      IF (x.alert_key_locked > 0) THEN 
      AUDIT_TRAIL('LOCKED', x.datasource_name_item, x.alert_key); 
      COMMIT; 
      ELSE 
      -- execute deletion for each alert_id 
      deletion_results:=DEL_WLM_ALERT(x.alert_key); 
      COMMIT; 
      END IF; 
      --min_min_date := Select MIN(min_date) from dual; 
      --max_max_date := Select MIN(max_date) from dual; 
      AUDIT_TRAIL('DELETED', x.datasource_name_item, deletedEntries || ' | ' || min_date || ' -- ' || max_date); 
     END LOOP; 
    END INIT; 
    END CLIENT_DELETE_PACKAGE; 
    /

錯誤:

  Error starting at line : 1 in command - 
     exec CLIENT_DELETE_PACKAGE.INIT 
     Error report - 
     ORA-06503: PL/SQL: Function returned without value 
     ORA-06512: at "TEST_DEV.CLIENT_DELETE_PACKAGE", line 179 
     ORA-06512: at "TEST_DEV.CLIENT_DELETE_PACKAGE", line 240 
     ORA-06512: at line 1 
     06503. 00000 - "PL/SQL: Function returned without value" 
     *Cause: A call to PL/SQL function completed, but no RETURN statement was 
       executed. 
     *Action: Rewrite PL/SQL function, making sure that it always returns 
       a value of a proper type. 
+0

取消提問。 DEL_WLM_ALERT函數末尾缺少「RETURN deletionEntities」 。 祝你有美好的一天:)! –