2016-11-14 1 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; 

Возможно, вы имели в виду установить VCOLLECTED и VUNCOLLECTED в этом ELSE. Если вы это сделали, вам не нужно будет инициализировать 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 из двойного) iv; ' – Giorgos

+0

@Giorgos - вызов в порядке. С изменениями, которые я сделал, и никаких реальных данных, я получаю -1999 и 0. Возможно, вы можете сделать это без PL/SQL или, конечно, с более простой логикой. –

+0

У вас есть право -1999 проблема, и я пытаюсь найти почему. – Giorgos

Смежные вопросы