包规范和包 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 会抱怨,因为包中的函数声明与主体中的定义不匹配(他们使用不同的类型 - 即使它们的名称相同)。
这个问题让我很困惑。
我知道为了使用,假设关联数组类型作为过程参数或函数的 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 会抱怨,因为包中的函数声明与主体中的定义不匹配(他们使用不同的类型 - 即使它们的名称相同)。