从返回对象类型

时间:2016-11-14 14:21:31

标签: sql oracle plsql

我有以下函数GET_UN_COLLECTED_4LD,它返回类型ld_data_type

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以及导致错误的问题在哪里?

2 个答案:

答案 0 :(得分:2)

如错误所示,您尚未初始化对象变量:

ui->cbWaehrung1->setModel(0);

但你的逻辑有点混乱;在你的案件结束时你做:

...
   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; 中设置VCOLLECTEDVUNCOLLECTED。如果你这样做那么你就不需要初始化ELSE,因为剩下的第一个引用会创建它;您可以这样做:

OUT_VAR

而不是从双重选择;或者你根本就没有局部变量而只是这样做:

  OUT_VAR := LD_DATA_TYPE (VCOLLECTED, VUNCOLLECTED);

答案 1 :(得分:0)

首先,您需要初始化对象类型OUT_VAR,然后才能设置其属性,如下所示:

OUT_VAR:= LD_DATA_TYPE(0,0); 

查看详情here