利用函数返回oracle对象表的三种方法

所属分类: 数据库 / oracle 阅读数: 314
收藏 0 赞 0 分享

因为要返回表对象,无论后续用什么方法返回,都先要声明全局type;并且,字段变量类型要为object,不能为record:

create or replace type t_test as object(
 EMPNO  NUMBER(4),
 ENAME  VARCHAR2(10),
 JOB   VARCHAR2(9),
 SAL   NUMBER(7,2)
);

create or replace type t_test_table as table of t_test;

至于返回表对象的方法,目前发现三种:
 1、用数组

create or replace function f_test_array(v_deptno in number default null)
return t_test_table
is 
v_test t_test_table := t_test_table();
cursor cur is select empno, ename, job, sal from emp where deptno = v_deptno;
begin
for c in cur loop
v_test.extend();
v_test(v_test.count) := t_test(c.empno, c.ename, c.job, c.sal);
end loop;
return v_test;
end;

2、用pipe

create or replace function f_test_pipe(v_deptno in number default null)
return t_test_table PIPELINED 
is
v_test t_test_table := t_test_table();
cursor cur is select empno, ename, job, sal from emp where deptno = v_deptno;
begin 
for c in cur loop
pipe row(t_test(c.empno, c.ename, c.job, c.sal)); 
end loop; 
return; 
end;

这两种都需要用游标遍历,得到表对象,性能上估计第2种较高。 

3、用collect(不需要游标,代码相对简单)

create or replace function f_test_collect(v_deptno in number default null)
return t_test_table
is 
v_test t_test_table := t_test_table();
begin
select t_test(empno, ename, job, sal) bulk collect into v_test from emp where deptno = v_deptno;
return v_test;
end;

需要注意的是,select into之前要先把输出结果对象化:
t_test(empno, ename, job, sal)
否则会报错: 
ORA-00947: 没有足够的值(object多字段)
ORA-00932: 数据类型不一致(object单一字段)
而如果直接在plsql块中declare类型的话,是不需要先对象化输出结果的。
三种函数定义方式可以测试输出一样的结果:

select * from table(f_test_pipe(30));
select * from table(f_test_array(30));
select * from table(f_test_collect(30));

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

更多精彩内容其他人还在看

oracle存储过程中return和exit区别概述及测试

至于return和exit在oracle存储过程中的应用,有些新手朋友们还是比较容易混淆的,本文将针对这两个关键字进行详细对比下,感兴趣的你可以参考下,希望可以帮助到你
收藏 0 赞 0 分享

oracle查看当前日期是第几个星期的方法

oracle查看当前日期是第几个星期方法的代码段,需要的朋友可以参考一下
收藏 0 赞 0 分享

oracle删除已存在的表的实例

查询系统表,判断表是否存在,存在则直接删除
收藏 0 赞 0 分享

oracle中文乱码解决的办法

oracle中文乱码解决的办法,需要的朋友可以参考一下
收藏 0 赞 0 分享

Oracle中在pl/sql developer修改表的2种方法

Oracle中在pl/sql developer修改表的2种方法,需要的朋友可以参考一下
收藏 0 赞 0 分享

oracle 创建表空间步骤代码

oracle 创建表空间步骤代码,需要的朋友可以参考一下
收藏 0 赞 0 分享

Oracle 查看表空间的大小及使用情况sql语句

表空间使用情况包括:查看表空间的名称及大小/查看表空间物理文件的名称及大小/查看回滚段名称及大小等等感兴趣的你可以参考下本文
收藏 0 赞 0 分享

Oracle Form中COMMIT的概述及使用技巧

针对form上面的数据变动提交到后台数据库,同时数据库提交数据,接下来将详细介绍下Form中COMMIT的使用,感兴趣的你可以参考下本文
收藏 0 赞 0 分享

Oracle跨数据库查询并插入实现原理及代码

需要从一个数据库中的表GIS_WEICHAI_DATA_1S中的数据导入到另个一数据库的表GIS_WEICHAI_DATA_1S中,接下来为你讲解跨数据库查询并插入需要的朋友可以参考下
收藏 0 赞 0 分享

Oracle 存储过程发送邮件实例学习

接下来将介绍下如何使用存储过程发送邮件这一案例实现,感兴趣的你可以参考下本文或许对你有所帮助
收藏 0 赞 0 分享
查看更多