包规范和包 body 问题,声明前非法使用类型

Package specification and package body issue , illegal use of type before declaration

这个问题让我很困惑。

我知道为了使用,假设关联数组类型作为过程参数或函数的 return 类型,您需要创建一个包;因为关联数组只能在 PL/SQL 块中使用。

我也这样做了,这是我的包架构:

CREATE OR REPLACE PACKAGE some_package AS

  TYPE vector IS TABLE OF INTEGER INDEX BY PLS_INTEGER;

  TYPE MATRIX IS TABLE OF vector INDEX BY PLS_INTEGER;

  PROCEDURE printMatrix (p_matrix IN MATRIX);

  FUNCTION BUILD_MATRIX(p_row_count IN INTEGER , p_column_count IN INTEGER) RETURN MATRIX;

END some_package;
/

我的body包裹:

CREATE OR REPLACE PACKAGE BODY some_package AS

    PROCEDURE printMatrix (p_matrix IN MATRIX)
     IS

     BEGIN

         FOR i in p_matrix.first..p_matrix.last LOOP
            FOR j in p_matrix(i).first..p_matrix(i).last LOOP
               DBMS_OUTPUT.PUT_LINE(p_matrix(i)(j));
            END LOOP;
               DBMS_OUTPUT.PUT_LINE(CHR(10));
         END LOOP;

         DBMS_OUTPUT.PUT_LINE(CHR(10));

     END printMatrix;

  FUNCTION BUILD_MATRIX(p_row_count IN INTEGER , p_column_count IN INTEGER)
     RETURN MATRIX IS

     TYPE vector IS TABLE OF INTEGER INDEX BY PLS_INTEGER;
     TYPE MATRIX IS TABLE OF vector INDEX BY PLS_INTEGER;

     v_my_matrix MATRIX;

     v_my_row vector;

     v_contor_row INTEGER;

     v_contor_column INTEGER;

     BEGIN

     FOR v_contor_row IN 0..p_row_count LOOP
         FOR v_contor_column IN 0..p_column_count LOOP
           v_my_row(v_contor_column) :=  0 + MOD(ABS(DBMS_RANDOM.RANDOM),30);
         END LOOP;

         v_my_matrix(v_contor_row) := v_my_row;

     END LOOP;

     return v_my_matrix;

     END;

END some_package;
/

但是由于某些未知原因,我收到了这些错误:

Error(9,12): PLS-00323: subprogram or cursor 'BUILD_MATRIX' is declared in a package specification and must be defined in the package body

Error(19,3): PL/SQL: Item ignored

Error(20,13): PLS-00498: illegal use of a type before its declaration

我不明白我做错了什么,我的过程和函数的 headers' 类型与实现相同:相同的参数,相同的 return 类型...我是什么我做错了吗?

感谢您的宝贵时间。

只需在函数体中注释这些声明:

  FUNCTION BUILD_MATRIX(p_row_count IN INTEGER , p_column_count IN INTEGER)
     RETURN MATRIX IS

     -- TYPE vector IS TABLE OF INTEGER INDEX BY PLS_INTEGER;
     -- TYPE MATRIX IS TABLE OF vector INDEX BY PLS_INTEGER;

     v_my_matrix MATRIX;

包中已经声明,函数中不需要"rededefine"。
如果您在这个地方将它们声明为局部的,并且与主体中的名称相同,那么它们会隐藏包中声明的类型,Oracle 会抱怨,因为包中的函数声明与主体中的定义不匹配(他们使用不同的类型 - 即使它们的名称相同)。