Pedro
Pedro

Reputation: 81

PLS-00323PLS-00323 and PLS-00371 when creating a package in Oracle

I am trying to create a package in Oracle, but i am getting the following errors:

PLS-00323
PLS-00371

The package code is:

CREATE     OR REPLACE 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;

END mahalanobis_distance_package;
/

CREATE     OR REPLACE PACKAGE BODY 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 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;

END mahalanobis_distance_package;
/

Why am I getting these errors?

Thanks in advance!

Upvotes: 0

Views: 1258

Answers (2)

thatjeffsmith
thatjeffsmith

Reputation: 22412

You already declared the package variable and the TYPE tbnumber in the package spec.

Remove those declarations from the body, and it will compile just fine.

Although you'll get compiler warnings (if enabled)

Warning(2,11): PLW-06026: package specification exposes global variable

Here's your code

create or replace 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;

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;

END mahalanobis_distance_package;
/

Upvotes: 0

Lukasz Szozda
Lukasz Szozda

Reputation: 175556

There is no need for package variable/type declaration inside package body:

CREATE OR REPLACE PACKAGE BODY 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 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;
END mahalanobis_distance_package;
/

DBFiddle Demo

Upvotes: 1

Related Questions