我有这个让我困惑的问题。
我知道为了使用,让我们说一个关联数组类型作为过程参数或作为函数的返回类型,你需要创建一个包;因为关联数组只能在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:在声明之前非法使用类型
我不承诺我做错了什么,标题是'我的过程和函数的类型与实现相同:相同的参数,相同的返回类型......我做错了什么?
感谢您的时间。
答案 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会抱怨,因为包中的函数声明与正文中的定义不匹配(它们使用不同的类型 - 即使它们的名字相同)。