建了一个函数,需传进一个自定义类型的参数。编译通过后,执行报错。
  函数如下:
  CREATE OR REPLACE FUNCTION TESTREF
  ( 
   i_ref1  IN VARCHAR2,
   i_ref2  IN INT_COLL,--自定义类型,如下
   o_ref3  OUT VARCHAR2
  ) 
   RETURN PLS_INTEGER IS
   BEGIN
    o_ref3:='OK';
    RETURN 0;
  END;
  /
  自定义类型:
  CREATE OR REPLACE TYPE INT_COLL AS TABLE OF INTEGER;  程序执行后,会出ora-06531错误,似乎是不能参照没被初始化的集合。
  问题到底在哪里?难道自定义类型还要初始化?请高手指点。
  谢谢。

解决方案 »

  1.   

    问题,你这个过程是一个单独的过程,还是在包里面定义的?如果按照你定义类型的方法,你必须在包里定义这个函数如果你想定义一个单独的函数,并且想使用这种自定义的类型,那你必须把这个类型定义在一个包中为什么?因为你定义的是一个table,也就是oracle的数组,这也就是为什么报ora-06531,没有给数组初始化的原因注:
    1.oracle定义全局类型(对象)的语法
    CREATE OR REPLACE TYPE TEST.NEWOBJECT1 AS OBJECT
    (
      NEWATTRIB1 INTEGER
    )
    2.oracle定义全局数组的的语法
    CREATE OR REPLACE TYPE TEST.NEWCOLLECTION2 AS VARRAY (2) OF  VARCHAR2(2)例:
    CREATE OR REPLACE PACKAGE pkg_TEST
    AS
       TYPE int_coll IS TABLE OF INTEGER
          INDEX BY BINARY_INTEGER;
    END TEST;
    /
    CREATE OR REPLACE PACKAGE BODY pkg_test
    AS
       FUNCTION testref (i_ref1 IN VARCHAR2, i_ref2 IN int_coll,                     --自定义类型,如下
                                                                o_ref3 OUT VARCHAR2)
          RETURN PLS_INTEGER
       IS
       BEGIN
          o_ref3 := 'OK';
          RETURN 0;
       END;
    END pkg_test;
    /
      

  2.   

    非常谢谢olony(PCpig),我试一下。我是建立在包里发现不行,所以单独取出来做成一个函数再测的。