Oracle 函数中使用object table_type

create or replace function get_dept_emps(p_deptno in number)
 return sys_refcursor 
 is
     v_rc sys_refcursor;
begin
  open v_rc for 'select empno, ename, mgr, sal from emp where deptno = :deptno' using p_deptno;
  return v_rc;
end;
/

SCOTT@PROD>exec :rc :=get_dept_emps(10);

PL/SQL procedure successfully completed.

SCOTT@PROD>print rc;

     EMPNO ENAME             MGR        SAL
---------- ---------- ---------- ----------
      7782 CLARK            7839       2450
      7839 KING                        5000
      7934 MILLER           7782       1300




SCOTT@PROD>select * from table(get_dept_emps(10));
select * from table(get_dept_emps(10))
              *
ERROR at line 1:
ORA-22905: cannot access rows from a non-nested table item




create or replace type emptype as object(empno number,
                                         ename varchar2(10),
                                         mgr   number,
                                         sal   number
                                        );
/


create or replace type t_emptype as table of emptype;
/


create or replace function populate_emps(deptno in number := null) 
return t_emptype 
is
  v_emptype t_emptype := t_emptype();  -- Declare a local table structure and initialize it
  v_cnt     number := 0;
  v_rc      sys_refcursor;
  v_empno   number;
  v_ename   varchar2(10);
  v_mgr     number;
  v_sal     number;
begin
  v_rc := get_dept_emps(deptno);
  loop
    fetch v_rc into v_empno, v_ename, v_mgr, v_sal;
    exit when v_rc%NOTFOUND;
    v_emptype.extend;
    v_cnt := v_cnt + 1;
    v_emptype(v_cnt) := emptype(v_empno, v_ename, v_mgr, v_sal);
  end loop;
  close v_rc;
  return v_emptype;
end;
/


SCOTT@PROD>select * from table(populate_emps(10));

     EMPNO ENAME             MGR        SAL
---------- ---------- ---------- ----------
      7782 CLARK            7839       2450
      7839 KING                        5000
      7934 MILLER           7782       1300

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值