简体   繁体   English

在PL / SQL函数中使用UDT时的PLS-00382

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM