2016-11-14 90 views
1

我有以下功能GET_UN_COLLECTED_4LD返回類型ld_data_type錯誤ORA-06530,返回的對象類型

CREATE OR REPLACE TYPE ld_data_type AS OBJECT(collected NUMBER, uncollected NUMBER); 
/

CREATE OR REPLACE FUNCTION GET_UN_COLLECTED_4LD (VAPPOINTOFCAID NUMBER, 
               VPREVLIQUIDATE NUMBER, 
               VCURRLIQUIDATE NUMBER, 
               VNEXTLIQUIDATE NUMBER, 
               YEPT    NUMBER) 
    RETURN LD_DATA_TYPE 
AS 
    OUT_VAR  LD_DATA_TYPE; 
    VNETV23  NUMBER; 
    VNETV24  NUMBER; 
    VCURR23  NUMBER; 
    VCURR24  NUMBER; 
    VCOLLECTED  NUMBER; 
    VUNCOLLECTED NUMBER; 
BEGIN 
    SELECT SUM (NETX) - SUM (NETP) 
    INTO VNETV23 
    FROM VIEW_CUSTOMER_TRN4INVS4LD 
    WHERE APPOINTOFCAID = VAPPOINTOFCAID AND VAT = ABS (1.23); 

    SELECT SUM (NETX) - SUM (NETP) 
    INTO VNETV24 
    FROM VIEW_CUSTOMER_TRN4INVS4LD 
    WHERE APPOINTOFCAID = VAPPOINTOFCAID AND VAT = ABS (1.24); 

    VCOLLECTED := 0; 
    VUNCOLLECTED := 0; 

    CASE 
     WHEN YEPT = 0 
     THEN 
     VCURR24 := VCURRLIQUIDATE - VNETV24; 

     CASE 
      WHEN VCURR24 > 0 
      THEN 
       VCOLLECTED := VNETV24 * 1.24; 
       VCURR23 := VCURRLIQUIDATE - VNETV23; 

       CASE 
        WHEN VCURR23 > 0 
        THEN 
        VCOLLECTED := -999; 
        ELSE 
        VCOLLECTED := 
         VCOLLECTED + ((VCURRLIQUIDATE - VCURR24) * 1.23); 
       END CASE; 
      ELSE 
       VCOLLECTED := -1999; 
     END CASE; 
     ELSE 
     OUT_VAR.COLLECTED := -888; 
     OUT_VAR.UNCOLLECTED := -889; 
    END CASE; 

    SELECT VCOLLECTED, VUNCOLLECTED 
    INTO OUT_VAR.COLLECTED, OUT_VAR.UNCOLLECTED 
    FROM DUAL; 

     /* 
OPEN buffer_cur; 
FETCH buffer_cur INTO out_var.val1, out_var.val2; 

CLOSE buffer_cur; */ 


    RETURN OUT_VAR; 
END GET_UN_COLLECTED_4LD; 

當我打電話像

select GET_UN_COLLECTED_4LD(171231, 42240, 31680, 0, 0) from dual;` 

功能我得到一個錯誤:

Execution (50: 8): ORA-06530: Reference to uninitialized composite 
ORA-06512: at "C##SOLSA.GET_UN_COLLECTED_4LD", line 56 

我使用Oracle 12c標準版。

我該如何調用函數GET_UN_COLLECTED_4LD以及導致錯誤的問題在哪裏?

回答

0

首先,你需要初始化對象類型OUT_VAR之前,你可以設置其屬性如下:

OUT_VAR:= LD_DATA_TYPE(0,0); 

看到細節here

2

由於錯誤說,你還沒有初始化對象變量:

... 
    RETURN LD_DATA_TYPE 
AS 
    OUT_VAR  LD_DATA_TYPE := new LD_DATA_TYPE(null, null); 
... 

你的邏輯是輕度的意識模糊,雖然;在您的案件結束時,你做的事:

ELSE 
    OUT_VAR.COLLECTED := -888; 
    OUT_VAR.UNCOLLECTED := -889; 

但隨後覆蓋值隨即:

SELECT VCOLLECTED, VUNCOLLECTED 
    INTO OUT_VAR.COLLECTED, OUT_VAR.UNCOLLECTED 
    FROM DUAL; 

也許你只是設定VCOLLECTEDVUNCOLLECTEDELSE。如果你這樣做,那麼你不需要初始化OUT_VAR,因爲剩下的第一個參考將創建它;你可以這樣做:

OUT_VAR := LD_DATA_TYPE (VCOLLECTED, VUNCOLLECTED); 

而不是從雙重選擇;或者你可以不必在所有的局部變量,只是做:

... 
    ELSE 
    VCOLLECTED := -888; 
    VUNCOLLECTED := -889; 
    END CASE; 

    RETURN LD_DATA_TYPE (VCOLLECTED, VUNCOLLECTED); 
END GET_UN_COLLECTED_4LD; 
+0

的函數調用是'選擇 iv.ld_data_type.collected, iv.ld_data_type.uncollected 從 (選擇 GET_UN_COLLECTED_4LD(171231,42240 ,31680,0,0)作爲ld_data_type from dual)iv;' – Giorgos

+0

@Giorgos - 通話正常。隨着我做出的改變,並沒有真正的數據,我得到了-1999和0.你可能沒有任何PL/SQL,或者更簡單的邏輯。 –

+0

你有正確的-1999是問題,我試圖找到原因。 – Giorgos