【问题标题】:Package specification and package body issue , illegal use of type before declaration包规范和包体问题,声明前非法使用类型
【发布时间】:2023-04-02 11:45:02
【问题描述】:

这个问题让我很困惑。

我知道为了使用,假设关联数组类型作为过程参数或作为函数的返回类型,您需要创建一个包;因为关联数组只能在 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:在声明之前非法使用类型

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

感谢您的宝贵时间。

【问题讨论】:

    标签: sql oracle plsql oracle-sqldeveloper


    【解决方案1】:

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

      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 会抱怨,因为包中的函数声明与主体中的定义不匹配(它们使用不同的类型 - 即使它们的名称相同)。

    【讨论】:

      猜你喜欢
      • 2011-08-25
      • 1970-01-01
      • 2022-01-21
      • 1970-01-01
      • 1970-01-01
      • 2011-10-22
      • 2012-11-29
      • 1970-01-01
      • 2012-12-04
      相关资源
      最近更新 更多