Oracle PLS-00382:通过执行函数并尝试将returntype放入变量,表达式的类型错误

Oracle PLS-00382:通过执行函数并尝试将returntype放入变量,表达式的类型错误,oracle,plsql,recordtype,Oracle,Plsql,Recordtype,当我执行这个函数时,我发现表达式的类型是错误的,但我不知道为什么。我在函数中使用的返回类型与我在函数执行后尝试将其放入的返回类型相同 下面是记录和表格类型 TYPE department_id_table_type IS TABLE of DEPARTMENTS.DEPARTMENT_ID%TYPE; TYPE managers_rec_type IS RECORD ( employee_id employees.employee_id%TYPE, first_name empl

当我执行这个函数时,我发现表达式的类型是错误的,但我不知道为什么。我在函数中使用的返回类型与我在函数执行后尝试将其放入的返回类型相同

下面是记录和表格类型

TYPE department_id_table_type IS TABLE of DEPARTMENTS.DEPARTMENT_ID%TYPE;

TYPE managers_rec_type IS RECORD (
  employee_id   employees.employee_id%TYPE, 
  first_name employees.first_name%TYPE,
  last_name employees.last_name%TYPE,
  department_id_table_type DEPARTMENTS.DEPARTMENT_ID%TYPE);

TYPE managers_table_type IS TABLE OF managers_rec_type INDEX BY BINARY_INTEGER;
下面是函数

 FUNCTION managers_multiple_departments RETURN managers_table_type 
IS
cursor department_curs is SELECT DEPARTMENT_NAME,MANAGER_ID,DEPARTMENT_ID FROM DEPARTMENTS WHERE MANAGER_ID IN (SELECT MANAGER_ID FROM DEPARTMENTS dep GROUP BY (MANAGER_ID) HAVING COUNT(MANAGER_ID) >1);


    department_name departments.department_name%TYPE;
    department_id departments.department_id%TYPE;
    managerid departments.manager_id%TYPE;
    employeeid employees.employee_id%TYPE;
    firstname employees.first_name%TYPE;
    lastname employees.last_name%TYPE;
    count NUMBER;       
    rec managers_rec_type;            
    managers_rec managers_rec_type;
    teller NUMBER := 1;
    managers_table managers_table_type;         

BEGIN           
    OPEN department_curs;
    LOOP                 
        FETCH department_curs INTO department_name, managerid,department_id;
        EXIT WHEN department_curs%NOTFOUND;
        Select EMPLOYEE_ID,FIRST_NAME,LAST_NAME,department_id into managers_rec from EMPLOYEES where MANAGER_ID = managerid; 
        managers_table(managers_rec.employee_id) := managers_rec;
        FOR i IN managers_table.FIRST .. managers_table.LAST LOOP
            IF managers_table.EXISTS(i) THEN
                DBMS_OUTPUT.PUT_LINE(managers_table(i).first_name);
            END IF;

        END LOOP;

        IF teller = 1 THEN
            DBMS_OUTPUT.PUT_LINE(managers_rec.first_name ||' '|| managers_rec.last_name || ' Lijst van departments:');
            teller := 2;
        END IF;
        DBMS_OUTPUT.PUT_LINE(department_id ||' '|| department_name);


    END LOOP;
        FOR i IN managers_table.FIRST .. managers_table.LAST LOOP
            IF managers_table.EXISTS(i) THEN
                DBMS_OUTPUT.PUT_LINE(managers_table(i).first_name);
                DBMS_OUTPUT.PUT_LINE('test');
            END IF;

        END LOOP; 
    return managers_table;
END managers_multiple_departments;`enter code here`
下面是我执行函数的地方,但这是它给我错误的地方:managers:=hr\u package.managers\u多个部门

DECLARE
    TYPE managers_rec_type IS RECORD (
      employee_id   employees.employee_id%TYPE, 
      first_name employees.first_name%TYPE,
      last_name employees.last_name%TYPE,
      department_id_table_type DEPARTMENTS.DEPARTMENT_ID%TYPE);

    TYPE managers_table_type IS TABLE OF managers_rec_type INDEX BY BINARY_INTEGER;    
    man_rec managers_rec_type; 
    managers managers_table_type;
    twee NUMBER;

BEGIN

    managers := hr_package.managers_multiple_departments;
END;

您正在同一个包中声明记录类型、集合/表类型和函数

调用函数时,必须使用该包中的相同类型

我在函数中使用的返回类型与我在函数执行后尝试将其放入的返回类型相同

但事实并非如此。它具有相同的结构—字段和数据类型—但就Oracle而言并不相同。Oracle需要知道使用的是完全相同的类型,部分原因是为了跟踪对象之间的依赖关系

匿名块需要引用包类型,而不是声明自己的-类似但冲突的-类型:

作为一个奖励,它涉及更少的键入,这意味着您不必管理重复的类型

不过,这也意味着类型声明必须在包规范中—当然,对于任何想要公开可见的东西都是如此。

看看这个链接—要使代码正常工作,需要对代码进行一些更改。特别是您需要返回的记录类型
DECLARE
    managers hr_package.managers_table_type;
BEGIN
    managers := hr_package.managers_multiple_departments;
END;