Oracle 函数中使用object table_type

本文深入探讨了在Oracle数据库中如何利用PL/SQL过程语言创建游标和集合来高效处理大量数据记录的方法。通过具体的SQL函数示例,展示了如何使用游标获取部门员工信息,并进一步介绍了如何将这些数据存储在集合中进行更灵活的操作。这不仅提高了数据处理的效率,还增强了代码的可读性和维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值