[英]PLS-00382 when using a UDT in PL/SQL function
I am trying to create a package on Oracle. 我正在尝试在Oracle上创建一个程序包。 This package holds two functions (i do need to create two function, I cannot unite them) but I have got this error on lines: 该程序包包含两个函数(我确实需要创建两个函数,但我无法将它们结合在一起),但是在行上却遇到了此错误:
mD(1) := rel_mahalanobis_distance_aux_3( A1,
B1,B2,B3);
x_minus_y(2) := ABS(A2 - B2);
mD(2) := rel_mahalanobis_distance_aux_3( A2,
B1,B2,B3);
x_minus_y(3) := ABS(A3 - B3);
mD(3) := rel_mahalanobis_distance_aux_3( A3,
B1,B2,B3);
The error: 错误:
PLS-00382: expression is of wrong type PLS-00382:表达式的类型错误
Errors on lines: 线路错误:
mD(1) := rel_mahalanobis_distance_aux_3( A1,
B1,B2,B3);
x_minus_y(2) := ABS(A2 - B2);
mD(2) := rel_mahalanobis_distance_aux_3( A2,
B1,B2,B3);
x_minus_y(3) := ABS(A3 - B3);
mD(3) := rel_mahalanobis_distance_aux_3( A3,
B1,B2,B3);
The package code 套餐代码
CREATE PACKAGE mahalanobis_distance_package AS
max_d NUMBER;
TYPE tbNumber IS TABLE OF NUMBER INDEX BY PLS_INTEGER;
function rel_mahalanobis_distance_aux_3( A NUMBER,B1 NUMBER,B2 NUMBER,B3 NUMBER)
RETURN tbNumber;function rel_mahalanobis_distance_3(
A1 NUMBER, A2 NUMBER, A3 NUMBER,
B1 NUMBER,B2 NUMBER,B3 NUMBER) RETURN NUMBER ;
END mahalanobis_distance_package;
/
CREATE OR REPLACE PACKAGE BODY mahalanobis_distance_package AS
function rel_mahalanobis_distance_aux_3( A NUMBER,
B1 NUMBER,B2 NUMBER,B3 NUMBER) RETURN tbNumber IS
tbNumber_obj tbNumber;
BEGIN
max_d := 0;
FOR j IN 1..3 LOOP
tbNumber_obj(j) := 0;
END LOOP;
tbNumber_obj(1) := ABS(A - B1);
IF tbNumber_obj(1) > max_d THEN
max_d := tbNumber_obj(1);
END IF;
tbNumber_obj(2) := ABS(A - B2);
IF tbNumber_obj(2) > max_d THEN
max_d := tbNumber_obj(2);
END IF;
tbNumber_obj(3) := ABS(A - B3);
IF tbNumber_obj(3) > max_d THEN
max_d := tbNumber_obj(3);
END IF;
return tbNumber_obj;
END rel_mahalanobis_distance_aux_3;
function rel_mahalanobis_distance_3(
A1 NUMBER, A2 NUMBER, A3 NUMBER,
B1 NUMBER,B2 NUMBER,B3 NUMBER) RETURN NUMBER IS
total NUMBER := 0;
aux NUMBER;
TYPE tbNumber IS TABLE OF NUMBER INDEX BY PLS_INTEGER;
TYPE tbNumberMatrix IS TABLE OF tbNumber INDEX BY PLS_INTEGER;
mA tbNumberMatrix;
mD tbNumberMatrix;
x_minus_y INTEGER_ARRAY := INTEGER_ARRAY();
BEGIN
x_minus_y.extend(3) ;
FOR i IN 1..3 LOOP
FOR j IN 1..3 LOOP
mA(i)(j) := 0;
mD(i)(j) := 0;
END LOOP;
END LOOP;
x_minus_y(1) := ABS(A1 - B1);
mD(1) := rel_mahalanobis_distance_aux_3( A1,
B1,B2,B3);
x_minus_y(2) := ABS(A2 - B2);
mD(2) := rel_mahalanobis_distance_aux_3( A2,
B1,B2,B3);
x_minus_y(3) := ABS(A3 - B3);
mD(3) := rel_mahalanobis_distance_aux_3( A3,
B1,B2,B3);
FOR i IN 1..3 LOOP
FOR j IN 1..3 LOOP
mA(i)(j) := 1 - (mD(i)(j)/max_d);
END LOOP;
END LOOP;
FOR i IN 1..3 LOOP
aux := 0;
FOR j IN 1..3 LOOP
aux := aux + x_minus_y(j) * mA(j)(i);
END LOOP;
total := total + x_minus_y(i)*aux;
END LOOP;
RETURN POWER(total,0.5);
END rel_mahalanobis_distance_3;
END mahalanobis_distance_package;
/
The datatype seems to be right. 数据类型似乎正确。 What can I do to make it work? 我该怎么做才能使其正常工作?
Thanks in advance! 提前致谢!
The problem is with this line inside function rel_mahalanobis_distance_3
问题是函数rel_mahalanobis_distance_3
这一行
TYPE tbNumber IS TABLE OF NUMBER INDEX BY PLS_INTEGER;
You have already declared tbNumber
in package sepcification ( global scope ) and you are re-declaring it, which makes it incompatible while doing the assignment 您已经在包tbNumber
(全局范围)中声明了tbNumber
,然后重新声明了它,这使它在分配时不兼容
Remove that line, your error message should disappear. 删除该行,您的错误消息应该消失。
Also, I don't see the declaration for type INTEGER_ARRAY
in your code, hope you are using an available TYPE
or declaring it somewhere. 另外,我在代码INTEGER_ARRAY
类型的声明,希望您使用的是可用的TYPE
或在某处声明它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.