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

时间:2016-03-19 16:57:16

标签: sql oracle plsql oracle-sqldeveloper

我有这个让我困惑的问题。

我知道为了使用,让我们说一个关联数组类型作为过程参数或作为函数的返回类型,你需要创建一个包;因为关联数组只能在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;
/

我的身体包裹:

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;
/

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

  

错误(9,12):PLS-00323:子程序或光标' BUILD_MATRIX'是   在包规范中声明,必须在包中定义   体

     

错误(19,3):PL / SQL:项目被忽略

     

错误(20,13):PLS-00498:在声明之前非法使用类型

我不承诺我做错了什么,标题是'我的过程和函数的类型与实现相同:相同的参数,相同的返回类型......我做错了什么?

感谢您的时间。

1 个答案:

答案 0 :(得分:3)

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

  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;

在包装中声明,您不需要在功能中“重新定义”它们 如果你在这个地方声明它们与本体中的名称相同,那么它们会隐藏包中声明的类型,并且Oracle会抱怨,因为包中的函数声明与正文中的定义不匹配(它们使用不同的类型 - 即使它们的名字相同)。