PLS-00222:此范围内不存在名称为"INFO_TYPE"的函数

mik*_*utu 4 sql oracle plsql

我试图在两种情况下返回一个记录表:

  1. 使用功能
  2. 使用匿名块

当我使用该功能时,一切正常,但当我试图将其转换为匿名块时,我收到上述错误.以下是代码:

对于功能:

create or replace 
function get_info(p_city varchar2) return info_type_table
as
l_info info_type_table := info_type_table();
begin
    for i in (select  e.employeeid, 
                      e.lastname, 
                      c.customerid,
                      c.companyname,
                      o.orderid,
                      o.orderdate
              from  ntw_employees e
                inner join 
                    ntw_orders    o
                    on e.employeeid = o.employeeid
                inner join 
                    ntw_customers c
                    on o.customerid = c.customerid
              where e.city  = p_city)
    loop
        l_info.extend;
        l_info(l_info.count)  :=  (info_type(i.employeeid, i.lastname, i.customerid, i.companyname, i.orderid, i.orderdate));
    end loop;
    return l_info;
end;
Run Code Online (Sandbox Code Playgroud)

这是匿名块:

declare
type info_type is record 
(
    emp_no    number(3),
    lastname  varchar2(26),
    cust_no   varchar2(5),
    CO_name   varchar2(50),
    orderid   number(5),
    orderdate date
);

type info_type_table is table of info_type;

l_info info_type_table := info_type_table();
begin
    for i in (select  e.employeeid, 
                      e.lastname, 
                      c.customerid,
                      c.companyname,
                      o.orderid,
                      o.orderdate
              from  ntw_employees e
                inner join 
                    ntw_orders    o
                    on e.employeeid = o.employeeid
                inner join 
                    ntw_customers c
                    on o.customerid = c.customerid
              where e.city  = 'London')
    loop
        l_info.extend;
        l_info(l_info.count)  :=  (info_type(i.employeeid, i.lastname, i.customerid, i.companyname, i.orderid, i.orderdate));
        dbms_output.put_line('angajat = ' || i.employeeid);
    end loop;
end;  
Run Code Online (Sandbox Code Playgroud)

谁能解释一下我的匿名区块有什么问题呢?

谢谢.

Ale*_*ole 5

你的函数(推测)指的是一个被称为的对象类型info_type.您的匿名块正在使用记录类型.记录类型没有构造函数.您必须单独分配每个列,并具有记录类型变量:

...
    l_info_rec info_type;
begin
    ...
    loop
        l_info.extend;
        l_info_rec.emp_no := i.employeeid;
        l_info_rec.lastname := i.lastname;
        l_info_rec.cust_no := i.customerid;
        l_info_rec.CO_name := i.companyname;
        l_info_rec.orderid := i.orderid;
        l_info_rec.orderdate := i.orderdate;

        l_info(l_info.count)  :=  l_info_rec;
        dbms_output.put_line('angajat = ' || i.employeeid);
    end loop;
end;
Run Code Online (Sandbox Code Playgroud)

您还可以使用显式游标并使用返回的行:

declare
    cursor c is select  e.employeeid, 
                      e.lastname, 
                      c.customerid,
                      c.companyname,
                      o.orderid,
                      o.orderdate
              from  ntw_employees e
                inner join 
                    ntw_orders    o
                    on e.employeeid = o.employeeid
                inner join 
                    ntw_customers c
                    on o.customerid = c.customerid
              where e.city  = 'London';

    type info_type_table is table of c%rowtype;

    l_info info_type_table := info_type_table();
begin
    for r in c
    loop
        l_info.extend;
        l_info(l_info.count)  :=  r;
        dbms_output.put_line('angajat = ' || r.employeeid);
    end loop;
end;
/
Run Code Online (Sandbox Code Playgroud)

或者甚至bulk collect直接进入你的表类型:

declare
    cursor c is select  e.employeeid, 
              ...
              where e.city  = 'London';

    type info_type_table is table of c%rowtype;

    l_info info_type_table;
begin
    open c;
    fetch c bulk collect into l_info;
    close c;

    for i in 1..l_info.count loop
        dbms_output.put_line('angajat = ' || l_info(i).employeeid);
    end loop;
end;
/
Run Code Online (Sandbox Code Playgroud)

...使用循环只显示该表中的值.